Java 求职面试实录:Spring Boot + Kafka + Redis + RAG,燕双非在大厂面试现场翻车又翻盘
这是一场发生在互联网大厂的 Java 面试。严肃的面试官坐在桌前,候选人是号称“经验丰富、实则水分不少”的程序员燕双非。三轮面试中,问题从 Java 基础、Spring Boot、MyBatis、Redis、Kafka,一路深入到微服务治理、JVM 性能、RAG 与智能客服系统。简单题燕双非还能答上几句,复杂题就开始含糊其辞,但面试官也会顺着他的回答不断追问和引导。
第一轮:Java 基础与 Web 订单服务
面试官:先自我介绍一下,你做过哪些 Java 项目?
燕双非:我做过电商订单、用户中心、优惠券系统,主要用 Spring Boot、MyBatis、Redis,负责过接口开发和线上问题排查。
面试官:不错,说明你至少接触过完整的业务链路。那你说说 Java 8 的 Optional 有什么实际价值?
燕双非:主要是避免空指针,写代码时能更优雅地处理可能为空的对象,比如订单查询结果、用户信息这些。
面试官:回答得还可以。那在订单创建接口里,你会怎么防止重复提交?
燕双非:我会用 Redis 做幂等键,前端提交时带请求号,后端先查 Redis,存在就直接拒绝,不存在就写入并执行业务。
面试官:思路是对的,不过要注意 Redis 原子性和过期时间设计。再说说 Spring Boot 自动装配是怎么工作的?
燕双非:大概是根据类路径和配置条件自动把 Bean 装进去,省得手工写很多配置文件。
面试官:嗯,能说到条件装配已经不错了,后面细节我们再展开。
第二轮:微服务、消息队列与缓存治理
面试官:假设你在电商大促场景下,订单服务要拆成微服务,你会怎么做?
燕双非:会拆成订单、库存、支付、优惠券几个服务,通过 Spring Cloud 或者 OpenFeign 调用,配合注册中心做服务发现。
面试官:方向对。那如果库存服务偶发超时,怎么避免把整个链路拖垮?
燕双非:可以用 Resilience4j 做限流、熔断、隔离,超时就快速失败,别让线程一直傻等。
面试官:很好。那消息队列为什么常用在下单场景?
燕双非:因为能削峰填谷,把短信通知、积分发放、日志埋点这些非核心链路异步化,主流程更快。
面试官:那 Kafka 和 RabbitMQ 你会怎么选?
燕双非:Kafka 更适合高吞吐、日志和事件流,RabbitMQ 更适合业务消息、灵活路由和更细粒度的可靠投递。
面试官:回答得不错。那缓存和数据库一致性怎么处理?
燕双非:常见是先更新数据库,再删除缓存,避免脏数据;复杂一点可以加消息补偿或延迟双删。
面试官:可以,说明你至少踩过坑。那说说 MyBatis 和 JPA 的差异。
燕双非:MyBatis 更适合强控制 SQL 的场景,JPA 更偏对象关系映射,开发效率高但复杂查询可控性稍弱。
面试官:这个对业务系统来说是很实用的判断。
第三轮:JVM、AI 服务与企业级落地
面试官:现在很多业务都接入 AI。假设你要在电商客服系统里加一个智能问答模块,你怎么设计?
燕双非:可以用 Spring AI 接入大模型,结合 RAG,把商品说明、售后规则、物流政策做向量化,存到向量数据库里,用户提问时先语义检索,再把相关上下文交给模型生成答案。
面试官:思路不错。那如何降低大模型幻觉?
燕双非:要尽量让模型基于可检索的企业知识回答,增加提示词约束、引用来源、答案置信度控制,必要时对高风险问题转人工。
面试官:很好。那如果这个系统 QPS 很高,JVM 层面你会关注什么?
燕双非:我会关注堆内存、GC 类型、对象创建速度、线程池配置,还有日志和缓存对象是否导致内存抖动。
面试官:那你说说 G1 垃圾回收器适合什么场景?
燕双非:适合大堆内存、希望停顿时间可控的服务,比如微服务网关、订单核心服务。
面试官:最后一个问题,如果让你设计一个企业文档问答平台,你会怎么做?
燕双非:文档加载、切分、向量化、语义检索、权限控制、聊天会话内存、工具调用、审计日志都要有,复杂工作流可以做成 Agentic RAG,先理解问题再决定查哪些知识源。
面试官:行,今天先到这里。你回家等通知吧。
问题解析:结合业务场景逐题拆解
1. Java 8 Optional 的价值:在用户信息、订单详情、优惠券配置等场景中,Optional 能显式表达“可能不存在”的状态,减少空指针判断。它适合用于返回值处理,不建议滥用在字段建模中。
2. Redis 幂等控制:订单提交、支付回调、发券请求都需要幂等。常用方案是请求号 + Redis SETNX 或 Lua 脚本保证原子性,再配合过期时间和业务唯一索引兜底。
3. Spring Boot 自动装配:通过条件注解、配置类和 starter 机制,Spring Boot 根据依赖和配置自动装配 Bean,显著减少样板代码,非常适合快速构建业务服务。
4. 微服务拆分与服务治理:电商大促中,订单、库存、支付、优惠券往往独立演进。OpenFeign 负责声明式调用,注册中心负责发现,Resilience4j 负责限流、熔断、隔离,确保局部故障不扩散。
5. Kafka 与 RabbitMQ 的选型:Kafka 更适合事件流、埋点、日志和高吞吐场景;RabbitMQ 更适合业务解耦、复杂路由和需要