产业互联网大厂Java面试实录:JDK17、Redis分布式锁、Kafka订单削峰、Seata分布式事务、Spring AI+RAG智能供应链助手,谢飞机三轮被虐哭(附完整答案解析)
产业互联网大厂Java面试实录JDK17、Redis分布式锁、Kafka订单削峰、Seata分布式事务、Spring AIRAG智能供应链助手谢飞机三轮被虐哭附完整答案解析一、面试开场面试官老K推了推金丝眼镜面前摆着一沓厚厚的简历你好我是产业互联网事业部技术负责人老K今天面试的是资深Java开发岗。我们平台连接上下游工厂、经销商、物流、仓储日处理订单千万级你先做个自我介绍吧。谢飞机穿着格子衫背着一个印着「Hello World」的帆布包紧张地搓手面试官好我叫谢飞机花名「Bug制造机」五年Java经验精通……精通「重启大法」和「CV大法」擅长把能跑的代码改到不能跑……老K嘴角抽搐……行那我们直接开始吧。二、第一轮 · 筑基期核心语言与工程基础老K我们产业互联网平台有大量老旧系统正在做技术升级。第一个问题你平时用哪个版本的JDKJDK 8、11、17有什么区别为什么Spring Boot 3.x强制要求JDK 17谢飞机我……我平时用JDK 8公司老项目都是8。8到11到17嗯……数字越大越新嘛8是经典款11是……是「三分糖去冰奶茶」17是「一起发」图个吉利Spring Boot 3.0强制JDK 17那肯定是因为……因为17比较贵显得公司有排面老K额头冒出青筋……下一个问题。线上有一台订单服务OOM了你怎么办谢飞机OOM啊简单先重启不行就加内存256G拉满再不行就……就换一台更大的机器老K……那如果重启之后又OOM了呢谢飞机那就再重启重启解决不了的问题就说明……说明该换工作了老K深呼吸……行吧下一个。你们的项目用Maven还是Gradle遇到过依赖冲突吗怎么解决谢飞机用Maven报错就mvn clean还报错就mvn clean install还报错就……删依赖谁报错删谁把同事写的代码也删了世界就清净了。老K手已经开始抖了……好的进入第二轮。三、第二轮 · 历劫期中间件与分布式核心老K我们的供应链系统有订单、库存、结算、物流多个服务数据库层你们用MyBatis还是JPA为什么谢飞机这个我知道MyBatis因为「JPA一时爽排查火葬场」MyBatis SQL自己写看得见摸得着就像自己做的饭难吃也知道难吃在哪。老K难得点了点头嗯这个回答还算有点道理。那连接池呢HikariCP、C3P0、Druid你了解吗为什么HikariCP是默认首选谢飞机HikariCP名字短加载快C3P0名字像科幻电影机器人Druid像游戏里的德鲁伊反正我用HikariCP因为它……因为它快老K……快在哪你知道吗谢飞机快在……快在名字短打字快老K血压飙升下一个我们大促时库存扣减经常超卖你会怎么做谢飞机加锁Redis分布式锁setnx一把梭先setnx lock 1拿到锁就扣库存完事del lock完美老K那如果拿到锁的服务挂了锁永远不会释放怎么办谢飞机啊这……那就……那就等它挂完再重启重启之后锁就没了老K……那如果锁提前过期了别的线程拿到锁两个线程同时扣库存呢谢飞机啊还有这种事那……那说明锁也想下班了老K手捂住胸口……行缓存呢缓存穿透、击穿、雪崩怎么解决谢飞机这个我会背过穿透用「布隆过滤器缓存空值」击穿用「互斥锁逻辑过期」雪崩用「过期时间加随机值多级缓存」口诀是「防空、加锁、错峰」老K惊讶哟这个背得挺熟不错继续加油。谢飞机得意地翘起二郎腿那是我可是背了三天三夜老K……下一个我们订单量高峰时数据库扛不住用Kafka削峰怎么保证消息不丢失谢飞机Kafka是「King」王者不丢消息大厂产品怎么会丢呢不会丢的老K……如果Broker宕机了呢谢飞机那就……那就说明它累了重启一下就好了老K深呼吸最后一个下单、扣库存、减余额、加积分跨服务怎么保证数据一致性谢飞机Seata撒点海盐就一致了Seata有四种模式AT、TCC、SAGA、XA就像……就像四种口味的薯片海盐味、烧烤味、番茄味、原味我全都要老K……那AT模式底层原理是什么谢飞机AT就是……就是「啊他」啊他帮我搞定了老K已经说不出话了……好的进入第三轮。四、第三轮 · 飞升期实时通信与AI应用老K我们平台有百万台工厂设备需要实时上报状态前端要实时看到设备监控大屏用什么方案谢飞机WebSocket长连接百万连接简单for循环挨个发消息一台服务器发不完就……就发两遍老K……百万连接你一台服务器扛得住内存够吗谢飞机不够就……就加内存256G拉满再不行就上「分布式for循环」每台服务器各发各的老K冷笑……那你告诉我服务端怎么知道消息该发给哪台设备谢飞机啊这……发给所有设备让设备自己认领谁的数据谁拿老K彻底无语……最后一个方向我们想做一个供应链智能助手让上下游企业用自然语言查库存、查订单、问物流你怎么做谢飞机这个我会Spring AIChatClient用起来跟JdbcTemplate一个味儿然后RAG先搜后答把企业文档、订单数据向量化存到向量数据库用户问问题先做语义检索再丢给大模型生成答案老K眼睛一亮哦这个说得不错那向量数据库你选什么谢飞机Milvus大数据量、高并发就选它小项目用ChromaRedis Stack也能做向量检索便宜够用Embedding可以用OpenAI的也可以用Ollama本地部署数据不出域老K点头可以那MCP是什么谢飞机MCP就是「AI界的USB-C」统一接口标准AI想调哪个工具就调哪个工具插上就能用像咱们的订单系统、库存系统只要实现MCP协议AI就能直接调用老K难得露出笑容那Agentic RAG和普通RAG有什么区别谢飞机普通RAG是「先搜后答」一条直线Agentic RAG是「AI侦探」先搜答案不够就再搜还能调工具查实时数据反复推理直到找到答案就像侦探查案线索不够就继续查老K鼓掌不错最后一个问题AI会一本正经地胡说八道也就是幻觉怎么解决谢飞机这个我知道幻觉只能缓解不能消除第一RAG给足上下文让它「有据可依」第二提示词约束让它「不知道就说不知道」第三温度参数调低第四输出做校验第五引用溯源答案带出处第六人工兜底审核老K沉默片刻看了看手表好了今天的面试就到这里。你回去等通知吧。谢飞机眼睛一亮太好了这已经是我集齐的第七张「等通知」卡片了再集一张就能召唤神龙了老K小声嘀咕……你回去记得把HikariCP的FastList、Redisson看门狗、Kafka的acksall、Seata AT原理、JWT黑名单背一下下次面试用得上。谢飞机边收拾包边嘟囔HikariCP……FastList……看门狗……这是啥啊……算了先点个外卖压压惊。彩蛋三个月后谢飞机靠着本文的答案解析成功入职了竞品产业互联网公司成了老K的对手公司的技术骨干。五、文末答案解析小白学习版16大考点考点1JDK 8/11/17特性对比与选型| 版本 | 核心特性 | 适用场景 | |------|---------|---------| | JDK 8 | Lambda、Stream、Optional、新日期API、默认方法 | 存量系统维护生态最成熟 | | JDK 11 | 新增String API、HTTP Client、ZGC实验、Epsilon垃圾回收器 | 中间版本LTS云厂商主流 | | JDK 17 | 密封类、模式匹配、Switch表达式增强、ZGC转正、Spring Boot 3.x强制 | 新项目首选Spring Boot 3.x要求 |选型建议新项目直接JDK 17 Spring Boot 3.x老项目至少升级到11最终向17看齐。考点2JVM内存分区与OOM排查四板斧内存分区堆对象实例、虚拟机栈栈帧局部变量、本地方法栈、方法区/元空间类元数据、程序计数器。OOM排查四板斧口诀jps找进程PIDjmap -dump:formatb,fileheap.hprof pid导出堆快照jstack pid看线程栈找死锁、高CPU线程用MAT分析堆快照找「内存泄漏嫌疑人」——大对象、集合膨胀、未释放连接考点3Maven/Gradle依赖冲突四板斧mvn dependency:tree查看依赖树mvn dependency:analyze分析未使用/重复依赖使用exclusion排除冲突传递依赖引入BOMBill of Materials统一管理版本如 Spring Cloud BOM考点4MyBatis vs JPA HikariCP核心原理MyBatisSQL手写灵活可控适合复杂查询、报表、产业互联网的多表联查场景缺点是要自己维护SQL。JPA/Hibernate对象关系映射开发快但复杂查询容易产生N1问题查1条主记录再查N条关联排查困难。HikariCP为什么快FastList自定义ArrayList优化get()移除操作避免ArrayList.remove()的从头扫描ConcurrentBag无锁读设计借还连接性能极高字节码精简、无反射代理启动更快考点5缓存穿透/击穿/雪崩对比表| 问题 | 现象 | 解决方案 | |------|------|---------| | 穿透 | 查不存在的key直接打DB | 布隆过滤器 缓存空值短TTL | | 击穿 | 热点key过期瞬间大量请求打DB | 互斥锁 逻辑过期异步重建 | | 雪崩 | 大量key同时过期 | 过期时间加随机值 多级缓存本地Redis |口诀防空穿透、加锁击穿、错峰雪崩。考点6Redis分布式锁三大坑 Redisson看门狗三大坑setnx后进程崩溃锁永不释放 → 必须设置过期时间set key value NX EX锁提前过期A还没执行完B拿到锁 → 用看门狗自动续期A删锁时误删B的锁 → value用UUID删除前先比较Lua脚本保证原子性Redisson看门狗机制默认30秒有效期每10秒自动续期只要业务没执行完锁就不会过期服务宕机后锁自然过期释放避免死锁。考点7Kafka三环节不丢失保障生产者端acksall所有副本确认retries重试 幂等enable.idempotencetrueBroker端min.insync.replicas2至少2个副本同步replication.factor3副本数≥3消费者端手动提交offset业务处理成功后再提交 消费幂等用唯一业务ID去重考点8分布式事务四方案选型| 方案 | 原理 | 适用场景 | |------|------|---------| | 2PC/XA | 两阶段提交强一致 | 短事务、跨库操作少 | | TCC | Try-Confirm-Cancel业务补偿 | 资金类、需要灵活控制 | | 可靠消息最终一致 | MQ 本地消息表 | 下单、积分等异步场景 | | Seata AT | 自动生成回滚SQL无侵入 | 微服务多库事务首选 |Seata AT原理事务开始记录「前镜像」提交前记录「后镜像」失败时根据镜像自动生成反向SQL回滚业务代码零侵入。考点9注册中心CAP对比EurekaAP集群节点互相注册不选举网络分区时优先可用性NacosCPAP切换支持配置中心注册中心默认AP临时实例/CP持久实例ConsulCP强一致Raft协议支持多数据中心考点10WebSocket百万连接架构Netty作为通信底座NIO非阻塞单机可支撑数万连接ChannelGroup管理连接避免for循环全量发送粘性会话网关层保证同一设备的WebSocket请求路由到同一节点Redis Pub/Sub跨节点广播消息设备在哪个节点都能收到心跳机制定期ping/pong清理死连接考点11可观测性三件套指标MetricsPrometheus采集 Grafana可视化监控QPS、延迟、错误率日志LogsELK StackElasticsearch Logstash KibanaLogback/SLF4J输出结构化日志链路追踪TracesJaeger/Zipkin配合Micrometer Spring Cloud Sleuth排查跨服务调用考点12JWT痛点与双Token方案痛点JWT无状态服务端无法主动让Token失效泄露后有效期内的Token无法作废。方案Access Token短期15分钟 Refresh Token长期7天 Redis黑名单登出/改密时加入黑名单拦截失效Token。考点13Spring AI核心能力表| 能力 | 说明 | |------|------| | ChatClient | 统一对话客户端类似JdbcTemplate | | Embedding | 文本向量化接入OpenAI/Ollama模型 | | Function Calling | 大模型调用Java方法工具执行框架 | | ChatMemory | 会话记忆多轮对话上下文管理 | | Advisors | 提示填充、RAG检索增强、安全过滤 |考点14RAG离线/在线双阶段全流程离线阶段知识入库文档加载 → 切片 → Embedding向量化 → 存入向量数据库Milvus/Chroma/Redis在线阶段问答用户问题 → Embedding向量化 → 语义检索TopK → 拼接Prompt提示填充→ 大模型生成带引用的答案向量数据库选型Milvus海量高并发、Chroma轻量开发、Redis Stack复用Redis基础设施。考点15MCP三大原语 A2A Agentic RAGMCP模型上下文协议tools/list列出AI可用的工具tools/callAI调用工具resources暴露数据资源定位AI界的USB-C统一工具调用标准化让AI能接入任意系统订单、库存、物流。A2AAgent-to-Agent智能体之间通信协议多个Agent协作完成复杂工作流。Agentic RAG vs 普通RAG普通RAG「搜一次答一次」Agentic RAG用ReAct循环推理→行动→观察→再推理检索不足时自动调工具、多轮检索像侦探一样追查答案。考点16AI幻觉本质与6大缓解手段本质大模型基于概率生成文本对不确定的知识会「编造」且无法彻底消除。6大缓解手段RAG检索增强给足上下文提示词约束「不知道就说不知道」降低temperature参数输出校验/规则过滤答案引用溯源附文档出处人工审核兜底高风险场景后记本文为系列面试实录之一关注我看谢飞机如何集齐七张「等通知」卡片召唤神龙 也祝各位读者面试都能拿到满意的Offer