Java 大厂面试实录:Spring Boot + Kafka + Redis + Spring Security + RAG 的电商 AIGC 进阶追问

第一轮:电商下单链路与基础架构

面试官:我们先从电商场景开始。假设现在有一个大促活动,用户点击“立即购买”后,你会如何设计一个 Java 后端服务的整体结构?

燕双非:我会先用 Spring Boot 搭一个下单服务,拆成商品、库存、订单三个模块。前端先调商品详情接口,下单时先校验库存,再创建订单,最后异步发消息给库存系统扣减库存。这样结构比较清楚。

面试官:思路还不错。那你为什么会优先选 Spring Boot,而不是传统的 Spring MVC 手工配置?

燕双非:因为 Spring Boot 上手快,自动配置省事,内嵌容器也方便部署,适合电商这种迭代快的场景。

面试官:可以,至少说明你知道它的价值。那如果活动流量很大,下单接口怎么防止重复提交?

燕双非:我会给每次提交加一个 token,提交成功后就失效;或者用 Redis 做幂等校验,限制同一用户同一商品短时间内只能成功一次。

面试官:嗯,这个方向对。那订单创建成功后,你会怎么把“扣库存”这件事解耦出去?

燕双非:用 Kafka 发个消息到库存 topic,库存服务消费后做扣减。这样下单链路不会被库存服务拖慢。

面试官:不错,终于有点分布式系统的味道了。

第二轮:安全、缓存、监控与接口治理

面试官:接下来我们往深一点聊。电商系统里用户登录、下单、支付,你怎么做认证和授权?

燕双非:登录我一般会用 Spring Security 搭配 JWT,登录成功后签发 token,后续请求带上 token 就能识别用户身份。不同角色比如普通用户、运营人员、管理员,权限不一样。

面试官:那 JWT 放在前端哪里更合适?

燕双非:这个……一般会放在浏览器本地存储里?不过如果是高安全场景,可能要配合 HttpOnly Cookie,避免被脚本直接读到。

面试官:这回答开始像样了。那你怎么防止缓存击穿、缓存穿透和缓存雪崩?

燕双非:缓存穿透我会做空值缓存或者布隆过滤器;缓存击穿可以用互斥锁或者热点预热;缓存雪崩就给缓存设置随机过期时间,避免同一时间大量失效。

面试官:很好。那在商品详情页这种高频读场景里,Redis 适合放哪些数据?

燕双非:商品基础信息、库存快照、购物车、限流计数、用户最近浏览记录都可以放。对特别热点的数据,我会考虑本地缓存配合 Redis 双层缓存。

面试官:很好。接口这么多,怎么让前后端和测试同学更容易协作?

燕双非:可以用 Swagger/OpenAPI 生成接口文档,把请求参数、响应结构、错误码都写清楚,联调会省很多时间。

面试官:那服务运行后,你怎么知道它是不是扛得住大促流量?

燕双非:我会接 Prometheus 和 Grafana 看 QPS、RT、错误率、JVM 指标,还可以用 Micrometer 统一采集业务指标,比如下单成功率、支付回调延迟。

面试官:不错,至少知道不能只看 CPU。

第三轮:AIGC 推荐、RAG 与工程化落地

面试官:现在很多电商都在做 AIGC。假设我们要做一个“智能导购”功能,用户输入“适合夏天通勤的轻便鞋”,系统怎么给出结果?

燕双非:我会先把商品文案、属性、评价做向量化,存到向量数据库里,然后根据用户的自然语言查询做语义检索,再把候选商品交给大模型生成推荐理由。

面试官:思路不错。那你觉得纯大模型直接回答,和 RAG 有什么区别?

燕双非:纯大模型可能会瞎编,RAG 会先检索企业知识库或者商品数据,再基于检索结果回答,准确性更高,幻觉更少。

面试官:如果要把这个系统接到企业内部文档和商品知识库里,你会怎么设计?

