电商实时交易系统 Java 面试实战:Spring Boot + Kafka + Redis + Resilience4j + Prometheus/Grafana
场景:互联网大厂电商交易与营销中台面试
面试官:今天我们围绕“电商实时交易系统”来聊,场景会从订单、库存、优惠、风控、监控一路展开。你先别紧张,先自我介绍一下。
燕双非:大家好,我是燕双非,擅长把“能跑”写成“能上线”,把“上线了”写成“稳定了”。
第一轮:订单下单链路
1)面试官:你用 Spring Boot 设计过高并发下单接口吗?从控制器到服务层,你会怎么组织代码?
燕双非:会一点。一般就是 Controller 接收参数,Service 里做校验、扣库存、创建订单,最后返回结果。Spring Boot 比较方便,配置少,接口也好写。
面试官:基础思路没问题,说明你至少知道分层。那如果订单接口要支持幂等,你会怎么做?
燕双非:嗯……我可能会先加个唯一订单号,再查一下数据库有没有重复,差不多就行吧。
面试官:方向对,但还不够完整,后面我们再展开。
2)面试官:下单后要发消息给库存系统,你会选 Kafka 还是 RabbitMQ?为什么?
燕双非:Kafka 听起来更像大厂标配,吞吐高,适合发订单事件。RabbitMQ 我印象里比较适合业务路由和复杂消息模式。
面试官:回答得不错,至少能区分吞吐和路由场景。那如果消息重复消费了,你怎么处理?
燕双非:……那就消费者里加个去重表?或者 Redis set 判断一下?
面试官:可以,思路上接近生产做法,但要考虑去重窗口和一致性。
3)面试官:库存扣减你会放在 Redis 里做预扣,还是直接落数据库?
燕双非:如果是秒杀或者高峰场景,先 Redis 预扣比较快,再异步落库;如果普通交易,数据库事务也可以。
面试官:很好,能结合业务场景判断,不是所有问题都一刀切。
4)面试官:下单接口如何保证短时间大量请求下系统不被打垮?
燕双非:可以做限流、排队、缓存、异步化,还可以加熔断。比如用 Resilience4j 做限流和降级。
面试官:这个回答比刚才更像一个真正做过线上系统的人。
第二轮:交易稳定性与数据一致性
1)面试官:订单成功但库存扣减失败,怎么保证最终一致性?
燕双非:可以用本地消息表,或者事务消息。订单落库后发一条待发送消息,后台任务补偿发送。
面试官:对,已经接近生产实践。那如果要更标准一点,你会怎么设计状态机?
燕双非:嗯……订单状态可以有待支付、已支付、已取消、已完成。状态流转尽量单向,避免乱跳。
面试官:很好,状态机是交易系统的骨架。
2)面试官:你会如何使用 Redis 来提升订单详情查询性能?
燕双非:把热点订单信息缓存起来,查缓存没有再查数据库,回填 Redis。还可以设置过期时间防止脏数据太久。
面试官:不错。那缓存击穿、缓存穿透、缓存雪崩分别怎么处理?
燕双非:击穿就加互斥锁,穿透可以布隆过滤器,雪崩就给 key 加随机过期时间。
面试官:回答清楚了,说明你至少认真背过线上问题。
3)面试官:如果用 Spring Cache 统一管理缓存,你会怎么配合 Caffeine 和 Redis?
燕双非:可以做两级缓存,Caffeine 做本地缓存,Redis 做分布式缓存。热点数据先打本地,减少网络开销。
面试官:可以,但要注意缓存一致性和失效通知。
4)面试官:现在很多系统都要求监控下单链路,你会埋哪些指标?
燕双非:QPS、RT、错误率、消息堆积量、库存预扣失败率、订单创建成功率。可以用 Micrometer 接 Prometheus,再用 Grafana 看板展示。
面试官:这个挺好,已经有一点平台工程思维了。
第三轮:风控、可观测性与 AI 辅助客服
1)面试官:订单链路里如果要做风控,你会怎么设计?
燕双非:可以按用户、设备、IP、支付行为做规则判断,比如同一设备频繁下单、异常地域切换、短时间内大量取消等。
面试官:对,规则风控是第一层。那复杂场景下怎么做动态决策?
燕双非:呃……可以上机器学习模型?或者把规则配置化?
面试官:可以先规则引擎化,再逐步引入模型评分。
2)面试官:如果客服系统要接入 AI 做订单咨询,你会怎么设计?
燕双非:可以做一个 Spring AI 的服务,结合 RAG,把订单 FAQ、退换货政策、物流规则做向量化,接向量数据库检索后再生成回答。
面试官:不错,已经不只是会“调大模型”了。那怎么降低 AI 幻觉?
燕双非:限制它只能基于检索结果回答,必要时提示“不确定”,并且对关键业务做工具调用,不让模型瞎编。
面试官:这点很关键,生产里必须控制幻觉。
3)面试官:你如何设计一个支持人工客服接管的智能客服工作流?
燕双非:先让 AI 处理标准问题,复杂问题转人工;聊天上下文要保留,工单要带上会话摘要,方便人工快速接手。
面试官:对,聊天会话内存和工具执行框架都要考虑。
4)面试官:最后一个问题,线上出了支付回调延迟,你怎么排查?
燕双非:先看日志,再看链路追踪,比如 Zipkin 或 Jaeger,结合 Prometheus 指标看是不是消息堆积、数据库慢查询或者第三方通道抖动。
面试官:思路是对的,能从可观测性维度下手。
面试官:今天先到这儿,你回去等通知吧。
所有面试问题详解
1. Spring Boot 如何组织高并发下单接口?
典型做法是 Controller 负责入参和返回值,Service 负责业务编排,DAO 负责数据访问。高并发场景下要特别关注参数校验、幂等控制、事务边界、线程池隔离和异常回滚。电商下单不是简单 CRUD,而是“校验用户资格、检查库存、创建订单、发消息、落审计日志”的组合流程。
2. 幂等如何设计?
可使用业务唯一键、请求幂等 token、订单状态校验、分布式锁等方式。生产中常见的是“客户端生成请求号 + 服务端幂等表/唯一索引 + 状态机约束”,避免重复提交、重复扣库存、重复发消息。
3. Kafka 和 RabbitMQ 如何选择?
Kafka 更适合高吞吐、事件流、日志型消息和削峰填谷;RabbitMQ 更适合复杂路由、低延迟业务消息和灵活投递模式。订单事件、埋点、行为流更偏 Kafka;订单状态变更通知、精细路由补偿可能更适合 RabbitMQ。
4. 消息重复消费怎么处理?
消息队列通常至少一次投递,因此消费者必须幂等。常见方案有:数据库唯一约束、消费日志表、Redis 去重标记、业务状态判断。关键不是“避免重复”,而是“重复了也不出错”。
5. Redis 预扣库存为什么常见?
因为 Redis 读写快,适合在秒杀、抢购、促销场景中先做快速拦截,减少数据库压力。通常先在 Redis 中原子扣减,再异步落库;如果落库失败,要靠补偿机制修正最终库存。
6. 如何处理缓存击穿、穿透、雪崩?
击穿:热点 key 失效导致大量请求打到 DB,可用互斥锁或逻辑过期。穿透:请求不存在的数据,可用布隆过滤器或缓存空值。雪崩:大量 key 同时失效,可给过期时间加随机值、做多级缓存、限流降级。
7. Caffeine + Redis 两级缓存有什么价值?
Caffeine 是本地缓存,访问极快,适合热点数据;Redis 是分布式缓存,适合跨实例共享。两级缓存能降低网络开销和 Redis 压力,但需要处理一致性、失效通知和热点漂移问题。
8. 交易系统为什么要有状态机?
订单、支付、退款、发货都有严格状态流转,状态机能防止非法跳转,例如“未支付订单不能直接完成”。状态机让业务逻辑更清晰,也利于审计、补偿和并发控制。
9. 如何保证最终一致性?
常见方式有本地消息表、事务消息、可靠消息投递、定时补偿、消息确认机制。核心思想是:本地事务先成功,再异步传播事件;如果中间失败,要有补偿任务继续推进,直到结果收敛。
10. Micrometer + Prometheus + Grafana 怎么用?
Micrometer 负责统一度量指标埋点,Prometheus 负责采集和存储时序指标,Grafana 负责可视化。电商系统常监控 QPS、RT、错误率、消息堆积、订单成功率、支付回调延迟、库存失败率等。
11. 风控系统怎么设计第一层规则?
先做规则风控:同设备频繁下单、同 IP 异常行为、异常地域切换、短时间重复支付失败等。规则层简单直接,响应快,适合作为实时拦截的第一道防线。
12. AI 客服如何结合 RAG?
RAG 的核心是“先检索,再生成”。把 FAQ、政策、工单知识库、订单操作文档做文档加载、切分、向量化,存入向量数据库;用户提问后先语义检索,再把命中文档拼进提示词,让模型基于证据回答。
13. 如何降低 AI 幻觉?
限制模型只能引用检索结果、对高风险问题强制工具调用、对关键信息加入校验、对未知回答“不确定”。生产中还要对回答做审计、打分和人工兜底,避免模型胡编订单状态、退款金额等敏感信息。
14. 智能客服如何支持人工接管?
需要保留会话内存、摘要、用户上下文和已执行工具结果。AI 先处理标准问答,复杂问题转人工,人工接手时可看到完整历史,避免重复问用户。
15. 出现支付回调延迟怎么排查?
先看日志,再看链路追踪,再看指标。重点检查第三方支付通道、消息堆积、数据库慢 SQL、线程池耗尽、网络抖动和限流规则。排查顺序一般是:现象确认、定位入口、拆分链路、回放请求、验证瓶颈。
以上内容围绕电商实时交易系统,从下单、库存、消息、缓存、监控、风控到 AI 客服,串起了 Java 面试中最常见也最容易追问的关键点。希望这篇内容能帮助你在面试中把握节奏、讲清思路、答出深度。感谢阅读,希望能真正帮助到大家。

1902

被折叠的 条评论
为什么被折叠?



