Spring Boot + Kafka + Redis + AI:互联网大厂 Java 面试实战(燕双非篇)
场景:大数据与 AI 服务+企业协同与 SaaS。面试官严肃,候选人燕双非同学“战斗力”时高时低。
第一轮:基础架构与存储
面试官:你做过一个企业协同平台,员工消息、待办、审批都要实时同步。你会怎么设计整体技术栈?
燕双非:我会先用Spring Boot搭服务,前后端分离;数据层用MyBatis或JPA都行,连接池用HikariCP,再配Redis做缓存。审批流比较多的话,消息异步可以上Kafka,这样系统压力小一点。
面试官:嗯,思路基本对。那事务一致性怎么保证?比如创建待办后,缓存、数据库、消息都要成功。
燕双非:这个……可以先写库,再删缓存,再发消息?如果失败就重试?或者用一个“很稳”的工具……
面试官:方向有点模糊。继续说说你怎么处理缓存穿透、击穿和雪崩。
燕双非:穿透可以缓存空值,击穿可以热点 key 加互斥锁,雪崩就给缓存加随机过期时间,必要时做预热和降级。
面试官:这个回答不错,至少不是“全靠运气”。
面试官:再补一个问题:审批列表分页查询性能差,你会怎么优化?
燕双非:先看 SQL 和索引,再避免深分页;可以用游标翻页、覆盖索引,热点数据放 Redis,报表类查询单独走离线。
第二轮:消息、接口与容错
面试官:你负责的 SaaS 系统要对接外部系统,既有同步查询,也有异步回调。接口层你会怎么做?
燕双非:我会用Spring MVC做 REST 接口,配Swagger/OpenAPI管理文档;如果有流式推送,也可以考虑WebSocket。对外调用可以用OpenFeign,再加Resilience4j做熔断限流。
面试官:不错。那对接第三方支付回调时,消息重复、乱序、超时怎么处理?
燕双非:嗯……重复就做幂等,拿订单号和回调流水号做唯一约束。乱序的话按事件版本号处理。超时的话先返回成功,业务处理放到异步队列里,避免对方一直重试。
面试官:说得还行。那如果你们消息队列从Kafka换成RabbitMQ,你会关注哪些差异?
燕双非:Kafka 更偏高吞吐、流式消费;RabbitMQ 更适合复杂路由和业务消息。选型要看场景。比如通知、审批事件流适合 Kafka,订单延迟补偿、灵活路由可能更适合 RabbitMQ。
面试官:嗯,能把场景说出来就比“我觉得都差不多”强很多。
面试官:最后问个中间件问题:你怎么做接口级别的限流和降级?
燕双非:可以在网关层做限流,服务内用Resilience4j的 RateLimiter、CircuitBreaker。比如 AI 问答接口很贵,就限制 QPS,并在失败时返回兜底提示。
第三轮:AI 与搜索增强
面试官:现在业务要做企业知识问答,员工问“合同模板在哪里”“某政策怎么走”,你怎么落地?
燕双非:我会做一个RAG系统:先把企业文档做文档加载,切分后生成Embedding,存到向量数据库里,比如Milvus或Redis Vector。查询时先做语义检索,再把检索结果拼进提示词,交给大模型生成答案。
面试官:那如果模型胡说八道,出现AI 幻觉呢?
燕双非:嗯……要加检索证据约束,控制提示词,答案里必须引用来源;高风险问题走人工确认。还可以做答案置信度评分,低分就不给直接回复。
面试官:如果要把这个系统做成可扩展的Agent,你会怎么设计工具调用?
燕双非:可以把查文档、查工单、查审批记录都封装成标准化工具,通过工具调用标准化来编排。Agent 负责判断什么时候调用哪个工具,再结合聊天会话内存维持上下文。复杂工作流可以拆成多步执行,形成Agentic RAG。
面试官:听起来像是认真做过。那你怎么理解客户端-服务器架构在 AI 服务里的意义?
燕双非:前端负责对话展示和会话状态,服务端负责检索、生成、权限控制和审计。这样可以把模型调用、数据访问和企业安全策略都放在后端,便于统一治理。
面试官:好,今天先到这。你回去等通知吧。
问题详解
1. 企业协同平台如何设计技术栈?
在企业协同场景中,常见能力包括待办、审批、消息、通知、组织架构和权限控制。Spring Boot负责快速搭建服务,MyBatis/JPA负责持久化,HikariCP提供高性能连接池,Redis用于缓存热点数据和分布式锁,Kafka用于异步事件流转。这样的组合能兼顾开发效率、性能和可扩展性。
2. 事务一致性与缓存问题如何处理?
数据库、缓存、消息队列三者要尽量遵循“最终一致性”。常见做法是:先提交数据库,再通过消息或订阅机制更新缓存;或者采用事务消息、Outbox 模式、可靠消息最终一致性方案。对于缓存穿透、击穿、雪崩,要分别使用空值缓存、互斥锁/热点预热、随机过期和降级策略。
3. 对外接口如何保证幂等、限流和容错?
对外回调和接口调用经常面临重复请求和超时。幂等可以通过业务唯一键、状态机和唯一索引实现;限流可在网关层或服务层使用令牌桶、漏桶、Resilience4j等组件;容错可以通过熔断、降级、重试和隔离舱实现。关键是避免把短暂故障扩散成系统级故障。
4. Kafka 和 RabbitMQ 怎么选?
Kafka更偏高吞吐、可水平扩展、适合日志、埋点、事件流、异步解耦等场景;RabbitMQ更擅长复杂路由、延迟队列、业务消息投递。若系统中更强调消息积压处理能力、批量消费和流式分析,Kafka 更合适;若强调灵活路由和业务事件投递,RabbitMQ 往往更顺手。
5. 企业知识问答为何推荐 RAG?
企业问答的核心难点是知识更新快、私有资料多、不能随便“编答案”。RAG(检索增强生成)通过“先检索、再生成”把企业文档、FAQ、工单、制度等内容检索出来,再交给大模型组织语言。其价值在于减少幻觉、提升可控性,并且可以快速接入新知识。
6. 如何降低 AI 幻觉?
可以从检索、提示词、模型、后处理四层治理:提高召回质量、加入来源约束、设置拒答规则、输出引用证据、对高风险问题加入人工审核。对于金融、医疗、合同等场景,更应把“可追溯”作为第一原则。
7. Agent 与工具调用标准化怎么理解?
Agent 的本质是让模型具备“计划、决策、调用工具、观察结果、继续执行”的能力。工具调用标准化则是把查库、查文档、查工单、发消息、创建任务等能力统一成结构化接口,便于模型编排和系统治理。复杂工作流常采用“多步推理 + 多轮执行 + 结果校验”的方式。
感谢阅读,希望这篇文章能帮助大家更好地准备 Java 面试,也希望大家都能顺利拿到理想 offer。