燕双非:我会先做文档加载和清洗,再切分成片段,生成 embedding,存到 Milvus 或 Redis 向量索引里。查询时先做语义检索,再把召回内容和用户问题一起拼到提示词里,交给大模型生成答案。

面试官:如果导购系统还要支持多轮聊天、工具调用和订单查询呢?

燕双非:那就要加聊天会话内存,记录上下文;再接一个工具执行框架,让模型在需要时调用查订单、查库存、查物流这些接口。最好把工具调用标准化,不然以后扩展很麻烦。

面试官:嗯,终于说到一点 Agent 的味道了。那如果大模型回答错了,甚至推荐了不存在的商品,你怎么处理?

燕双非:一方面要限制生成范围,只让它基于检索到的数据回答;另一方面要加结果校验,比如商品 ID、库存状态、价格都要二次验证。必要时可以让模型输出结构化结果,再由后端做最终裁决。

面试官:好,今天先到这里吧。你回去等通知。

问题详解与知识点总结

1. 电商下单链路为何适合 Spring Boot?
Spring Boot 的核心价值是快速开发、自动配置、内嵌容器和生态完整。对于订单、商品、库存这类高并发业务,Boot 能快速搭建标准化服务,并与监控、缓存、消息队列、安全框架无缝集成。

2. 重复提交为什么要做幂等控制?
用户在弱网、超时、重复点击时可能发起多次请求。若不做幂等,可能导致重复下单、重复扣库存。常见方案包括:请求 token、Redis 去重、唯一业务键、数据库唯一索引、消息消费幂等等。

3. Kafka 为什么适合解耦库存扣减?
Kafka 适合高吞吐、可扩展、可削峰填谷的异步场景。下单服务只负责发送消息,库存服务异步消费处理。这样可以降低主链路耗时,也能让不同系统独立扩容。

4. Spring Security + JWT 的核心作用是什么?
Spring Security 负责认证授权框架能力,JWT 负责无状态身份承载。常用于前后端分离系统,服务端无需维护会话,但必须注意 token 失效、续期、撤销、签名安全和存储安全。

5. Redis 中如何避免缓存三大问题?
缓存穿透:布隆过滤器、空值缓存;缓存击穿:互斥锁、热点预热、逻辑过期;缓存雪崩:随机过期时间、多级缓存、限流降级。不同问题要针对性治理。

6. Prometheus、Grafana、Micrometer 各自的角色是什么?
Micrometer 负责统一指标采集,Prometheus 负责拉取和存储指标,Grafana 负责可视化展示。业务系统还应关注订单成功率、支付延迟、库存失败率等业务指标,而不只是 JVM 和 CPU。

7. 为什么 AIGC 场景里 RAG 很重要?
大模型本身不掌握企业实时数据,也容易产生幻觉。RAG 通过“先检索、后生成”把模型回答限定在知识库和业务数据之内,更适合商品推荐、企业文档问答、智能客服等场景。

8. 向量化、语义检索、向量数据库分别解决什么问题?
向量化把文本、商品、文档转成可计算的向量;语义检索通过相似度找出相关内容;向量数据库负责高效存储与召回。它们一起支撑自然语言语义搜索和 Agentic RAG。

9. 为什么多轮对话要加入会话内存和工具调用?
多轮对话依赖上下文,会话内存用于保存历史;工具调用让模型不只“会说”,还能“会做”,例如查订单、查物流、查库存、下单推荐。这是智能客服和复杂工作流的重要基础。

10. 如何降低大模型幻觉?
常见方式有:限制回答范围、增强检索质量、让模型输出结构化结果、结果二次校验、加入规则引擎、人审兜底、对高风险回答做拒答或转人工。

感谢阅读,希望这篇面试实录能帮助你更好地准备 Java 大厂面试,理解业务场景背后的技术选型与核心原理。祝大家都能在面试中稳住发挥,拿到满意的 offer。

Logo

电商企业物流数字化转型必备!快递鸟 API 接口,72 小时快速完成物流系统集成。全流程实战1V1指导,营造开放的API技术生态圈。

更多推荐