大厂Java面试实战:从电商下单到AI智能客服(涵盖 Spring Boot / Spring Cloud / Kafka / Redis / RAG / Agent)
大厂Java面试实战从电商下单到AI智能客服涵盖 Spring Boot / Spring Cloud / Kafka / Redis / RAG / Agent场景某互联网大厂 Java 岗位终面。面试官严肃冷静候选人小Y外号“水货工程师”但自称“实战派”对简单问题还算熟复杂问题则开始胡乱发挥。一、第一轮电商下单场景基础能力与Spring体系业务背景某综合电商平台日均订单百万级核心链路下单 → 支付 → 库存扣减 → 发货。面试官以此为主线考察小Y的 Java 基础、Spring Boot、数据库与缓存设计能力。第一轮第1问接口设计与幂等面试官我们以“创建订单”接口为例你用Spring Boot Spring MVC设计一个下单 REST 接口简要说明URL、HTTP 方法、请求体结构如何保证接口的幂等性小Y这个简单我直接上URLPOST /api/orders请求体大概就userId、skuId、quantity、addressId那些JSON 就可以。幂等的话我就搞个orderToken前端每次下单带上来我这边用 Redis 存一下处理完就删掉重复的 token 直接拒绝。差不多就这样吧。面试官思路还行至少你知道幂等不能靠“我相信用户只点一次”。第一轮第2问数据库与事务设计面试官下单流程中你需要写入订单表、订单明细表同时冻结或扣减库存。假设我们用MySQL Spring Data JPA / MyBatis你会如何设计表结构与事务小Y表结构嘛一个order表一个order_item表主外键那种。事务的话我就在 Service 上加Transactional把插入订单和扣库存写一个方法里Spring Boot 会帮我搞定。库存的话我就搞个stock表字段有sku_id、stock然后UPDATE stock SET stock stock - ? WHERE sku_id ?。事务失败就回滚嘛。面试官基本可用但在高并发和超卖问题上你说得有点“理想主义”等会儿我再追问。第一轮第3问Redis 缓存与超卖问题面试官大促场景下库存扣减是高并发热点。你使用Redis Spring Cache避免超卖和数据库压力。简要谈谈你的设计如何用 Redis 存库存如何避免超卖与数据库如何同步小Y我会把库存放到 Redis 里比如 key 是stock:skuId然后下单先DECR一下减到 0 或负数就不让下单。避免超卖就靠 Redis 的原子性DECR是线程安全的嘛。至于和数据库同步嘛……我觉得可以异步写回去或者定时任务同步啥的……反正大厂都有成熟方案。面试官“大厂都有成熟方案”这句是不是你最成熟的方案小Y啊这个我后面可以深入学习一下。第一轮第4问日志与链路追踪面试官下单接口涉及多个微服务订单、库存、支付。我们用Spring Cloud Sleuth Zipkin/Jaeger做链路追踪。你会记录哪些关键日志字段怎么排查一次下单失败小Y日志嘛traceId、spanId必须有然后还有orderId、userId、skuId。发生错误的时候打印异常堆栈再在ELK里按traceId查把订单、库存、支付几个服务的日志串起来看就知道哪里挂了。面试官这块还不错说明你线上背锅经验挺丰富。第一轮第5问单元测试与集成测试面试官对这个下单接口你如何设计JUnit 5 Mockito的单元测试以及简单的集成测试小Y单元测试的话用WebMvcTest测 ControllerMock ServiceService 的测试用 Mockito 模拟仓储层比如OrderRepository、StockService校验正常下单、库存不足、重复下单幂等等场景。集成测试嘛就SpringBootTest跑起来配个测试库和 Redis直接发 HTTP 请求测试接口。面试官基础测试意识有算加分项。二、第二轮内容推荐与大数据Kafka / Elasticsearch / Flink业务背景除了电商交易这家公司还有内容社区和 UGC 模块类似“商品种草短视频”需要推荐系统支持。用户浏览、点赞、评论行为会写入日志实时流入大数据平台用于推荐与搜索。第二轮第1问埋点与 Kafka 设计面试官用户在 App 内浏览商品详情、点赞、评论需要做行为埋点。我们用Kafka收集日志再用Flink实时计算。你怎么设计埋点事件结构和 Kafka Topic小Y事件结构嘛我就一个统一的 JSON{ userId: 123, eventType: view/like/comment, itemId: 456, ts: 1710000000000, extra: { duration: 10, page: detail } }Kafka Topic 可以按业务分比如user-behavior-logpartition 多一点按userId或itemIdhash 作为 key 保证同一用户/商品的事件有序。面试官嗯至少知道要按 key 分区算合格。第二轮第2问Flink 实时计算与推荐特征面试官Flink 从 Kafka 消费行为日志实时计算用户最近 10 分钟的点击次数、停留时长等特征写入 Redis 或 Elasticsearch。你说说大致的 Flink Job 架构小Y这个嘛我就FlinkKafkaConsumer读 Kafka然后做个keyBy(userId)再开个时间窗口比如timeWindow(Time.minutes(10))里面做聚合。然后把结果写到 Rediskey 就是user:feature:userId。Elasticsearch 的话就用Flink的 ES Sink 写进去。架构大概就是Kafka → Flink → Redis/ES。面试官概念上对不过你没提到 watermark、乱序事件等问题看来实战可能还不够。第二轮第3问Elasticsearch 搜索与高亮面试官电商 内容社区场景下你要支持“商品内容一体化搜索”我们用Elasticsearch。请简要说明索引如何设计商品内容如何使用Spring Data Elasticsearch或RestHighLevelClient实现搜索和高亮显示小Y索引嘛我就搞一个item_content索引字段有itemId、title、description、tags、content、type商品/帖子/视频。搜索的时候用match或multi_match查title和content加上高亮字段。Spring Data Elasticsearch的话就写个 Repository类似interface ItemContentRepository extends ElasticsearchRepositoryItemContent, Long { PageItemContent findByTitleOrContent(String title, String content, Pageable pageable); }然后配置高亮用自定义查询构造。面试官基本知道怎么玩但对权重、分词等没提先记个“了解”。第二轮第4问微服务与 Spring Cloud / Dubbo面试官电商和内容推荐都是微服务架构。我们有两种 RPC 技术栈Spring Cloud OpenFeign和Dubbo。你对它们的区别和使用场景有什么认识小Y嗯……这个我略懂一点哈OpenFeign基于 HTTP JSON写起来方便配合Spring Cloud做服务发现、负载均衡Dubbo多是基于长连接和二进制协议性能更好用在内部高并发服务Feign的好处是跟 REST 更统一Dubbo 则更偏 RPC。具体场景嘛可能对延迟敏感的走 Dubbo普通业务走 Feign 吧。面试官回答算中规中矩不过你明显没部署过大规模 Dubbo 集群。第二轮第5问链路熔断与限流面试官大促时推荐服务调用用户画像服务、内容服务、广告服务等容易出现级联失败。我们使用Resilience4j或Spring Cloud Circuit Breaker。你会如何设计熔断和限流策略小Y熔断嘛就设置一些阈值比如请求失败率超过 50%连续 10 秒就打开熔断器过一会儿半开试着放少量流量响应超时就走降级逻辑比如给用户返回默认推荐。限流的话用令牌桶或者漏桶算法控制 QPS超了就直接返回“稍后重试”。具体参数嘛就看压测情况。面试官有一定概念但还需要落到配置和监控上否则是 PPT 架构师。三、第三轮AI 智能客服与 RAG / AgentAI业务深度结合业务背景公司搭建了一个 AI 智能客服系统覆盖电商订单咨询、本地生活服务、支付与金融、以及部分互联网医疗咨询场景。底层使用大模型 检索增强RAG并支持多工具调用Agentic 工作流。第三轮第1问AI 智能客服整体架构面试官描述一下一个企业级 AI 智能客服系统的整体架构要求包含对话入口Web / App / 小程序 / WebSocket、大模型调用比如通过Spring AI OpenAI / 自建模型、检索增强RAG以及知识库与向量数据库。小Y嗯这个我大概知道一点前端用户通过 Web 或 App走 WebSocket 或 HTTP 和后端对话网关沟通后端用 Spring Boot 搭个对话服务里面集成Spring AI调用大模型接口比如 OpenAI 或公司自研模型RAG用户问题先做向量化去 Milvus 或 Redis 之类的向量数据库里查相关文档再把结果拼到 Prompt 里知识库存放公司 FAQ、订单政策、医疗科普之类用 ElasticSearch/OSS 存原文向量库存向量模型回答后返回到前端。大概就这样吧细节……嗯也挺多的。面试官至少知道“向量数据库不是数据库表加一列 float”这点不错。第三轮第2问RAG 的检索与重排序面试官继续 RAG。用户问“我的订单为什么还没发货”系统需要先检索用户订单信息再检索物流 SLA、仓库公告等最后把结果给大模型生成回答。你会如何设计这三步包括检索策略、向量化、以及避免 AI 幻觉Hallucination。小Y这个就……我试着说下哈第一步先通过业务接口比如订单服务拿到用户最近的订单状态这一步可能不走向量库直接 RPC第二步把“订单状态 用户问题”打包成查询做向量化用 Embedding 模型去 Milvus/Redis 查相关文档比如“发货规则”、“延迟公告”第三步把检索到的文档和订单状态塞到 Prompt 里面让大模型回答。为了减少幻觉嘛我就让模型回答时必须引用给出的文档内容不允许自己瞎编。如果找不到就说“查不到相关信息”。这块我理解还不是很深但大差不差。面试官你说的“让模型不瞎编”是大家都想做到但永远做不完的事。第三轮第3问Agent 与工具调用支付、物流、医疗面试官系统中有多个工具订单查询工具订单服务支付状态查询工具支付服务物流查询工具物流服务医疗知识库查询工具互联网医疗场景。我们希望 AI Agent 根据用户意图自动调用这些工具完成复杂工作流比如 “帮我取消未发货的订单并帮我重新下单一件别的商品”。你会如何设计这个 Agent 工作流可以结合 Spring AI / MCP / Agentic RAG 的概念小Y呃这块就比较玄学了……我试着说下首先有个“意图识别 Agent”根据用户问题判断需要哪些工具比如订单查询 取消订单 下单然后有个“工具执行框架”统一封装这些工具比如订单服务用 OpenFeign支付用 gRPC医疗用 RAG 检索Agent 会先调用订单查询工具拿到订单状态如果是未发货就调用取消工具再根据用户的商品需求调用推荐服务或搜索服务找到合适的 SKU再调用下单接口最后把整个过程用自然语言解释给用户。至于 MCP 之类……这个……我听说是标准化工具调用协议可以跨语言整合工具具体我还没怎么实践过。面试官嗯你这回答属于“知道名词但不敢细细追问”的水平。第三轮第4问会话记忆与安全风控面试官AI 客服要支持长对话会话记忆很重要。同时支付与医疗场景对隐私与安全有严格要求。请谈谈会话记忆如何实现短期记忆 / 长期记忆如何做敏感信息脱敏和访问控制Spring Security / OAuth2 / JWT / Keycloak。小Y会话记忆的话短期记忆把最近 N 轮对话存 Redis 或数据库按会话 ID每次生成回答时把最近几轮拼在 Prompt 前面长期记忆重要信息比如用户偏好、历史订单存向量库或 Profile 服务需要时再查。安全这块用OAuth2 JWT做统一认证发访问令牌后端用Spring Security验证 Token决定用户是否能查某个订单或医疗记录打日志时做脱敏比如手机号、身份证号中间隐藏数据库层面也要做字段加密比如用Bouncy Castle或JCE实现。具体实现细节……可能需要再对一下公司规范。面试官至少知道不能把身份证号明文打在日志里这是基本职业素养。第三轮第5问AI 幻觉与企业文档问答面试官企业文档问答场景中AI 容易产生幻觉Hallucination比如瞎编公司政策。你会如何在系统层面减少幻觉小Y我觉得可以从几方面入手检索阶段保证向量检索召回质量比如用更好的 Embedding 模型结合语义检索 关键字检索生成阶段在 Prompt 里要求模型“只能根据给定文档回答找不到就说不知道”答案校验对关键问题比如金融、医疗增加规则引擎或人工审核比如用规则匹配检查有没有敏感词或违规内容或再调用一个“评估模型”对答案进行打分版本管理文档需要有版本和有效期避免模型用过期文档生成答案。其实要完全解决很难只能尽量降低风险。面试官这段回答还比较到位说明你确实有认真关注过这块而不是完全“水”。四、面试收尾面试官好今天就先到这里。整体看你在Spring Boot / Spring Cloud / Kafka / Redis / Elasticsearch这些主流技术上有一定基础对 AI 业务结合也有基本概念但在高并发、分布式事务、RAG 深层细节上还需要更系统地实践。回去可以重点补一补高并发库存与分布式锁消息一致性事务消息 / 本地消息表RAG Pipelines 的工程化落地Agent 工作流与 MCP 工具标准化。我们后续会综合评估你回去等通知吧。小Y好的好的我一定回去好好复mo习yu。五、面试题详解与技术点总结小白也能看懂下面按场景梳理面试中涉及的关键技术点方便初学者系统学习。1. 电商下单从接口到事务1.1 REST 接口与幂等技术点Java Spring Boot Spring MVC RESTful 设计基本设计URLPOST /api/orders请求体{ orderToken: 唯一幂等标识, userId: 123, items: [ {skuId: 1, quantity: 2}, {skuId: 2, quantity: 1} ], addressId: 888, couponId: 999 }幂等实现前端或后端生成orderToken后端用 Redis 存储SETNX order:token:token 1设置过期时间如果SETNX失败说明重复请求直接返回“已处理”处理完成后删除或标记 token。为什么需要幂等因为用户可能疯狂点击“提交订单”或者网络重试导致多次请求。如果不做幂等可能产生重复订单或重复扣费。1.2 数据库表与事务常用技术MySQL InnoDBORMHibernate / JPA / MyBatis / Spring Data JPA表设计简化orderid、user_id、status、total_amount、created_at...order_itemid、order_id、sku_id、price、quantitystocksku_id、stock、version乐观锁事务控制在 Service 层使用Transactional写入order写入order_item扣减库存更新stock任一步失败整个事务回滚。注意在高并发场景下单纯依赖数据库事务可能无法完全避免超卖需要配合 Redis、分布式锁、消息队列等手段。1.3 Redis 与超卖控制常用组合Redis Lua 脚本 Spring Data Redis Spring Cache基本思路将库存缓存到 Redisstock:skuId - 数量扣减库存时先在 Redis 扣减原子操作DECR或 Lua 脚本当 Redis 中库存不足时直接拒绝下单后台异步任务将 Redis 的扣减结果同步到数据库。典型优化使用 Lua 脚本将“检查 扣减”合并为一个原子操作避免并发竞态利用消息队列Kafka / RabbitMQ异步处理最终一致性。2. 日志与监控从 Logback 到 Zipkin日志框架SLF4J Logback / Log4j2链路追踪Spring Cloud Sleuth Zipkin/Jaeger监控栈指标Micrometer Prometheus Grafana日志ELKElasticsearch Logstash KibanaAPMNew Relic / SkyWalking。关键点为每个请求生成traceId在各服务间传递日志中统一打印traceId方便跨服务排查结合 Prometheus 指标如 QPS、RT、错误率快速定位问题。3. 流量与推荐Kafka / Flink / Elasticsearch3.1 Kafka 事件流场景用户行为日志浏览、点赞、评论设计要点Topic 按业务拆分user-behavior-log、order-log等Partition 按userId或itemIdhash保证关联事件有序使用Kafka Producer异步发送设置适当的重试和 ACK 策略。3.2 Flink 实时计算典型任务计算用户在最近 10 分钟内的点击次数、停留时长Session实时更新用户兴趣画像。关键技术点keyBy(userId)按用户分组窗口WindowTimeWindow/SessionWindowWatermark处理乱序数据比如埋点延迟上报Sink写回 Redis / Elasticsearch / Kafka。3.3 Elasticsearch 一体化搜索场景商品 UGC 内容搜索技术点索引结构中区分typeproduct / post / video使用multi_match查询title、description、content配合highlight字段进行高亮展示使用Spring Data Elasticsearch简化开发。4. 微服务与容错Spring Cloud / Dubbo / Resilience4j服务发现Eureka / Consul客户端负载均衡Ribbon / Spring Cloud LoadBalancerRPCHTTP JSONSpring Cloud OpenFeign高性能 RPCDubbo gRPC。容错Resilience4j熔断、限流、重试降级策略返回缓存数据、默认推荐、友好错误信息。5. AI 智能客服RAG / Agent / 安全5.1 RAG检索增强生成基本流程文档加载从企业文档库政策、FAQ、SOP中抽取文本使用工具库如 Apache POI解析 Word/Excel/PDF。向量化与存储使用 Embedding 模型OpenAI / Ollama / 本地模型将文本片段转为向量存入向量数据库Milvus / Chroma / Redis Vector。语义检索用户问题 → 向量向量检索 语义检索找到最相关的文档片段可能再结合关键词匹配例如用 Elasticsearch。生成将检索到的文档作为上下文填入 Prompt大模型生成答案。关键目标减少幻觉让回答尽量基于公司真实文档。5.2 Agent 与工具调用Agentic RAG在 RAG 的基础上引入“工具调用”和“多步工作流”。典型工具订单查询、取消订单、重新下单支付状态查询物流查询医疗问答工具接互联网医疗知识库。工作流示例“取消未发货订单并重新下单”Agent 解析意图 → 需要订单查询 订单取消 下单调用订单服务查询订单状态若未发货调用取消接口调用推荐/搜索服务找新商品调用下单接口汇总结果用自然语言反馈给用户。5.3 会话记忆与安全会话记忆短期Redis / DB 按会话 ID 存最近若干轮对话用于上下文长期重要信息存用户 Profile 或向量库。安全与隐私认证OAuth2 JWT Spring Security / Keycloak授权基于角色和资源RBAC限制用户只能访问自己的订单 / 医疗记录脱敏日志中隐藏敏感字段如手机号中间 4 位加密敏感字段如身份证加密存储。5.4 减少 AI 幻觉的实践检索层使用高质量 Embedding 模型多通道检索向量 关键词对检索结果做重排序re-ranking。生成层设计严谨的 Prompt要求模型明确引用文档内容对无法回答的问题明确说“根据当前知识无法回答”。控制层对关键领域金融、医疗增加规则引擎和人工审核对输出内容做合规检查敏感词、违规建议等。六、如何复盘这场面试如果你是 Java 小白或在职开发可以这样用这篇文章复盘和学习按场景学电商下单REST、事务、Redis、幂等推荐与搜索Kafka、Flink、ElasticsearchAI 客服RAG、Agent、向量数据库。按技术栈查缺补漏Spring Boot / Spring Cloud / Spring SecurityKafka / Redis / MySQL / ElasticsearchRAG / Agent / 向量检索。多写代码、多压测、多复盘给自己设计一个小型电商 Demo接一个简单的 RAG 问答系统把日志、监控和链路追踪也补齐。当你能把文中面试官的问题都用自己的实践经验回答出来你距离“大厂 Java 工程师”就不远了。