场景设定
公司:智慧城市独角兽「智城云脑」
业务线:城市运行管理中心(IOC)、智慧交通、智慧安防、智慧社区、智慧政务、AI城市助手六大业务线。
规模:覆盖300城、注册市民4亿、日活1.2亿、日办件量8000万件、高峰期每秒80万次事项请求、50万个政务窗口/自助终端实时在线。
业务链路:注册登录→实名认证→事项申报→智能分办→审批流转→证照签发→进度推送→好差评→AI城市助手,贯穿全程。
第一轮 · 筑基期(基础语言与平台)
老K(推了推眼镜,面无表情):谢飞机同学是吧?先问点基础的。我们「智城云脑」的新项目准备选型,团队在纠结 JDK 8 还是 JDK 17,你怎么看?
谢飞机(挺直腰板):17好啊!17=一起发,招财!
老K:(嘴角抽搐)……我是问你技术上的理由。
谢飞机:哦哦,17是 LTS 长期支持版本,有 record 语法、文本块、switch 表达式,还有 ZGC 低延迟垃圾回收器。而且 Spring Boot 3.x 要求 JDK 17 起步,新项目选 17 没毛病!
老K:(微微点头)不错,总算说了句人话。那 JDK 8、11、17 你怎么形象地理解?
谢飞机:JDK 8 是老干妈,经典永流传;JDK 11 是保温杯,中规中矩;JDK 17 是折叠屏手机,新潮又能打!
老K:(忍笑)行吧。那 JVM 运行时数据区都有哪些?Metaspace 是什么?
谢飞机:就是……堆、栈、方法区……哦不对,Metaspace 就是那个元宇宙空间!
老K:(血压飙升,拍桌)Metaspace 是元空间!不是 Metaverse!它是 JDK 8 之后用来存类元数据的地方,替代了永久代,用的是本地内存!
谢飞机:(擦汗)对对对,类元数据、常量池、静态变量这些……
老K:生产环境 OOM 了你怎么排查?
谢飞机:重启大法好!不够再加内存,256G 拉满!
老K:(扶额)你是网吧网管吗?给我说正经的排查流程!
谢飞机:呃……jps 查进程,jmap 导堆,jstack 看线程,再用 MAT 分析大对象……
老K:还行。最后一个基础题,Maven 依赖冲突怎么办?
谢飞机:谁报错删谁!上次我把同事代码也删了,被追了三条街……
老K:(无语)用mvn dependency:tree查依赖树,用<dependencyManagement>统一版本,用 BOM 管理,实在不行 exclude 排除。记住了!
第二轮 · 历劫期(持久层 / 缓存 / 消息 / 分布式事务)
老K:我们政务系统要对接几百个委办局的数据,ORM 你选 MyBatis 还是 JPA?
谢飞机:JPA 一时爽,排查火葬场!我选 MyBatis,SQL 写哪儿都清清楚楚,复杂报表查询不虚。
老K:(赞许)不错,复杂场景 MyBatis 确实更可控。那 MyBatis 的 N+1 查询问题你知道吗?
谢飞机:知道!就像奶茶店买一送一,你查一个订单,结果把订单里所有商品都查了一遍,1 条 SQL 变 N+1 条,数据库直接被打哭!
老K:嗯,用关联查询或者嵌套结果映射解决。那连接池呢,HikariCP 为什么快?
谢飞机:因为……名字短,加载快!
老K:(青筋暴起)HikariCP 快是因为用了FastList替代 ArrayList 避免越界检查,ConcurrentBag做无锁化的连接获取,字节码精简,还有代理类优化!
谢飞机:学到了学到了!
老K:你们缓存怎么用的?Redis 穿透、击穿、雪崩讲讲。
谢飞机:这个我会!口诀:防空、加锁、错峰!穿透——缓存空值 + 布隆过滤器;击穿——互斥锁 + 逻辑过期;雪崩——过期时间加随机值 + 多级缓存 + 限流降级!
老K:(惊讶)哟,这波背得挺溜!那分布式锁呢,你怎么实现?
谢飞机:简单!SETNX key value一把梭!
老K:那你锁过期了业务没执行完怎么办?锁被别的线程释放了怎么办?
谢飞机:呃……那就……再抢一次?
老K:用Redisson 看门狗!默认 30 秒锁,后台有个看门狗线程每 10 秒续期,业务没跑完就续命,跑完就释放。还要用 UUID + 线程 ID 做 value 标识,释放时用 Lua 脚本比较再删,防止误删别人的锁!
谢飞机:哦!就像楼下那只大黄狗,主人不回来它就一直守着!
老K:(叹气)……行吧。高峰时期办件量每秒 80 万,你怎么削峰?
谢飞机:上 Kafka!Kafka 就是 King,从来不丢王冠!
老K:(怒吼)那是 Kafka 的 K 不是 King!给我说三环节不丢失!
谢飞机:生产者acks=all+ 重试;broker 端min.insync.replicas=2+replication.factor=3;消费者手动提交 offset + 幂等消费!
老K:(平复情绪)不错。那跨服务的分布式事务呢,比如市民提交一个事项要同时扣费、发证、通知?
谢飞机:Seata!海盐烧烤味、番茄味、原味、薯片……
老K:(拍桌)那是乐事薯片!Seata 四种模式是XA/2PC、AT、TCC、SAGA!XA 是数据库强一致,AT 是自动补偿,TCC 是 Try-Confirm-Cancel 手动补偿,SAGA 是长事务编排!
谢飞机:哦哦,薯片口味对应上了,海盐=XA、烧烤=AT、番茄=TCC、原味=SAGA!
老K:(放弃挣扎)……那注册中心 Eureka、Nacos、Consul 你怎么选?
谢飞机:Eureka 是 AP,服务注册发现快但数据可能不一致;Nacos 支持 AP/CP 切换,还带配置中心;Consul 是 CP,强一致,适合对一致性要求高的场景!
老K:(点头)总算有个像样的回答了。
第三轮 · 飞升期(WebSocket / 可观测性 / Spring AI)
老K:我们 IOC 大屏要同时推送 100 万市民的办件进度,WebSocket 怎么做?
谢飞机:for 循环挨个发!
老K:(一口茶喷出来)100 万连接你 for 循环?线程直接炸!用Netty做 WebSocket 服务,ChannelGroup管理连接,粘性会话让同一用户打到同一节点,跨节点用Redis Pub/Sub广播,心跳机制保活,全链路异步非阻塞!
谢飞机:大厂果然是大厂……
老K:线上出了问题你怎么快速定位?
谢飞机:可观测性三件套!Prometheus采集指标 +Grafana可视化大屏,ELK收集日志,Jaeger/Zipkin做全链路追踪。比福尔摩斯还神!
老K:(眼前一亮)这个答得不错!最后一个方向,你们要上 AI 城市助手,Spring AI 了解吗?
谢飞机:了解!Spring AI 就是给 Java 开发者的 AI 框架,ChatClient用起来跟JdbcTemplate一个味儿,一行代码调大模型!
老K:那市民问“社保怎么补缴”,模型没学过你们的数据怎么办?
谢飞机:上RAG!先搜后答!把政策文档切块、向量化存到向量数据库,用户提问时先语义检索,再把结果塞进提示词让模型基于资料回答!
老K:向量数据库怎么选?
谢飞机:Milvus适合大规模、高并发生产环境;Chroma轻量级、开发调试方便;Redis Stack的向量能力适合想复用现有 Redis 的场景。Embedding 模型可以用 OpenAI 或者本地 Ollama!
老K:(惊喜)不错啊!那 MCP 和 A2A 是什么?
谢飞机:MCP 就是AI 界的 USB-C,把模型和外部工具、数据源统一标准化接入;A2A 是 Google 的 Agent 间通信协议,让不同 Agent 互相协作!
老K:那 Agentic RAG 呢?
谢飞机:就是给 RAG 装上大脑!普通 RAG 是“检索→回答”一条道走到黑,Agentic RAG 会自我反思、多轮检索、动态调用工具,查不到就换关键词再查,还能调用 API 查实时数据,就像个 AI 侦探,不查到真相不罢休!
老K:(站起来鼓掌)这轮超常发挥!最后一个问题,AI 幻觉怎么解决?
谢飞机:AI 幻觉是模型编造不存在的知识,只能缓解不能消除——就像你永远无法让杠精闭嘴!可以用 RAG 提供可靠依据、提示词约束“不知道就说不知道”、温度调低、输出校验、知识库兜底、人工审核。
老K:(沉默良久)……谢飞机同学,今天的面试就到这儿吧。你的表现……很有戏剧性。先回去等通知吧。
谢飞机:(搓手)好的好的,这是我集齐的第七张“等通知”卡了,再集一张就能召唤神龙了!
彩蛋
三个月后,谢飞机入职了竞品智慧城市平台「智城互联」,工牌上赫然写着——「等通知侠」。
而老K默默从碎纸机旁捡回了那份简历,在背面写下四个字:「值得再约」。
📚 文末答案解析(小白学习版,16 大考点)
1. JDK 8 / 11 / 17 特性对比表
| 版本 | 核心特性 | 定位 | |------|---------|------| | JDK 8 | Lambda、Stream、Optional、新的日期时间 API | 经典老干妈,存量系统主力 | | JDK 11 | 局部变量类型推断(var)、ZGC 引入、HttpClient | 保温杯,过渡版本 | | JDK 17 | record、文本块、switch 表达式、密封类、ZGC 成熟 | LTS,Spring Boot 3.x 基线 |
选型逻辑:新项目直接 JDK 17 + Spring Boot 3.x;存量系统若依赖老框架(如 Spring 5 之前)则保守用 JDK 8/11。
2. JVM 运行时数据区 + Metaspace
- 线程私有:虚拟机栈、本地方法栈、程序计数器
- 线程共享:堆(对象实例)、方法区(JDK 8 后由Metaspace实现,使用本地内存)
- Metaspace 不是 Metaverse!它存类元数据、常量池、静态变量,默认无上限,需用
-XX:MaxMetaspaceSize限制
OOM 排查四板斧口诀:jps找进程 →jmap导堆 →jstack看线程 →MAT分析大对象。
3. Maven / Gradle 依赖冲突三板斧
mvn dependency:tree查依赖树,定位冲突<dependencyManagement>或 BOM 统一版本- 精准
exclude排除传递依赖
4. MyBatis vs JPA + N+1 问题
- MyBatis:SQL 全掌控,适合复杂报表、多表关联、SQL 调优场景(政务系统首选)
- JPA/Hibernate:开发效率高,适合 CRUD 为主的简单领域模型
- N+1 问题:查主表 1 次 + 每个子记录查 1 次 = N+1 次查询。解决:JOIN FETCH / 嵌套结果映射 / @EntityGraph / 批量抓取
5. HikariCP 为什么快(FastList + ConcurrentBag)
- FastList:去除 ArrayList 的越界检查,提升 get/remove 性能
- ConcurrentBag:无锁化连接获取/归还,ThreadLocal 缓存 + 全局共享
- 字节码精简、代理类优化、默认参数合理
6. 缓存穿透 / 击穿 / 雪崩对比表
| 问题 | 现象 | 解法 | |------|------|------| | 穿透 | 查不存在的数据打到 DB | 缓存空值 + 布隆过滤器 | | 击穿 | 热点 key 过期瞬间高并发打 DB | 互斥锁 + 逻辑过期 | | 雪崩 | 大量 key 同时过期 | 过期时间加随机值 + 多级缓存 + 限流降级 |
口诀:防空、加锁、错峰
7. Redis 分布式锁三大坑 + Redisson 看门狗
// 正确姿势:Redisson 一把梭 RLock lock = redissonClient.getLock("order:" + orderId); // 看门狗默认 30s 锁,每 10s 自动续期 lock.lock(10, TimeUnit.SECONDS); try { // 业务逻辑 } finally { lock.unlock(); }三大坑:
- 锁过期业务未完成 → 看门狗续期
- 误删他人锁 → value 存 UUID+线程ID,Lua 脚本比较再删
- 主从切换丢锁 → RedLock / 多节点加锁
8. Kafka 三环节不丢失保障
- 生产者:
acks=all+retries重试 + 幂等enable.idempotence=true - Broker:
replication.factor=3+min.insync.replicas=2+unclean.leader.election.enable=false - 消费者:手动提交 offset + 消费成功后提交 + 业务幂等(唯一键去重)
9. 分布式事务四方案选型表
| 方案 | 原理 | 适用场景 | |------|------|---------| | XA/2PC | 数据库层两阶段提交,强一致 | 并发低、一致性极高(金融) | | Seata AT | 自动生成补偿 SQL,无侵入 | 中低并发、改造少 | | TCC | Try-Confirm-Cancel 手动补偿 | 高并发、业务可拆分 | | SAGA | 长事务状态机编排 | 跨多服务长链路 |
10. 注册中心 CAP 对比
| 注册中心 | 模型 | 特点 | |---------|------|------| | Eureka | AP | 注册快、容忍分区,数据可能短暂不一致 | | Nacos | AP/CP 可切换 | 注册中心 + 配置中心二合一 | | Consul | CP | 强一致,Raft 协议,适合一致性敏感场景 |
11. WebSocket 百万连接架构
- Netty做高性能 WebSocket 网关(异步非阻塞)
- ChannelGroup统一管理连接
- 粘性会话:同一用户路由到同一节点
- 跨节点广播用Redis Pub/Sub或 Kafka
- 心跳机制(ping/pong)保活 + 空闲检测剔除
12. 可观测性三件套(指标 / 日志 / 链路)
- 指标:Micrometer + Prometheus + Grafana
- 日志:SLF4J + Logback + ELK(Elasticsearch 存储、Logstash 采集、Kibana 可视化)
- 链路:Jaeger / Zipkin 全链路追踪,traceId 串联
13. Spring AI 核心能力表
| 能力 | 说明 | |------|------| | ChatClient | 类似 JdbcTemplate 的 AI 对话客户端 | | Embedding | 文本向量化,接入 OpenAI/Ollama | | ChatMemory | 聊天会话内存管理(窗口/摘要) | | Function Calling | 工具执行框架,模型调用外部 API | | Advisors | 提示填充、RAG 检索、安全过滤等增强 |
14. RAG 离线 / 在线双阶段全流程
离线(文档加载):文档加载 → 切块 → Embedding 向量化 → 存入向量数据库(Milvus/Chroma/Redis Stack)
在线(问答):用户提问 → 向量化 → 语义检索 TopK → 组装提示词 → LLM 生成带依据回答
15. MCP + A2A + Agentic RAG
- MCP(模型上下文协议):AI 界的 USB-C,三大原语——工具(Tools)、资源(Resources)、提示词(Prompts),标准化模型与外部系统交互
- A2A(Agent-to-Agent):Google 提出的 Agent 间通信协议,让多个 Agent 协同完成复杂工作流
- Agentic RAG:RAG + Agent 的 ReAct 循环(思考→行动→观察→再思考),多轮检索、动态调工具、自我纠错,适合企业文档问答、智能客服等复杂场景
16. AI 幻觉本质与 6 大缓解手段
本质:大模型基于概率生成,遇到知识盲区会“一本正经地胡说八道”。
- RAG 提供可靠知识依据
- 提示词约束(“不知道就说不知道”)
- 降低 temperature
- 输出校验 + 引用溯源
- 知识库兜底 + 人工审核
- 持续微调 + 评估监控
核心认知:AI 幻觉只能缓解,不能彻底消除——就像你永远无法让杠精闭嘴。
(全文完,感谢观看。如果觉得有用,点个赞收藏,我们下期面试现场再见!)