互联网大厂Java面试实录:JVM、Spring Boot、Redis、Kafka、Spring Cloud、MCP与RAG三轮拷打
互联网大厂Java面试实录:JVM、Spring Boot、Redis、Kafka、Spring Cloud、MCP与RAG三轮拷打
一、故事背景
谢飞机最近混进了一家互联网大厂的面试现场,岗位是高级Java开发工程师。
这家公司主营业务很复杂:既有求职招聘平台,也有内容社区与UGC,还在做AIGC简历优化、AI客服、企业知识库问答。
系统架构从单体一路演进到微服务,技术栈覆盖Spring Boot、Spring Cloud、Redis、Kafka、MyBatis、JVM、Docker、Kubernetes、Prometheus、ELK,最近还在试点Spring AI、MCP、RAG、向量数据库。
面试官姓李,风格严肃,说话像线上故障复盘。
谢飞机表面稳如老狗,内心慌得一批,但他有个特点:简单题会,复杂题就开始云里雾里胡侃。
二、第一轮面试:招聘主链路的Java基础与系统设计
业务背景:
用户在招聘平台投递简历,系统需要完成职位展示、简历投递、推荐排序、消息通知等流程。
面试官先从基础架构和后端核心能力开始问。
问题1:你先说说,招聘平台为什么大多数后端还是以 Spring Boot 为主,而不是一上来就 WebFlux?
面试官:
你做过招聘系统吧?如果我们做一个职位投递平台,为什么很多团队还是优先 Spring Boot + Spring MVC,而不是直接上 Spring WebFlux?
谢飞机:
这个我会。Spring Boot 开箱即用,生态好,和 Spring MVC、MyBatis、Spring Security、Redis 这些都很好集成。
WebFlux 也挺好,就是……它比较“响应式”,适合那种特别高并发、I/O很多的场景。
但我们大多数招聘系统,其实很多地方还是数据库操作、业务校验、权限判断比较多,所以 Spring MVC 更稳一点。
面试官:
嗯,回答得还行,至少没把 WebFlux 说成前端框架。那你继续说,什么时候会考虑 WebFlux?
谢飞机:
比如要接很多外部服务、长连接、流式返回、AI问答流式输出、WebSocket消息推送这种,可以考虑。
面试官:
不错,继续。
问题2:JVM 调优你做过什么?如果投递高峰时服务频繁 Full GC,你怎么排查?
面试官:
周一早上九点,校招投递高峰,投递服务突然 RT 飙高,Full GC 频繁。你怎么排查?
谢飞机:
这个也见过。先看监控,比如 CPU、内存、GC 次数。
然后……可以看 JVM 堆是不是太小,或者对象太多。
再看日志,必要时 dump 一下。
一般我会调大堆内存,比如-Xms -Xmx,然后用 G1 收集器。
面试官:
这只能算“会背关键词”。你说具体点,什么对象多?为什么会多?
谢飞机:
呃……可能是简历列表查询查太大了,一次查几千条,放进内存了。
也可能是 JSON 序列化对象太多,或者缓存没用好。
还有就是线程池堆积任务,那个……对象一直释放不掉。
面试官:
行,勉强有点思路,继续。
问题3:职位列表接口你会怎么做缓存?Redis、Caffeine、Spring Cache 各怎么用?
面试官:
职位列表是高频读接口,首页和搜索页流量大,你怎么做缓存设计?
谢飞机:
这个简单。
Redis 放分布式缓存,多个服务都能用。
Caffeine 放本地缓存,速度快。
Spring Cache 就是方便,不想每次手写缓存逻辑时可以用注解。
面试官:
你这回答像目录,不像方案。实际怎么组合?
谢飞机:
可以二级缓存嘛。
先查 Caffeine,本地没有再查 Redis,Redis 没有再查数据库。
热点职位、热门搜索条件可以缓存。
然后设置过期时间,避免缓存雪崩。
再加随机过期时间,防止一起失效。
面试官:
还行,终于说到点子上了。
问题4:MyBatis、JPA、Hibernate 在这个招聘系统里你怎么选?
面试官:
你别只会背框架名。职位搜索、简历投递、用户画像这三类业务,你会怎么选 ORM 层方案?
谢飞机:
我一般会选 MyBatis。SQL 可控,复杂查询方便。
JPA 和 Hibernate 适合那种增删改查比较标准的业务。
比如用户基础信息、企业基础档案这些可以用 JPA。
复杂搜索、报表统计、多表联查还是 MyBatis 更顺手。
面试官:
嗯,这个回答不错。那数据库变更怎么做版本管理?
谢飞机:
Flyway 或 Liquibase。
每次建表、加索引、字段变更都要脚本化,跟代码一起走发布流程。
面试官:
可以,至少干过活。
三、第二轮面试:微服务、消息队列与稳定性治理
业务背景:
平台已经拆成多个服务:用户服务、职位服务、投递服务、推荐服务、消息服务、风控服务。
这一轮重点考察微服务拆分、异步化、容错治理。
问题1:简历投递成功后,为什么不直接同步调用消息服务、推荐服务、风控服务?
面试官:
用户点击“投递简历”,你要同步调用消息服务发通知、调用推荐服务更新画像、调用风控服务审查内容。
你会全同步做吗?
谢飞机:
不会。
因为同步调用太多,链路会变长,接口容易慢,还容易一个服务挂了拖死全部。
所以可以把部分流程异步化,比如发 Kafka 或 RabbitMQ。
面试官:
那哪些适合同步,哪些适合异步?
谢飞机:
投递主流程里,核心写库得同步,比如投递记录必须先成功。
通知、画像更新、埋点、统计这些可以异步。
风控嘛……如果是强校验就同步,如果是补充审核就异步。
面试官:
这个回答不错,有业务意识。
问题2:Kafka、RabbitMQ、Pulsar 你怎么选?
面试官:
你刚提了 MQ。那你说说,在招聘平台里,投递事件流、通知消息、AI处理任务,这三类场景怎么选 Kafka、RabbitMQ、Pulsar?
谢飞机:
Kafka 吞吐高,适合大数据日志流、埋点流、推荐事件流。
RabbitMQ 比较适合业务消息,路由灵活。
Pulsar……也挺强,存算分离,功能比较全。
如果公司已经有 Kafka,就先用 Kafka。
面试官:
这回答有点“见过 PPT”。再具体点。
谢飞机:
比如:
- 投递行为流、推荐特征流,用 Kafka;
- 短信、站内信、邮件通知,用 RabbitMQ;
- AI 异步任务如果要求租户隔离强、积压处理灵活,Pulsar 也可以考虑。
面试官:
行,至少比刚才强。
问题3:Spring Cloud 里 OpenFeign、Gateway、Resilience4j 分别怎么配合?
面试官:
一个微服务系统里,用户服务调职位服务、推荐服务、AI服务,链路复杂。你说说 OpenFeign、Gateway、Resilience4j 怎么用?
谢飞机:
Gateway 放最前面,做统一路由、鉴权、限流。
OpenFeign 是服务间调用。
Resilience4j 用来做熔断、限流、重试、隔离。
面试官:
那如果 AI 简历优化服务很慢,经常超时怎么办?
谢飞机:
Feign 调用超时要设置合理一点,别无限等。
Resilience4j 可以做超时控制、熔断。
还可以降级,比如先返回“简历优化任务已提交,请稍后查看结果”。
面试官:
不错,这个回答是在线上的。
问题4:注册中心你会选 Eureka 还是 Consul?Dubbo 或 gRPC 又怎么插进来?
面试官:
你们老系统可能是 Netflix OSS,新系统可能想上 Consul,部分高性能内部调用还想上 Dubbo 或 gRPC。你怎么理解这几种组合?
谢飞机:
Eureka 以前用得多,但现在很多团队会转向 Consul。
Consul 功能更全一点,服务发现、健康检查都比较好。
Dubbo 适合 Java 内部高性能 RPC。
gRPC 更适合跨语言。
如果 AI 服务有 Python,Java 调 Python,我觉得 gRPC 比较合适。
面试官:
嗯,这个方向对。那序列化怎么选?
谢飞机:
内部高性能一般 Protobuf,普通 HTTP 接口还是 Jackson JSON 最方便。
如果做日志或离线传输,Avro 也有场景。
面试官:
还行。
四、第三轮面试:AI、MCP、RAG、安全与可观测性
业务背景:
公司要做一个“AI求职助手”,支持简历优化、岗位问答、企业知识库问答、智能客服。
要求接入企业内部知识库,尽量减少大模型胡说八道,还要能接工具。
问题1:你说说 MCP、RAG、Agent 在 AI 求职助手里分别是干什么的?
面试官:
别背概念,放到业务里讲。我们要做 AI 求职助手,MCP、RAG、Agent 各自负责什么?
谢飞机:
RAG 我知道,是先检索资料再让大模型回答,减少胡说。
Agent 就是让模型自己规划步骤、调用工具。
MCP……就是工具调用标准化?像一个协议,把模型和工具接起来。
面试官:
嗯,这个还算靠谱。那在求职助手里怎么落地?
谢飞机:
比如用户问“某岗位面试重点是什么”,先通过 RAG 去检索岗位JD、题库、企业知识库。
如果用户要“帮我优化简历并投递”,那 Agent 可以拆步骤。
MCP 就用来统一接简历解析工具、职位搜索工具、投递工具、通知工具这些。
面试官:
不错,这个回答值得加点分。
问题2:怎么减少 AI 幻觉?只说“加 RAG”不够。
面试官:
如果求职助手乱编公司福利、乱编岗位要求,你怎么治理幻觉问题?
谢飞机:
这个……主要就是 RAG。
把知识库喂给它。
然后提示词写严谨一点,让它不要乱说。
面试官:
太泛了,继续。
谢飞机:
呃,还可以做答案引用来源。
检索不到就明确说“暂无依据”。
再做召回排序,比如向量检索加关键词检索一起上。
还有就是模型输出后做一些规则校验。
面试官:
这就好多了,继续。
问题3:向量数据库、Embedding、语义检索怎么选型?
面试官:
企业知识库有岗位JD、面试题库、员工手册、培训文档,怎么做语义检索?
谢飞机:
先把文档切块,再做 Embedding,向量化后存到 Milvus、Chroma 或 Redis 这种向量库里。
用户提问时,把问题也向量化,然后做相似度检索。
再把召回结果拼到 prompt 里给大模型。
面试官:
那为什么有时候还要加 Elasticsearch?
谢飞机:
因为纯向量检索可能对关键词不敏感。
像岗位名、城市名、薪资范围这种强过滤条件,ES 做关键词和条件过滤更好。
可以做混合检索。
面试官:
不错,这个回答是可以的。
问题4:这个 AI 系统怎么做安全和监控?
面试官:
AI求职助手要接用户简历、企业内部文档,还要访问投递接口。安全和观测你怎么做?
谢飞机:
安全这块要做 Spring Security、JWT、OAuth2。
内部统一身份可以对接 Keycloak。
接口要做权限控制、审计日志、敏感字段脱敏。
传输层走 HTTPS,敏感数据加密,必要时可以用 Bouncy Castle 做一些加密能力。
面试官:
监控呢?
谢飞机:
Micrometer 打指标,Prometheus 采集,Grafana 看图。
日志进 ELK。
链路追踪用 Jaeger 或 Zipkin。
AI 这边还要看:
- 模型响应耗时
- Token 消耗
- 检索命中率
- 幻觉反馈率
- 工具调用成功率
面试官:
这题答得不错,终于像个干过 AI 项目的人了。
五、面试结束
面试官:
今天先到这里。你的基础还行,部分问题有实战痕迹,但复杂场景的深度还不够,尤其是 JVM 细化分析、消息一致性、AI治理细节这块还要再补。
你先回去等通知吧,如果后面流程推进,我们 HR 会联系你。
谢飞机:
好的李老师,我回去先把 JVM、Kafka、RAG 和工资期望一起复习一下。
六、详细答案解析:把业务场景和技术点讲透
1. 为什么招聘平台常用 Spring Boot + Spring MVC,而不是直接上 WebFlux?
业务背景
招聘平台的核心链路通常包括:
- 职位列表查询
- 简历投递
- 用户中心
- 企业后台管理
- 消息通知
这类业务大量依赖数据库事务、权限校验、缓存访问、第三方接口调用。
虽然并发高,但很多瓶颈不一定在 Servlet 模型,而是在数据库、缓存、下游依赖和系统治理。
技术结论
- Spring Boot + Spring MVC
- 生态成熟
- 与 MyBatis、JPA、Spring Security、Redis、Kafka 集成方便
- 团队开发维护成本低
- Spring WebFlux
- 更适合高 I/O、长连接、流式响应场景
- 例如:
- AI 对话流式输出
- WebSocket 消息流
- 大量并发调用外部服务
- SSE 推送
面试要点
面试时不要说谁“绝对更先进”,而是要强调:
- 业务类型
- 团队能力
- 生态成熟度
- 系统瓶颈位置
2. JVM 调优到底怎么排查 Full GC?
业务背景
在投递高峰期,短时间大量用户发起请求,会导致:
- 对象创建量暴增
- JSON 序列化压力大
- 大分页查询/大对象加载
- 缓存未命中导致数据库回源
- 线程池任务堆积
这些都可能引发 Young GC 频繁,进一步演变为 Full GC。
排查路径
先看监控
- CPU
- 内存
- GC 次数
- GC 停顿时间
- 堆使用趋势
看 GC 日志
- 是否老年代增长过快
- 是否存在频繁晋升
- 是否回收效果差
看堆 Dump
- 用 MAT、jmap 等工具分析大对象、可疑引用链
- 排查是否有内存泄漏
回到代码和业务
- 是否一次查太多数据
- 是否把简历全文、附件、富文本一次性加载进内存
- 是否缓存设计不合理
- 是否线程池队列堆积导致对象迟迟不释放
常见优化手段
- 合理设置
-Xms -Xmx - 优先使用 G1(Java 11/17 中常见)
- 避免大对象和超大分页
- 优化 JSON 序列化与对象拷贝
- 用 MapStruct 替代部分反射型转换
- 热点数据走 Redis / Caffeine 缓存
- 控制线程池大小和队列长度
3. Redis、Caffeine、Spring Cache 应该怎么组合?
业务背景
职位列表、热门职位、公司详情页、推荐标签这类接口通常读多写少,非常适合做缓存。
典型方案:二级缓存
- 一级缓存:Caffeine
- 本地缓存
- 访问快
- 适合热点高频数据
- 二级缓存:Redis
- 分布式共享缓存
- 多实例统一访问
- 封装层:Spring Cache
- 通过注解降低模板代码量
缓存问题治理
缓存穿透
- 查不到的数据也短暂缓存
- 布隆过滤器辅助
缓存雪崩
- 过期时间加随机值
- 热点数据预热
缓存击穿
- 热点 Key 加互斥锁/单飞机制
- 使用逻辑过期
面试加分点
能说出“本地缓存 + 分布式缓存 + 注解封装 + 过期策略 + 一致性治理”就比只会说 Redis 强很多。
4. MyBatis、JPA、Hibernate 怎么选?
选择思路
- MyBatis
- 复杂 SQL、报表、多表联查、分页优化更灵活
- JPA / Hibernate
- 标准 CRUD 开发效率高
- 适合领域模型比较稳定的业务
招聘系统中的建议
- 用户基础资料、企业资料:JPA/Hibernate 可考虑
- 职位搜索、投递报表、推荐数据分析:MyBatis 更实用
- 数据版本管理:Flyway / Liquibase
- 连接池:HikariCP 优先,现代项目里比 C3P0 更常见
5. 为什么投递主流程要拆同步和异步?
业务背景
用户点击“投递简历”后,可能涉及:
- 写投递记录
- 校验岗位状态
- 风控审核
- 发送站内信/短信/邮件
- 更新推荐系统画像
- 埋点统计
- AI 生成投递建议
如果全部同步执行,会导致:
- 接口耗时长
- 下游一挂全挂
- 用户体验差
拆分原则
同步做核心,异步做扩展
- 同步:
- 投递记录写库
- 关键业务校验
- 强一致风控校验
- 异步:
- 通知发送
- 埋点统计
- 推荐画像更新
- 离线特征计算
- AI 后处理任务
相关技术
- Kafka:高吞吐事件流
- RabbitMQ:灵活业务消息
- Pulsar:多租户、存算分离场景
- JMS / ActiveMQ:偏传统系统兼容场景
6. OpenFeign、Gateway、Resilience4j 怎么配合?
典型职责
- Gateway
- 统一入口
- 路由、鉴权、限流、黑白名单
- OpenFeign
- 服务间 HTTP 调用
- Resilience4j
- 熔断、限流、重试、隔离、超时控制
业务案例
AI简历优化服务平均耗时 3 秒,偶发超时 10 秒。
如果投递服务直接同步等待,就会拖慢整体链路。
优化方式
- Feign 设置合理超时
- Resilience4j 设置:
- timeout
- retry
- circuit breaker
- bulkhead
- 降级响应:
- “任务已提交,稍后查看结果”
面试亮点
不是只说“用了熔断”,而是说出:
- 哪类服务需要熔断
- 哪类服务适合降级
- 哪类服务不能重试(防止重复写)
7. Kafka、RabbitMQ、Pulsar 怎么选?
对比思路
Kafka
适合:
- 用户行为日志
- 推荐特征流
- 埋点数据
- 大数据消费链路
特点:
- 高吞吐
- 顺序分区
- 适合流式处理(Flink/Spark)
RabbitMQ
适合:
- 站内信
- 邮件
- 短信
- 业务通知
- 灵活路由
特点:
- 路由模型丰富
- 业务消息友好
Pulsar
适合:
- 多租户
- 大规模消息积压
- 存算分离架构
面试回答模板
不要说“哪个好”,要说“不同业务适合不同 MQ”。
8. AI 场景里,MCP、RAG、Agent 分别是什么?
RAG
检索增强生成
- 先从知识库中检索相关内容
- 再把检索结果提供给模型回答
适合:
- 岗位问答
- 企业制度问答
- 面试题解析
- 简历优化建议
Agent
智能代理
- 能理解目标
- 能拆解步骤
- 能调用工具
- 能在复杂流程中执行多步任务
适合:
- 帮用户做多轮求职任务
- 如“分析简历 -> 匹配岗位 -> 生成投递建议 -> 发送提醒”
MCP
模型上下文协议
- 统一模型和工具之间的调用方式
- 让模型通过标准协议访问外部能力
适合:
- 调职位搜索工具
- 调简历解析工具
- 调通知工具
- 调知识库检索工具
9. 如何减少 AI 幻觉?
常见方法
- RAG 提供真实上下文
- 混合检索
- 向量检索 + 关键词检索
- 结果引用
- 输出答案时附来源
- 检索不到就拒答
- 不要强行编
- Prompt 约束
- 明确“没有依据不要生成”
- 输出后校验
- 对薪资、地点、岗位要求等关键字段做规则校验
- 人工反馈闭环
- 收集错误答案,优化知识库和检索链路
面试亮点
只说“加 RAG”是不够的,必须说到:
- 检索质量
- 召回排序
- 拒答机制
- 引用来源
- 规则校验
10. 向量数据库、Embedding、语义检索如何落地?
基本流程
文档加载
- JD、题库、制度文档、FAQ、企业知识库
文档切块
- 按段落、主题、长度切分
Embedding 向量化
- 使用 OpenAI/Ollama 等 embedding 模型
向量存储
- Milvus / Chroma / Redis 向量能力
查询检索
- 用户问题向量化
- 做相似度召回
结果增强
- 拼接到 Prompt 中交给大模型
为什么还要 Elasticsearch?
因为:
- 城市
- 岗位名
- 薪资范围
- 公司名 这类字段更适合关键词和条件过滤。
所以很多系统采用: - ES 做精确过滤
- 向量库做语义召回
- 再做混合排序
11. AI 系统的安全与观测怎么做?
安全
- Spring Security:认证授权基础框架
- JWT:无状态认证
- OAuth2:第三方授权体系
- Keycloak:统一身份认证中心
- Bouncy Castle:加密能力支持
- 敏感字段脱敏:手机号、身份证、邮箱、简历附件
- 审计日志:谁查了什么数据、谁调用了什么工具
观测
- Micrometer:埋业务与系统指标
- Prometheus:采集指标
- Grafana:可视化
- ELK:日志分析
- Jaeger / Zipkin:分布式链路追踪
AI专项指标
- 模型响应耗时
- 首Token时间
- Token消耗
- 检索召回率
- 工具调用成功率
- 幻觉反馈率
- 用户追问率
- 知识库命中率
12. 其他技术栈怎么自然融入面试回答?
虽然文章主线不可能把用户列出的全部技术逐个展开,但在真实面试中可以这样理解:
- 构建工具:Maven 主流,Gradle 在部分项目更灵活,Ant 多见于遗留系统
- 模板引擎:Thymeleaf、FreeMarker、Velocity、JSP 多在后台管理或旧系统
- 日志框架:SLF4J 门面 + Logback/Log4j2 实现
- 序列化:Jackson 常规 JSON;Protobuf/gRPC 高性能;Avro 偏数据链路
- CI/CD:Jenkins、GitLab CI、GitHub Actions;容器化常配 Docker、Kubernetes
- 大数据:Kafka + Flink/Spark + Elasticsearch 常见于推荐、画像、日志分析
- 测试:JUnit5、Mockito、AssertJ 做单测;Selenium/Cucumber 适合集成和行为测试
- 工具库:Guava、Apache Commons、Lombok、MapStruct 都是提效利器
- 其他框架:Dubbo 在 Java 内部 RPC 常见;R2DBC 用于响应式数据库访问;WebSocket 适合实时消息推送
七、给小白的复习路线
如果你是 Java 面试初学者,可以按下面路线学:
Java基础 + JVM
- 内存结构、类加载、GC、常见排查
Spring Boot + Web
- MVC、参数绑定、拦截器、异常处理、Spring Security
数据库与缓存
- MyBatis、索引、事务、Redis、缓存问题
消息队列与微服务
- Kafka、RabbitMQ、OpenFeign、Gateway、熔断限流
监控与运维
- Prometheus、Grafana、ELK、链路追踪
AI融合能力
- RAG、MCP、Agent、向量检索、幻觉治理
学到这里,你就不只是“会写 CRUD”,而是能把业务场景、系统设计、稳定性、AI扩展能力串起来回答。