公司动态

在线教育大厂Java面试实录:JDK17、Redis分布式锁、Kafka选课削峰、Seata分布式事务、Spring AI+RAG智能学习助手,谢飞机三轮被虐哭(附完整答案解析)

📅 2026/8/25 23:28:37
在线教育大厂Java面试实录:JDK17、Redis分布式锁、Kafka选课削峰、Seata分布式事务、Spring AI+RAG智能学习助手,谢飞机三轮被虐哭(附完整答案解析)
在线教育大厂Java面试实录JDK17、Redis分布式锁、Kafka选课削峰、Seata分布式事务、Spring AIRAG智能学习助手谢飞机三轮被虐哭附完整答案解析前言大家好我是谢飞机一个平平无奇、热爱造梗的Java程序员。今天我又双叒叕来大厂面试了这次是号称「在线教育独角兽」的慧学在线——K12、职业教育、成人教育、AI学习助手四大业务线注册用户1.2亿、日活3000万、日课程播放量1亿次暑期/考研季峰值每秒50万次学习请求。面试官还是那位传说中的老K人称「技术面试人形测谎仪」。我的目标只有一个集齐第七张「回去等通知」卡片召唤神龙业务链路贯穿全程注册登录→课程浏览→试听→下单购买→直播上课→录播回放→作业提交→智能批改→AI学习助手。第一轮 · 筑基期Java基础 构建 ORM问题1你们项目为什么选JDK 17跟JDK 8比有什么优势谢飞机因为……17一起发一起发财嘛老K你干脆去算命咳咳正经说JDK 17是LTS长期支持版本比JDK 8多了record、文本块、switch表达式、密封类、ZGC等特性而且Spring Boot 3.x强制要求JDK 17起步大厂新项目肯定选它。老K哦还知道record那你说说JDK 8/11/17的区别。谢飞机JDK 8是老干妈稳JDK 11是保温杯加了点Local-Variable Syntaxvar和ZGC雏形JDK 17是折叠屏旗舰record一行顶十行老K虽然比喻接地气了点但方向对。过问题2JVM里Metaspace是什么OOM了怎么排查谢飞机Metaspace就是……元宇宙空间老K血压飙升不是是元空间JDK 8以后替代永久代存放类元数据默认使用本地内存不在堆里。OOM排查我有四板斧jps找进程 →jmapdump堆 →jstack看线程 →MAT分析口诀就是「jps-jmap-jstack-MAT一把梭」。老K总算有个能听的。那如果真OOM了你怎么处理谢飞机重启大法不行就256G内存拉满老K你搁这儿当网吧网管呢问题3Maven依赖冲突怎么解决谢飞机谁报错删谁删到不报错为止……老K你删的是同事吧咳咳正经做法是mvn dependency:tree看依赖树 → 找到冲突版本 → 用exclusion排除传递依赖 → 或者用dependencyManagementBOM统一版本管理避免「一人一个版本打起来」。老KBOM都懂还行。问题4MyBatis和JPA怎么选什么是N1问题谢飞机MyBatis是「SQL在手天下我有」适合复杂查询、报表统计JPA是「面向对象自动建表」开发快但性能黑洞——JPA一时爽排查火葬场N1就是查1个订单要额外查N条明细像奶茶店买一送一你点1杯它送你N杯内存直接爆炸。老K那怎么解决谢飞机JPA用EntityGraph / join fetch / batch sizeMyBatis用resultMap 关联查询/嵌套查询本质都是减少SQL次数。老K这个回答有水平夸那连接池呢谢飞机我们项目用HikariCP名字短、加载快、性能天花板它有两个黑科技FastList比ArrayList更快的列表去掉越界检查和ConcurrentBag无锁取连接借了还、还了借比LinkedBlockingQueue更高效。老K可以啊连源码都看了。第一轮勉强算你过第二轮 · 历劫期缓存 消息队列 分布式事务问题1缓存穿透、击穿、雪崩分别是什么怎么解决谢飞机这个我会背口诀**「防空、加锁、错峰」**穿透查一个不存在的key每次都打DB → 解决缓存空值布隆过滤器击穿热点key过期瞬间大量请求打DB → 解决互斥锁逻辑过期雪崩大量key同时过期/Redis宕机 → 解决过期时间加随机值集群高可用多级缓存。老K背得挺溜来点实战。问题2Redis分布式锁怎么做setnx裸奔行不行谢飞机setnx lock 1加锁用完del释放完事老K然后呢老K那锁过期了业务还没执行完怎么办谢飞机那就……再等等老K我血压上来了正经点用Redisson的看门狗WatchDog默认锁30秒后台线程每10秒自动续期业务没跑完锁就不会过期像我家楼下大黄狗一直守着骨头不撒嘴。老K那setnx裸奔有什么坑谢飞机三大坑①没有原子性setnx和expire分两步中间挂了锁永不过期②锁误删A的锁被B删了③不可重入、不可等待。所以要用 Redisson 的RLock它底层是Lua脚本保证原子性看门狗自动续期。问题3选课高峰期Kafka怎么保证消息不丢失谢飞机Kafka是KingKing不丢王冠老K你闭嘴正经答三环节分别保障——生产者acksall重试机制幂等性Brokermin.insync.replicas2副本机制 ** unclean.leader.election.enablefalse**消费者手动提交offset业务处理后提交消费幂等Redis去重/唯一键。老K这才对嘛选课削峰怎么做谢飞机用户点选课 → 直接返回「排队中」→ 请求打到Kafka → 消费者异步扣减库存生成订单→ WebSocket推送结果。把每秒50万的瞬时流量削成每秒几千的匀速处理这就是削峰填谷问题4下单扣库存发券跨服务怎么做分布式事务谢飞机撒把海盐……老K那是Seata对对对Seata它有四种模式就像乐事薯片四种口味海盐味AT、烧烤味TCC、番茄味SAGA、原味XA。我们选课场景用AT模式GlobalTransactional 一开自动反向生成UNDO_LOG业务无侵入失败自动回滚。老K那什么时候选TCC谢飞机AT解决不了跨数据库资源或非数据库资源比如调用第三方接口时就用TCCTry-Confirm-Cancel自己写补偿逻辑灵活但代码量大。总之口诀能AT就AT复杂就TCC长流程就SAGA强一致就XA。问题5注册中心Eureka、Nacos、Consul怎么选谢飞机看CAPEureka是AP可用性优先集群节点互相注册挂了也能继续服务Consul是CP一致性优先Raft选举Nacos既能AP又能CP动态切换还带配置中心国内大厂首选。老K可以第二轮算你渡劫成功第三轮 · 飞升期WebSocket 可观测性 Spring AI全家桶问题1直播课100万人同时在线WebSocket消息怎么推谢飞机for循环挨个发老K100万人你发到明年呜呜正确做法是NettyChannelGroup管理连接粘性会话让同一用户的连接落在同一台机器Redis Pub/Sub做跨节点广播心跳机制保活清理死连接。一台机器扛5万连接20台机器就是百万。问题2线上出故障你怎么快速定位谢飞机靠可观测性三件套PrometheusGrafana看指标QPS、RT、GC、CPUELK看日志关键字搜报错Jaeger/Zipkin看链路一次请求经过哪些服务、哪里慢。三件套一上比福尔摩斯还神老K这个比喻我给满分问题3Spring AI是什么怎么接入大模型谢飞机Spring AI就是「AI界的Spring Boot」提供ChatClient用起来跟JdbcTemplate一个味儿String answer chatClient.prompt() .user(帮我写一份考研复习计划) .call() .content();还有EmbeddingModel向量化、Function Calling让AI调工具、ChatMemory聊天记忆、Advisors提示词增强。问题4什么是RAG为什么大厂智能助手都要用它谢飞机RAG就是检索增强生成本质是先搜后答用户问「我们平台退课规则是什么」→ 先从向量数据库里语义检索出相关文档 → 拼进Prompt → 让大模型基于资料回答。解决大模型知识陈旧、胡说八道、不知道企业私域知识的问题。老K向量数据库怎么选谢飞机大数据量选Milvus分布式、十亿级向量轻量玩票选Chroma不想引入新组件就Redis Stack自带向量检索。Embedding模型可以用OpenAI也可以本地Ollama部署。问题5MCP、A2A、Agentic RAG 都是啥谢飞机MCP是「AI界的USB-C」把工具调用标准化一个接口接万物A2A是Agent和Agent之间对话的协议像「苹果对苹果」……老K是Agent-to-AgentAgentic RAG就厉害了它是AI侦探不是搜一次就答而是先规划→检索→评估→再检索→总结多轮循环直到信息足够才回答就像侦探破案线索不够绝不结案老K那AI幻觉怎么解决谢飞机AI幻觉是模型本质问题只能缓解不能消除就像你永远无法让杠精闭嘴。缓解手段①RAG给依据②限定回答范围不知道就说不知道③引用溯源附上文档链接④温度调低⑤人工审核兜底⑥知识库更新。老K……你今天发挥超常让我刮目相看。结局老K小谢啊今天聊得不错技术广度有了深度嘛……回去等通知吧。谢飞机好嘞第七张「等通知」卡片集齐召唤神龙默默把卡片收进工牌夹三个月后……谢飞机凭借文末答案解析成功入职竞品在线教育平台「学而优」工牌上赫然写着三个大字「等通知侠」而老K默默把谢飞机的简历从碎纸机里捡回来在背面写下了四个字「值得再约」。 文末答案解析小白学习版1. JDK 8 / 11 / 17 特性对比| 版本 | 关键特性 | 定位 | |------|---------|------| | JDK 8 | Lambda、Stream、Optional、新日期API | 经典老干妈存量最多 | | JDK 11 | var、ZGC雏形、HttpClient | 保温杯LTS过渡 | | JDK 17 | record、文本块、switch表达式、密封类、ZGC成熟、LTS| 折叠屏旗舰新项目首选 |选型逻辑Spring Boot 3.x 强制要求 JDK 17新项目直接上17老项目保守用8。2. JVM内存分区 OOM排查四板斧堆对象实例分新生代/老年代元空间 MetaspaceJDK 8起替代永久代存类元数据用本地内存注意不是Metaverse元宇宙虚拟机栈/本地方法栈栈帧、局部变量程序计数器字节码行号。OOM排查口诀jps找进程→jmap -dump导堆→jstack看线程→MAT分析大对象/泄漏。3. Maven/Gradle依赖冲突四板斧mvn dependency:tree看依赖树定位冲突版本exclusion排除传递依赖dependencyManagementBOM统一版本。4. MyBatis vs JPA N1 HikariCPMyBatisSQL可控适合复杂查询JPA/Hibernate开发快自动建表但容易踩N1查1主N从N1解决JPA用EntityGraph/join fetch/BatchSizeMyBatis用resultMap关联查询HikariCPFastList无越界检查的List ConcurrentBag无锁连接池实现极致性能。5. 缓存三兄弟对比表| 问题 | 现象 | 解决方案 | |------|------|---------| | 穿透 | 查不存在key打DB | 缓存空值、布隆过滤器 | | 击穿 | 热点key过期瞬间 | 互斥锁、逻辑过期 | | 雪崩 | 大量key同时过期/宕机 | 过期加随机值、集群、多级缓存 |口诀防空、加锁、错峰6. Redis分布式锁三大坑 Redisson看门狗// 正确姿势Redisson RLock RLock lock redisson.getLock(order:lock); lock.lock(30, TimeUnit.SECONDS); // 看门狗自动续期 try { // 业务逻辑 } finally { lock.unlock(); }三大坑非原子、锁误删、不可重入Redisson底层Lua保证原子性WatchDog每10秒续期默认30秒。7. Kafka三环节不丢失保障生产者acksall 重试 幂等Brokermin.insync.replicas2 副本机制消费者手动提交offset 消费幂等。8. 分布式事务四方案选型| 方案 | 一致性 | 侵入性 | 适用场景 | |------|--------|--------|---------| | XA/2PC | 强一致 | 高 | 银行等短事务 | | TCC | 最终一致 | 高 | 跨库/跨系统 | | 可靠消息 | 最终一致 | 中 | 异步解耦 | | Seata AT | 最终一致 | 低 | 微服务默认首选 |9. 注册中心CAP对比EurekaAP节点互相注册可用性优先ConsulCPRaft选举一致性优先NacosAP/CP可切换 配置中心国内首选。10. WebSocket百万连接架构Netty ChannelGroup 粘性会话 Redis Pub/Sub 广播 心跳保活单机5万连接横向扩展20台百万。11. 可观测性三件套指标Prometheus Grafana日志ELKElasticsearch Logstash Kibana链路Jaeger / Zipkin。12. Spring AI核心能力ChatClient对话、EmbeddingModel向量化、Function Calling工具调用、ChatMemory会话记忆、Advisors提示词增强。13. RAG双阶段全流程离线文档加载 → 切片 → Embedding → 存入向量库Milvus/Chroma/Redis Stack在线用户提问 → 向量化 → 语义检索 → 拼Prompt → LLM生成带依据的回答。14. MCP A2A Agentic RAGMCP模型上下文协议工具调用标准化三大原语工具/资源/提示词A2AAgent-to-Agent智能体互联协议Agentic RAG规划→检索→评估→再检索→总结的ReAct循环。15. AI幻觉的本质与6大缓解本质大模型是概率生成器不是数据库。缓解①RAG给依据 ②限定范围 ③引用溯源 ④降温度 ⑤人工兜底 ⑥知识库更新。本文纯属虚构技术点真实可查。祝各位面试顺利早日集齐「等通知」召唤神龙