供应链金融大厂Java面试实录:JDK17、Redis分布式锁、Kafka融资削峰、Seata分布式事务、Spring AI+RAG智能风控,谢飞机三轮被虐哭(附完整答案解析)
场景设定:供应链金融大厂「链融科技」——核心企业信用背书、应收账款转让、在线融资、智能风控,日放款额超百亿。业务链路「融资申请→风控审核→合同签署→放款→回款监控」贯穿全程。
第一轮 · 筑基期(核心语言与JVM)
面试官老K(推了推眼镜,面无表情):谢飞机同学是吧?先聊点基础的。我们「链融科技」新系统要全面升级,你们项目JDK用的什么版本?讲讲JDK 8、11、17三个LTS版本的区别,你会怎么选?
谢飞机(挺直腰板,自信满满):我们项目用的JDK 8!因为……嗯……网上资料多,报错好搜!11和17嘛,一个是「双十一」,一个是「一起发」,数字都挺吉利的!
老K(嘴角抽动):……那再问你,JVM内存分区了解吗?线上OOM了你一般怎么排查?
谢飞机(眼睛一亮):这个我熟!OOM就重启,重启不行就加内存,256G拉满,再不行换机器!
老K(深吸一口气):换机器?你当买手机呢。行,那Maven和Gradle的区别?依赖冲突怎么解决?
谢飞机(挠头):Gradle……名字短,敲起来快!依赖冲突?谁报错就删谁!
老K(低头在简历上写了什么):……好,第二轮。
第二轮 · 历劫期(存储与中间件)
老K:我们风控系统要存海量融资单据,你们ORM用的什么?MyBatis和JPA怎么选?
谢飞机:我们用的MyBatis!JPA一时爽,排查火葬场!
老K(微微点头):嗯,这个说得倒没错。那连接池呢?HikariCP为什么快?
谢飞机:名字短,加载快!
老K(忍住了):……我们放款接口QPS高,同一个融资单可能被重复提交,Redis分布式锁怎么做?
谢飞机(抢答):setnx!一行代码搞定!
老K:那锁过期了怎么办?锁被别人释放了怎么办?
谢飞机(懵):啊?锁还会过期?那……那让业务跑快点?
老K(叹气):……那缓存穿透、击穿、雪崩呢?
谢飞机(背课文式):穿透用空值布隆,击穿用互斥锁,雪崩用随机过期!
老K(难得露出赞许):不错,这个记得挺牢。那Kafka怎么保证消息不丢失?
谢飞机(拍胸脯):大厂产品,不会丢!
老K(额头青筋):……那分布式事务呢?我们融资放款要扣企业额度、记账、发通知,怎么保证一致性?
谢飞机(灵光一闪):Seata!海盐!撒点盐菜就咸了,撒点Seata数据就一致了!
老K(沉默了十秒):……第三轮。
第三轮 · 飞升期(实时通信与AI)
老K:放款进度要实时推送给客户,WebSocket怎么做?我们同时在线几十万连接。
谢飞机(自信):简单!for循环挨个发!
老K(眼神死亡):……那监控呢?日志、指标、链路,怎么搞?
谢飞机(突然流利):ELK收集日志,Prometheus+Grafana出指标,Jaeger查链路!
老K(愣了一下):难得说得这么利索。那系统安全呢?JWT和OAuth2什么区别?
谢飞机:JWT就是token,服务端不用存!失效?等它自己过期呗!
老K:……那我们最后聊聊AI。我们要做智能风控助手,Spring AI + RAG怎么做?
谢飞机(来了精神):这个我会!先搜后答!把融资合同、尽调报告切碎,向量化存起来,用户问问题先语义检索再让大模型回答!
老K(眼前一亮):不错,那向量数据库选型呢?
谢飞机(卡壳):向量……就是数学课上那个箭头?数据库……MySQL存箭头?
老K(扶额):……MCP协议了解吗?
谢飞机(一秒接梗):MCP!麦当劳Plus会员!点餐优惠!
老K(彻底放弃):那AI幻觉呢?智能风控答错了谁负责?
谢飞机(难得正经):幻觉只能缓解,不能消除。要加RAG检索、加引用溯源、加人工复核兜底。
老K(站起来,语气平静):好,今天的面试就到这儿。你回去等通知吧。
谢飞机(边退边说):好的好的!等我集齐七张「等通知」卡片,就能召唤神龙了!
📚 文末完整答案解析(小白学习版)
考点1:JDK 8/11/17选型
- JDK 8:Stream/Lambda/Optional,生态最成熟,但老矣;
- JDK 11:新增var、ZGC(实验)、HttpClient正式版,LTS;
- JDK 17:Spring Boot 3.x强制要求,密封类、增强Switch、ZGC转正、虚拟线程(预览);
- 选型建议:新项目直接用17,老项目8迁17注意
--add-opens和第三方库兼容。
考点2:JVM内存分区与OOM排查
- 堆:对象实例,GC主战场;栈:线程私有,存局部变量,
StackOverflowError;元空间:类元数据,本地内存; - OOM排查四板斧:
jps找进程 →jmap -dump导堆 →jstack看线程 → MAT分析大对象; - 别迷信重启:重启治标不治本,要找到内存泄漏源头。
考点3:Maven vs Gradle + 依赖冲突
- Maven:XML配置,稳定成熟;Gradle:Groovy/Kotlin DSL,构建快,支持增量编译;
- 依赖冲突四板斧:① 就近原则;② 第一声明优先;③
exclusions排除;④dependencyManagement统一版本; - 大招:用
mvn dependency:tree/gradle dependencies看依赖树。
考点4:MyBatis vs JPA
- MyBatis:SQL手写,灵活可控,适合复杂查询、金融风控报表;
- JPA/Hibernate:CRUD快,但N+1问题要小心(用
@EntityGraph或join fetch); - 面试金句:JPA一时爽,排查火葬场——复杂查询性能难调。
考点5:HikariCP为什么快
- FastList:替代ArrayList,优化
get/remove; - ConcurrentBag:无锁读,线程本地缓存;
- 字节码精简 + 极力避免锁竞争,性能碾压C3P0/DBCP。
考点6:Redis分布式锁三大坑
- 坑1:setnx裸奔无过期时间 → 死锁;
- 坑2:锁过期但业务没执行完 → 用Redisson看门狗自动续期;
- 坑3:A的锁被B释放 → value存唯一标识(UUID),释放前Lua脚本校验;
- 正确姿势:
SET key value NX EX 30+ 看门狗续期 + Lua原子释放。
考点7:缓存穿透/击穿/雪崩
- 穿透:查不存在的数据 → 缓存空值 / 布隆过滤器;
- 击穿:热点Key过期瞬间高并发打DB → 互斥锁 / 逻辑过期;
- 雪崩:大量Key同时过期 → 过期时间加随机值 / 多级缓存;
- 口诀:穿用空值布隆,击穿用锁,雪崩加随机。
考点8:Kafka消息不丢失三环节
- 生产端:
acks=all+ 重试机制; - Broker端:
min.insync.replicas+ ISR副本; - 消费端:手动提交offset + 消费幂等(唯一ID去重);
- 融资申请场景:先落库再发MQ,消费端做幂等表。
考点9:分布式事务四方案
- 2PC:强一致,性能差,适合短事务;
- TCC:Try/Confirm/Cancel,业务侵入大;
- 可靠消息最终一致性:本地消息表 + MQ,适合融资放款场景;
- Seata:AT模式自动补偿,上手快,注意全局锁冲突。
考点10:OpenFeign vs gRPC + Resilience4j
- OpenFeign:HTTP/JSON,调试方便;gRPC:HTTP/2 + Protobuf,性能高,适合内部服务;
- Resilience4j三件套:熔断(CircuitBreaker)、限流(RateLimiter)、重试(Retry)。
考点11:WebSocket百万连接架构
- 不能用for循环挨个发:O(n)阻塞且会打爆内存;
- 正确姿势:Netty + ChannelGroup管理连接,粘性会话(sticky session),跨节点用Redis Pub/Sub广播,心跳保活(30s ping/pong)。
考点12:可观测性三件套
- 指标:Prometheus + Micrometer + Grafana;
- 日志:Logback/SLF4J → Filebeat → ELK;
- 链路:Jaeger/Zipkin(OpenTelemetry标准)。
考点13:JWT vs OAuth2
- JWT:无状态,但无法主动失效——用Redis黑名单 + 短有效期(15min)+ refresh_token双token方案;
- OAuth2:授权码流程,适合第三方登录;Keycloak做统一认证中心。
考点14:Spring AI + RAG全流程
- 离线阶段:文档加载(PDF/Word融资合同)→ 切分 → Embedding(OpenAI/Ollama)→ 存向量库;
- 在线阶段:用户问题 → Embedding → 语义检索(Milvus/Chroma/Redis Stack)→ TopK拼进Prompt → LLM生成带引用的回答;
- 选型表:Milvus(海量高并发)、Chroma(轻量开发)、Redis Stack(复用现有Redis)。
考点15:MCP协议 + Agentic RAG + AI幻觉
- MCP三大原语:工具(Tools)、资源(Resources)、提示(Prompts),让LLM标准化调用外部能力——AI界的USB-C;
- A2A:智能体与智能体之间的通信协议;
- Agentic RAG:Agent自己决定搜什么、搜几次、怎么用结果(ReAct循环:思考→行动→观察);
- AI幻觉:本质是模型编造事实。缓解六板斧:① RAG检索增强;② 引用溯源;③ 温度调低;④ few-shot示例;⑤ 自我校验;⑥ 高风险场景人工复核兜底。只能缓解,不能消除。
最后,谢飞机走出会议室,掏出手机在备忘录里写下第N张「等通知」,嘴角却扬起一丝微笑——毕竟,他至少记住了「锁要续期,消息要幂等,幻觉要兜底」。
(全文完)