ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

安全与风控大厂Java面试实录:JDK17、Redis分布式锁、Kafka风控事件削峰、Seata分布式事务、Spring AI+RAG智能风控助手,谢飞机三轮被虐哭(附完整答案解析)

安全与风控大厂Java面试实录:JDK17、Redis分布式锁、Kafka风控事件削峰、Seata分布式事务、Spring AI+RAG智能风控助手,谢飞机三轮被虐哭(附完整答案解析) 安全与风控大厂Java面试实录JDK17、Redis分布式锁、Kafka风控事件削峰、Seata分布式事务、Spring AIRAG智能风控助手谢飞机三轮被虐哭附完整答案解析一、面试背景公司安全与风控独角兽「盾安风控」——反欺诈、设备指纹、规则引擎、实时风控、黑灰产对抗、AI风控模型六大业务线。业务规模注册用户3亿、日交易风控事件50亿条、日拦截黑产攻击5000万次、峰值每秒300万笔风控事件接入、覆盖支付/电商/信贷/社交/游戏五大业务场景风控决策平均响应时间 50ms。核心链路业务请求接入 → 设备指纹采集 → 风险特征提取 → 规则引擎模型打分 → 风险决策放行/拦截/人工审核→ 处置动作下发 → 黑名单同步 → 实时预警推送 → AI风控助手复盘。面试官老K风控平台架构组组长35岁保温杯里泡枸杞目光如炬专治各种简历吹牛。候选人谢飞机3年Java后端经验简历写着「精通高并发、分布式、微服务」实际上……懂的都懂。二、第一轮筑基期核心语言与基础设施Q1老K“我们风控平台每天要处理50亿笔事件高峰期每秒300万笔。你们项目用的什么JDK版本为什么”谢飞机挠头“我们用的JDK 8稳定不过我看招聘要求写17……17谐音‘一起发’一起发工资吗嘿嘿。”老K面无表情“一起发那我建议你连工资一起发给我。”谢飞机赶紧找补“啊不是JDK 17是LTS长期支持版本有record、文本块、switch模式匹配还有ZGC低延迟垃圾回收器适合我们这种高吞吐风控场景而且Spring Boot 3.x强制要求JDK 17起步选17才能跟上生态”老K微微点头“不错总算说了点人话。那你说说JDK 8、11、17有什么区别”谢飞机“JDK 8是老干妈经典永流传JDK 11是保温杯加了ZGC还免费JDK 17是折叠屏手机LTS真香record和密封类让代码更简洁”老K“虽然比喻很土但点都踩对了。继续。”Q2老K“我们风控引擎的规则计算节点经常内存告警。你了解JVM内存结构吗元空间Metaspace是什么”谢飞机自信满满“元空间嘛就是元宇宙空间最近元宇宙特别火Oracle也跟风搞了个JVM里的元宇宙……”老K血压飙升捏碎了手里的笔“Metaspace是Metaverse你再说一遍Metaspace是JDK 8之后用来存放类元数据的内存区域替代了之前的永久代PermGen它使用的是本地内存不是JVM堆内存默认无上限所以类加载多了会OOMMetaspace OutOfMemoryError”谢飞机缩脖子“对对对元空间存类信息、常量池、方法元数据反射用多了、CGLIB代理多了就会撑爆它要加-XX:MaxMetaspaceSize限制还要排查类加载器泄漏……”老K“还算有点救。那线上OOM你一般怎么排查”谢飞机“重启大法256G内存拉满重启解决不了就再加内存”老K“你是网吧网管吗记住四板斧jps找进程 →jmap -dump导堆转储 →jstack看线程 → MAT分析大对象下次再背网吧口诀我让你直接回家。”Q3老K“我们风控规则引擎里依赖了十几个jar包经常冲突。Maven依赖冲突你怎么解决”谢飞机“谁报错就删谁上次我把报错的jar包从pom里删了结果同事的代码也崩了他追了我三条街……”老K扶额“你那是拆家正确姿势先mvn dependency:tree看依赖树找到冲突的传递依赖再用exclusion排除或者用dependencyManagement统一版本还可以引入BOMBill of Materials统一管理版本号Gradle的话用resolutionStrategy强制版本。你是来面试的还是来拆迁的”三、第二轮历劫期数据访问与分布式核心Q4老K“我们风控规则和黑名单数据既要复杂查询又要高并发写入。MyBatis和JPA你怎么选”谢飞机眼睛一亮这题会“选MyBatisSQL自己控制性能可控排查方便JPA虽然开发快但‘JPA一时爽排查火葬场’”老K“嗯这个总结倒是挺接地气。那你知道HikariCP为什么快吗”谢飞机“因为它名字短加载快”老K再次血压飙升“名字短是快你怎么不叫‘快’HikariCP快是因为两个核心数据结构FastList替代ArrayList移除顺序遍历校验get/remove更快和ConcurrentBag无锁化设计多线程借还连接性能极高还有字节码精简、代理类优化记住没有”谢飞机“记住了记住了FastListConcurrentBag无锁设计性能怪兽”Q5老K“风控黑名单和规则配置我们用了Redis缓存但大促时缓存经常被打穿。缓存穿透、击穿、雪崩分别是什么怎么解决”谢飞机这题背过挺直腰板“穿透是查一个不存在的key请求直接打到数据库击穿是某个热点key过期瞬间大量请求同时打到DB雪崩是大面积key同时过期DB瞬间被压垮。解决方案六字真言防空、加锁、错峰”老K露出今天第一个笑容“哟总结得不错展开说说。”谢飞机“穿透用布隆过滤器拦截不存在的key 缓存空值击穿用互斥锁SETNX只放一个请求去查DB其他等待雪崩给过期时间加随机值错峰 多级缓存本地Caffeine Redis 熔断降级”老K点头赞许“很好那Redis分布式锁你会写吗”谢飞机“会SETNX key value抢到就干活干完DEL”老K“那如果拿到锁的线程挂了锁永远不释放怎么办”谢飞机“那就……等它诈尸”老K忍无可忍“加过期时间但过期时间到了业务没执行完怎么办用Redisson看门狗机制自动续期还有释放锁要校验是不是自己的value存UUID防止删别人的锁你这裸奔setnx上线黑产分分钟把你锁全删了”Q6老K“风控事件每天50亿条直接同步处理肯定扛不住。我们用了Kafka做削峰。Kafka怎么保证消息不丢失”谢飞机“Kafka是KingKing怎么可能会丢王冠……啊不是Kafka的K是King的K”老K“你再说一句废话我就让你走人。”谢飞机冷汗直冒“从三个环节保证生产者端acksall 重试机制确保分区副本都写入Broker端min.insync.replicas2unclean.leader.election.enablefalse避免副本全挂消费者端手动提交offsetenable.auto.commitfalse业务处理成功后再提交配合幂等消费Redis setnx或数据库唯一键防止重复”老K“总算挤出一句完整的了。那分布式事务呢我们下单、扣风控额度、写黑名单是三个服务怎么保证一致性”谢飞机“分布式事务嘛就是……海盐烧烤番茄原味那四种模式就像乐事薯片口味”老K拍桌怒吼“那是XA/2PC、Seata AT、TCC、SAGA四种方案不是乐事薯片XA强一致适合短事务TCC是Try-Confirm-Cancel适合需要预留资源的场景SAGA是长事务补偿Seata AT是自动生成反向SQL回滚你再说薯片我让你回家吃薯片”四、第三轮飞升期实时通信与AI风控Q7老K“我们风控预警要实时推送给百万级用户和风控运营。WebSocket怎么支撑百万连接”谢飞机“简单for循环挨个发消息”老K“百万连接你for循环你是想用代码把服务器烧了吗”谢飞机赶紧改口“啊不是要用Netty做WebSocket服务器基于NIO事件驱动单机可以扛十万级连接再配合ChannelGroup管理连接、粘性会话保证同一用户连同一台机器、Redis Pub/Sub做跨节点消息广播、心跳机制IdleStateHandler清理死连接、水平扩展集群”老K难得点头“不错Netty这套算是讲明白了。那监控呢这么多服务你靠什么观测”谢飞机“可观测性三件套Metrics指标Prometheus Micrometer采集QPS、延迟、错误率、Logging日志ELK Stack集中收集Logback SLF4J、Tracing链路Jaeger/Zipkin配合Spring Cloud Sleuth做全链路追踪出问题就像福尔摩斯探案指标报警→日志定位→链路还原三件套缺一不可”老K赞许“好小子比福尔摩斯还神最后一个问题我们最近要做AI风控助手用Spring AI怎么做”谢飞机“Spring AI的ChatClient链式调用跟JdbcTemplate一个味儿ChatClient.create(chatModel).prompt().user(...).call().content()”老K“那怎么让AI回答我们内部的风控规则和黑产知识库而不是瞎编”谢飞机“用RAG检索增强生成先搜后答把风控规则、历史案例文档向量化Embedding模型OpenAI或Ollama本地部署存到向量数据库Milvus/Chroma/Redis Stack用户提问时先语义检索出相关片段再拼进prompt让大模型基于这些材料回答杜绝瞎编”老K“那模型怎么调用你们的风控查询接口、处置接口比如‘帮我查一下这个设备的风险分’‘把这个IP加入黑名单’”谢飞机“用MCP模型上下文协议它是AI界的USB-C统一了模型和外部工具/数据源的对接标准三大原语Tools工具调用暴露风控查询、黑名单操作等能力、Resources资源读取知识文档、Prompts提示标准化模板。还有Function Calling把Java方法注册成函数让模型按需调用配合工具执行框架完成闭环”老K“那多个Agent之间怎么协作”谢飞机“用Google A2AAgent-to-Agent协议Agent之间可以互相通信协作比如‘反欺诈Agent’发现可疑就调用‘黑名单Agent’处置再通知‘告警Agent’推送”老K“最后考你一个概念Agentic RAG和普通RAG有什么区别”谢飞机最高光时刻“普通RAG是‘一次检索一次回答’像个只会查字典的图书管理员Agentic RAG是‘AI侦探’它会自主规划先查知识库→发现不够→再查风控系统→还不够→调规则引擎→把结果综合推理出结论多步推理、工具调用、自我纠错全流程自主完成”老K“那AI幻觉怎么解决”谢飞机“AI幻觉只能缓解不能消除就像你永远无法让杠精闭嘴缓解手段RAG检索增强有依据回答、Prompt约束限定知识范围、温度参数调低、答案溯源引用标注来源、人工审核兜底高风险场景必须人审、输出校验规则校验敏感词过滤”五、结局老K合上笔记本喝了口枸杞茶“行今天的面试就到这儿吧。整体来说……你的知识结构像个‘散装百宝箱’有些点能讲透有些点纯靠嘴硬。这样你先回去等通知吧。”谢飞机熟练地掏出手机“好的好的这是我集齐的第七张‘等通知’卡片了再集一张就能召唤神龙了”老K“……”三个月后彩蛋谢飞机入职了竞品风控公司「天盾风控」工牌上赫然写着「等通知侠」。老K默默从碎纸机旁捡回谢飞机的简历在背面写了四个字「值得再约」。六、文末答案解析小白学习版考点1JDK 8/11/17 怎么选| 版本 | 关键特性 | 场景建议 | |------|---------|---------| | JDK 8 | Lambda、Stream、Optional、CompletableFuture | 存量老项目生态成熟 | | JDK 11 | 新增ZGC实验、HttpClient、免费商用 | 过渡版本LTS | | JDK 17 | record、文本块、switch模式匹配、密封类、ZGC转正、Spring Boot 3.x强制要求 |新项目首选LTS 长期免费支持 |Spring Boot 3.x基于JDK 17 Jakarta EE 9包名从javax迁移到jakarta。考点2JVM内存分区与Metaspace堆对象实例新生代Eden/S0/S1 老年代OOM大头。元空间MetaspaceJDK 8起替代永久代存类元数据、常量池、方法信息使用本地内存非堆默认无上限。虚拟机栈栈帧、局部变量表递归过深会StackOverflowError。程序计数器线程私有记录字节码执行位置。本地方法栈native方法。OOM排查四板斧口诀jps找进程 →jmap -dump:formatb,fileheap.hprof pid导堆 →jstack pid看线程 → MAT/Eclipse Memory Analyzer 分析大对象与泄漏点。考点3Maven/Gradle依赖冲突三板斧mvn dependency:tree看依赖树定位冲突版本。exclusion排除传递依赖或dependencyManagement统一版本。引入官方BOM如Spring Cloud BOM、Jackson BOM统一版本管理。Gradle用resolutionStrategy { force xxx:xxx:版本号 }。考点4MyBatis vs JPAMyBatis手写SQL灵活可控、易优化适合复杂查询、报表、风控规则等缺点是开发量大。JPA/Hibernate自动建表、对象化操作开发快但复杂SQL难优化容易产生N1查询问题查一次主表 N次子表。Spring Data JDBC轻量级介于两者之间。考点5HikariCP为什么快FastList优化get/remove移除范围校验减少开销。ConcurrentBag无锁化连接借还多线程并发性能极高。字节码精简、代理类优化、默认池大小10。考点6缓存穿透/击穿/雪崩 六字真言| 问题 | 现象 | 解决方案 | |------|------|---------| | 穿透 | 查不存在的key打到DB |防布隆过滤器 缓存空值 | | 击穿 | 热点key过期瞬间高并发 |加互斥锁SETNX单请求回源 | | 雪崩 | 大面积key同时过期 |错过期时间加随机值 多级缓存 熔断降级 |考点7Redis分布式锁三大坑死锁拿到锁后线程挂了 → 必须加过期时间。误删A的锁被B删除 → value存UUID释放时用Lua脚本校验。业务未完成锁过期→ Redisson看门狗默认30s自动续期每10s续一次。// Redisson推荐写法 RLock lock redissonClient.getLock(risk:lock: deviceId); boolean locked lock.tryLock(3, 30, TimeUnit.SECONDS); // 看门狗自动续期 try { if (locked) { /* 业务逻辑 */ } } finally { if (locked lock.isHeldByCurrentThread()) lock.unlock(); }考点8Kafka三环节不丢失保障生产者acksall所有ISR副本确认retries重试 enable.idempotencetrue幂等。Brokermin.insync.replicas2replication.factor3unclean.leader.election.enablefalse。消费者手动提交offsetenable.auto.commitfalse处理成功再提交 消费幂等Redis SETNX / DB唯一键。考点9分布式事务四方案选型| 方案 | 原理 | 适用场景 | |------|------|---------| | XA/2PC | 两阶段提交强一致 | 短事务、跨库强一致要求极高 | | Seata AT | 自动生成反向SQL回滚 | 微服务关系型数据库侵入小 | | TCC | Try-Confirm-Cancel 手工补偿 | 需要预留资源、性能要求高 | | SAGA | 长事务正向/补偿编排 | 长流程、允许最终一致 |考点10注册中心CAP对比EurekaAP可用性优先节点间异步复制网络分区时仍可用可能读到旧数据已停更维护模式。ConsulCP一致性优先Raft协议强一致。NacosAP/CP可切换默认AP支持配置中心注册中心二合一国内主流。考点11WebSocket百万连接架构NettyNIO事件驱动单机扛十万级连接。ChannelGroup统一管理连接群发消息。粘性会话Sticky Session同一用户固定连同一节点配合Redis Pub/Sub跨节点广播。心跳机制IdleStateHandler定时心跳清理死连接。水平扩展LB层Nginx/网关 多节点集群。考点12可观测性三件套MetricsPrometheus采集 Grafana可视化 Micrometer埋点QPS/延迟/错误率/SLA。LoggingLogback SLF4J输出ELKElasticsearch Logstash Kibana集中检索。TracingJaeger/Zipkin Spring Cloud Sleuth/Micrometer TracingtraceId贯穿全链路。考点13Spring AI核心能力| 能力 | 说明 | |------|------| | ChatClient | 链式调用大模型类似JdbcTemplate | | Embedding | 文本向量化 | | ChatMemory | 聊天会话内存多轮对话 | | Function Calling | 把Java方法注册为工具让模型调用 | | Advisors | 提示填充、RAG检索等横切增强 |考点14RAG离线/在线双阶段离线阶段文档加载 → 分块 → Embedding向量化 → 存入向量数据库Milvus/Chroma/Redis Stack。在线阶段用户提问 → 向量化 → 语义检索TopK → 拼装Prompt → 大模型生成带依据的回答。向量数据库选型Milvus大规模高性能、Chroma轻量开发、Redis Stack复用Redis运维简单。考点15MCP三大原语 A2A Agentic RAGMCP模型上下文协议AI界的USB-C统一模型与外部工具/数据源对接标准。三大原语Tools工具调用标准化、Resources资源读取、Prompts提示模板。A2AAgent-to-AgentGoogle提出的Agent间通信协议让多个智能体协作。Agentic RAGAI侦探式多步推理——规划→检索→调工具→综合→纠错→输出比普通RAG的“一次检索一次回答”更智能。考点16AI幻觉本质与6大缓解手段本质大模型基于概率生成知识截止、缺乏事实依据时可能“一本正经地胡说八道”。缓解手段① RAG检索增强有据可依② Prompt约束限定回答范围③ 降低temperature④ 答案溯源引用标注来源⑤ 高风险场景人工审核兜底⑥ 输出规则校验。核心心法AI幻觉只能缓解、不能消除就像你无法让杠精闭嘴——但你可以让他闭嘴前先出示证据。全文完关注我看谢飞机下一家大厂继续被虐
返回列表