Spring Boot + Kafka + Redis + AI:互联网大厂 Java 面试实战,燕双非的三轮过招
以下内容以“互联网大厂 Java 求职面试”为背景,采用严肃面试官与水货程序员燕双非的对话形式展开。场景聚焦大数据与 AI 服务,围绕推荐、搜索、异步消息、缓存、监控、AI 检索增强生成等常见业务,循序渐进地考察候选人的真实能力。
第一轮:基础架构与系统选型
面试官:我们先从大数据与 AI 服务平台的整体架构聊起。你负责一个“企业知识问答”系统,前端接入后,请你先说说为什么会优先选 Spring Boot,而不是传统的 Spring MVC 或者 Struts?
燕双非:Spring Boot 吧,配置少,启动快,整合方便。传统 Spring MVC 还得配很多 XML,Struts 就更老了,嗯……比较费劲。
面试官:回答得不错,知道它们的工程效率差异。那如果这个系统需要同时支持同步问答和流式输出,你会怎么考虑 Spring WebFlux、WebSocket 和普通 REST 的组合?
燕双非:嗯……同步问答走 REST,流式输出可能用 WebSocket 或者 WebFlux。WebFlux 我知道是非阻塞的,适合高并发……具体嘛,得看团队习惯。
面试官:思路是对的。那在这个系统里,知识库文档很多,你会怎么设计文档加载、向量化和语义检索的链路?
燕双非:文档先加载,再切分,再做 Embedding,存到向量数据库里,比如 Milvus 或 Redis 吧。用户提问时先做语义检索,再把相关内容拼进提示词。
面试官:很好,已经接近实战了。最后一个问题,若这个系统要接入多个内部工具,比如工单、CRM、知识库搜索,你会怎么看 MCP 或工具调用标准化?
燕双非:这个……我理解成让 AI 更容易“点外卖”吧。就是统一接口,让模型知道什么时候该调用哪个工具,减少各系统各写各的适配。
面试官:嗯,虽然比喻有点离谱,但方向是对的。
第二轮:消息、缓存与数据一致性
面试官:现在进入业务高峰场景。假设知识问答系统白天流量很大,用户提问会先写入 Kafka 做削峰。你为什么会选 Kafka,而不是直接同步查数据库?
燕双非:因为同步查数据库容易把库打挂,Kafka 可以先把请求收进去,慢慢消费,起到缓冲作用。还能解耦上下游。
面试官:这次说得比较完整。那 Kafka 消费失败怎么办?你会怎么设计重试、幂等和死信处理?
燕双非:重试可以有,但不能无限重试,不然消息堆积。幂等的话,可能用业务唯一 ID 去重。死信消息就记录下来,后面人工或补偿任务处理。
面试官:不错。再来一个:热点问答会被大量重复请求,你会用 Redis、Caffeine、Spring Cache 怎么做多级缓存?
燕双非:本地缓存用 Caffeine,分布式缓存用 Redis。Spring Cache 可以统一缓存注解,先查本地再查 Redis,再回源数据库或者向量库。
面试官:很好。那如果缓存和数据库不一致,你会怎么处理?
燕双非:这个……一般是先更新数据库,再删缓存,或者双删策略。至于更严格的一致性,可能得靠消息通知或者延迟双删。
面试官:继续。这个系统要做审计和行为分析,日志你会选 Logback 还是 Log4j2?为什么?
燕双非:Logback 和 SLF4J 配合比较常见,配置相对简单;Log4j2 性能也不错,异步日志能力强。看团队标准吧。
面试官:还算稳。最后问一个监控问题:你会怎么用 Micrometer、Prometheus、Grafana 监控整个问答链路?
燕双非:用 Micrometer 打指标,Prometheus 抓取,Grafana 展示。比如请求量、延迟、Kafka 积压、缓存命中率、向量检索耗时都可以监控。
面试官:可以,至少知道要观测什么。
第三轮:AI 落地、风控与工程化
面试官:我们把场景升级一下。现在要求系统不仅能回答知识库问题,还能结合企业内部文档做 RAG,并支持复杂工作流,比如“先检索合同,再调用审批系统,再生成回复”。你怎么理解 Agent 和 RAG 的关系?
燕双非:RAG 更像“先查资料再回答”,Agent 更像“能自己决定要不要查、查哪儿、调哪个工具”。Agent 可以把检索、调用接口、总结结果串起来。
面试官:不错。那如果 AI 回答出现幻觉,甚至编造了一个不存在的合同条款,你打算怎么控制?
燕双非:这个很危险。可以限制回答必须引用检索到的证据,增加答案置信度校验,低置信度就提示人工复核。也可以把提示词设计得更严格,禁止模型胡编。
面试官:很好,知道幻觉是大问题。那企业里常说“聊天会话内存”,你会怎么做,才能让 AI 既记住上下文,又不无限膨胀?
燕双非:可以保存最近几轮对话,再做摘要压缩;重要信息单独存结构化记忆。不能把所有历史都硬塞进上下文,不然 token 成本太高。
面试官:最后一个业务题:如果这个 AI 问答系统要接入 Spring Security 和 OAuth2,给不同部门配置不同权限,你会怎么做?
燕双非:登录后拿 JWT,网关或服务端校验 token,再根据角色和部门做授权。敏感文档要做细粒度权限控制,不能检索到没权限的内容。
面试官:说得还行。那如果我们还要求高可用和链路追踪,你会补哪些能力?
燕双非:我会加熔断降级,比如 Resilience4j;分布式链路追踪可以用 Jaeger 或 Zipkin;如果是微服务,还会配合 Spring Cloud、OpenFeign 做调用。
面试官:嗯,整体思路比较完整。今天先到这里,你回去等通知吧。
面试问题详细解答
1. 为什么企业级 Java 项目常选 Spring Boot
在“企业知识问答”或“大数据与 AI 服务”场景中,Spring Boot 的核心优势是自动配置、开箱即用、约定优于配置。它能快速搭建 REST 服务、集成缓存、消息队列、监控、数据库访问层,显著减少样板代码。相比传统 Spring MVC,Boot 在工程化效率上更适合快速迭代;相比 Struts,它更符合现代微服务与云原生开发习惯。
2. Spring WebFlux、WebSocket 与 REST 的组合
同步问答接口适合 REST;需要流式输出、逐 token 返回时,可以使用 WebFlux 或 WebSocket。WebFlux 基于响应式编程和非阻塞 I/O,在高并发场景下资源利用率更好。WebSocket 更适合双向实时交互,如“边生成边展示”的 AI 聊天。实际项目中可按业务分层:普通查询走 REST,实时对话走 WebSocket/流式 SSE,内部异步处理用响应式链路。
3. 文档加载、向量化与语义检索
RAG 的典型链路是:文档加载 → 切分 → Embedding → 向量存储 → 检索 → Prompt 组装 → 生成答案。文档可来自 PDF、Word、网页、数据库;切分时要控制 chunk 大小和重叠,避免上下文断裂;Embedding 模型把文本映射到向量空间;向量数据库如 Milvus、Chroma、Redis 向量索引用于相似度检索。检索到的片段再拼接进提示词,降低幻觉概率。
4. MCP 与工具调用标准化
MCP 的价值在于让模型与外部系统的交互更标准化。你可以把“查知识库、查工单、查 CRM、发起审批”等能力封装为统一工具接口。模型只需通过统一协议识别可用工具、输入输出格式和权限范围,就能减少每个系统单独适配的成本。这对复杂企业场景尤其重要。
5. Kafka 在高峰流量下的削峰与解耦
当问答请求量暴增时,直接同步打数据库或检索服务会导致线程堆积与下游过载。Kafka 适合做削峰填谷:上游先写消息,下游消费者异步处理。设计时要考虑:
- 幂等:用业务唯一 ID 防重复消费。
- 重试:有限次数重试,避免无限循环。
- 死信队列:兜底失败消息,供补偿或人工处理。
- 分区键:保证同一会话或同一业务线的顺序性。
6. 多级缓存与一致性
热点问答适合用Caffeine + Redis组合:Caffeine 提供本地极速读取,Redis 负责跨实例共享。Spring Cache 能统一缓存注解,提升开发效率。缓存一致性通常采用“先更新数据库,再删除缓存”或“双删策略”,必要时配合消息通知或延迟双删,降低脏读概率。对于严格一致性场景,要进一步结合业务容忍度和事务设计。
7. 监控、日志与可观测性
在生产环境,必须关注请求量、延迟、错误率、Kafka 堆积、缓存命中率、向量检索耗时、模型调用耗时等指标。Micrometer 负责统一埋点,Prometheus 负责采集,Grafana 负责可视化。日志建议通过 SLF4J 统一门面,后端可选 Logback 或 Log4j2。链路追踪可用 Jaeger/Zipkin,便于定位慢请求和跨服务瓶颈。
8. RAG、Agent 与幻觉控制
RAG 侧重“先检索再回答”,而 Agent 更强调“模型自主规划并调用工具”。在企业知识问答中,常将两者结合:Agent 先判断是否需要检索、是否需要调用审批/工单系统,然后将结果汇总生成答案。为了控制幻觉,需要:
- 强制答案引用检索证据。
- 对低置信度结果进行人工兜底。
- 约束模型不超出知识范围回答。
- 对敏感业务增加规则校验和权限过滤。
9. 聊天会话内存的设计
会话内存不能无限累积。常见做法是保存最近几轮对话,再对历史内容做摘要,或者把用户画像、任务状态等重要信息以结构化方式保存。这样既能保持上下文连续,又能控制 token 成本与响应延迟。
10. Spring Security、JWT 与 OAuth2 的权限控制
企业内部系统往往要按部门、角色、数据域进行细粒度授权。通常做法是:统一登录后签发 JWT,服务端或网关校验 token;结合 OAuth2 做第三方授权或统一认证;在检索层和服务层都加入权限过滤,避免越权访问未授权知识库内容。
11. 熔断降级、调用治理与链路追踪
在微服务架构中,外部依赖可能不稳定,因此需要 Resilience4j 等工具做熔断、限流和重试控制。OpenFeign 适合声明式调用,Spring Cloud 便于统一治理。链路追踪则通过 Jaeger 或 Zipkin 把请求跨服务的完整路径串起来,帮助排查 AI 接口、检索接口和审批接口之间的性能问题。
感谢阅读,希望这篇文章能帮助你更好地准备 Java 面试,也能在大厂常见的业务与技术结合题中更加从容应对。祝大家面试顺利,早日拿到满意的 offer!