从电商下单到 AI 智能客服:一场 Java 大厂面试串起 Spring Boot / Spring Cloud / Redis / Kafka / RAG 技术全景

张开发
2026/4/14 20:46:26 15 分钟阅读

分享文章

从电商下单到 AI 智能客服:一场 Java 大厂面试串起 Spring Boot / Spring Cloud / Redis / Kafka / RAG 技术全景
用一个“社恐水货程序员”搞懂电商微服务 AI 智能客服含 Spring Boot / Spring Cloud / Redis / Kafka / RAG场景某互联网大厂电商 本地生活 AI 智能客服中台研发岗现场面试。 人物面试官L 老师表情严肃问题犀利但专业。候选人水货程序员小 Y会点皮毛容易紧张但偶尔发挥还行。一、第一轮电商下单链路 基础 Java / Spring Boot场景电商主站 本地生活同一套下单系统日常高并发双 11 会激增。小 Y 来到会议室咖啡还没喝一口就被开门见山地灵魂拷问。第 1 轮 · 第 1 题下单接口怎么设计用什么技术栈面试官我们有一个电商场景用户下单购买商品支持 Web 端和 App下单接口需要做到性能可控易于扩展方便后续拆分成微服务你会怎么用Spring Boot / Spring MVC设计这个下单接口简单描述一下 Controller、Service、DAO 的结构以及你会选哪种 ORM小 Y咳……这个很简单啊我就写一个OrderController里面一个PostMapping(/order/create)然后调用OrderService再到 Mapper 里插数据库。ORM 的话……可能就 MyBatis 或 JPA 都行吧看公司喜好……面试官你把 Controller、Service、DAO 各自主要负责什么说清楚一点以及在高并发场景下数据库连接池用什么小 YController 就……接收请求和返回响应Service 写业务逻辑DAO 就是 Mapper 或 Repository 操作数据库。连接池嘛……用那个 Hika……HikariCP性能好。面试官不错基本分层能说出来还知道 HikariCP。第 1 轮 · 第 2 题订单表怎么设计如何避免超卖面试官下单场景数据库方面你会怎么设计简单说一下订单表的核心字段。然后高并发下怎么避免库存超卖可以从数据库层面和缓存层面Redis分别说一个方案。小 Y订单表嘛……就id、user_id、product_id、price、status、create_time这些。避免超卖我就……呃……在数据库加个行锁或者用 Redis 扣库存然后再看库存是不是小于 0就回滚面试官能再具体一点比如数据库层会使用什么 SQL 语句、什么隔离级别Redis 扣库存的时候怎样保证并发安全小 Y这个……数据库就update一下库存where stock 0那种乐观锁或者悲观锁都……可以吧。Redis 就decr然后如果小于 0 就加回去面试官行思路方向对但细节还有点模糊。第 1 轮 · 第 3 题如何保证接口的幂等性面试官下单接口在网络抖动或用户多次点击下单按钮时可能会被多次调用。如何保证接口幂等不会重复创建订单你可以用Redis或数据库约束说一种方案。小 Y可以搞一个requestId比如前端传一个 UUID我在 Redis 里setnx判断一下存在就说明处理过了不存在就先占位然后创建订单。或者在数据库建一个订单号的唯一索引如果插入失败说明已经下过了。面试官这个方案可以思路清晰有实战价值。第 1 轮 · 第 4 题单体到微服务如何演进面试官假设你现在是一个Spring Boot 单体应用将来订单、库存、支付要拆成微服务。你在设计时会提前做哪些抽象或边界规划小 Y我会把订单、库存、支付做成不同的包领域隔离一下。然后用接口封装访问比如InventoryClient、PaymentClient即使现在是本地调用将来也可以改成 Feign 调远程服务……之类的。面试官这个回答还行说明有考虑演进路径。二、第二轮微服务 消息队列 支付风控场景面试官认为小 Y 至少能写点业务代码于是开始进阶订单拆服务、消息队列削峰、支付与风控链路。第 2 轮 · 第 1 题订单服务如何拆分调用如何实现面试官现在我们把系统拆成订单服务Order Service商品库存服务Inventory Service支付服务Payment Service使用Spring Cloud OpenFeign Eureka / Nacos做注册与调用。你简单描述一下服务之间如何发现和调用网络调用失败时你会在代码里用什么技术保证可靠性小 Y服务注册就用 Eureka 或 Nacos服务起来之后会往注册中心注册。调用的话就用 OpenFeign写个FeignClient(name inventory-service)之类的接口。可靠性……我会用那个Resilience4j搞熔断、重试、限流……大概这样。面试官好关键词都说到了有一定概念。第 2 轮 · 第 2 题高并发下单如何削峰为什么要用消息队列面试官双 11 秒杀时下单请求瞬时暴涨。如果订单服务直接同步写数据库可能就被打垮了。我们一般会用Kafka 或 RabbitMQ做削峰填谷。你能说一下在这个下单场景中消息队列放在什么位置大致的处理流程小 Y嗯……就是用户下单的时候我不是直接插数据库而是把下单请求发到 Kafka 的order_create_topic。然后有个消费者服务慢慢消费再去写数据库。这样就可以削峰了。中间还可以加个 Redis 做库存预扣。面试官大方向对只是还可以补充一下消息的幂等和顺序性但先到这。第 2 轮 · 第 3 题支付成功回调如何保证订单状态最终一致面试官假设支付是走第三方支付比如支付宝、微信支付成功会回调我们的支付回调接口。在分布式系统中如何保证订单状态最终一致你可以结合本地消息表 / 事务消息 / 重试机制任意说一种思路。小 Y这个就……我在支付成功的时候更新订单状态然后发个消息到 Kafka 告诉订单服务。要是失败就重试……或者搞个本地事务反正最后会一致。面试官太笼统了有点糊。你要说清楚是在哪个服务里执行哪些操作以及如何避免部分成功、部分失败导致的数据不一致。小 Y呃……面试官好我们后面解析环节再说详细方案。第 2 轮 · 第 4 题风控服务怎么做面试官我们有一个支付风控服务会根据用户的下单频率、IP、设备指纹等做实时判断决定是否放行支付。你会用什么技术栈整体架构上怎么设计小 Y嗯……可以弄一个独立的风控服务使用 Spring Boot数据放在 Redis 或 Elasticsearch 里。下单的时候调用风控服务的接口风控服务可以用规则引擎或者接一个大数据平台Flink 实时计算看一下用户最近行为……之类的。面试官勉强算过关说明多少看过点资料。三、第三轮AI 智能客服 RAG 监控运维场景大厂不可能只做电商下单系统之上还有智能客服 / 风控 / 运营中台等。面试官开始考察 AI 与平台能力。第 3 轮 · 第 1 题如何接一个 AI 智能客服面试官我们希望在电商 App 中集成一个AI 智能客服能回答订单状态比如“我这个订单发货了吗”商品咨询“这双鞋防水吗”售后政策“7 天无理由吗”如果要你在现有 Java 微服务体系上接入你会怎么设计用到哪些技术比如Spring AI / REST 接第三方大模型 / RAG等。小 Y那就搞一个chat-service用 Spring Boot 写一个接口把用户问题转发给大模型比如调 OpenAI / Ollama 那些。然后我把订单系统、商品系统的数据通过向量数据库存一下……呃用 Milvus 或 Redis 吧。问问题的时候先检索一下再把结果拼到 prompt 里。面试官听上去像 RAG 了你能再具体一点吗比如向量化、语义检索、文档加载这些步骤小 Y向量化就用 Embedding 模型把文档变成向量存到向量数据库。用户问题也向量化一下然后算相似度找最相关的文档再一起喂给大模型。文档加载就从数据库或者 OSS 抓出来切片。面试官思路是对的。第 3 轮 · 第 2 题如何避免 AI 幻觉面试官AI 模型有幻觉Hallucination问题会一本正经地瞎说。比如我们的售后政策根本没有“终身免费换新”但模型可能会编。你会用什么办法在架构和工程上降低这种风险小 Y那就把我们的企业知识库接进去嘛用 RAG 让它只看我们自己的文档。然后可以加一些提示词提示它“如果不知道就说不知道”。再不行就加一个规则引擎或者人工审核面试官说到了 RAG 和提示工程还算可以。但还有很多工程细节可以加强。第 3 轮 · 第 3 题如何对 AI 客服服务做监控与告警面试官现在有了chat-service请求量也很大。你要给它做监控运维QPS、延迟、错误率调用大模型的耗时某些异常提示比如返回空答案你会选什么技术大致怎么搭小 Y监控就是 Micrometer Prometheus Grafana埋点记录接口耗时、调用模型耗时然后 Prometheus 抓指标Grafana 画图出问题就 Alert。日志可以用 ELK 或者 Loki 堆起来出事了再查。面试官这个比较标准说明你有看过监控体系。第 3 轮 · 第 4 题整个系统如何容器化 CI/CD面试官我们所有服务都要跑在 Kubernetes 上使用 GitLab CI 或 GitHub Actions 做 CI/CD。请大致说一下你如何把一个 Spring Boot 服务容器化如何用 CI 工具实现构建、测试、发布到 K8s 的流水线小 Y容器化就写一个 Dockerfile用 JDK 17 的基础镜像把 jar 包丢进去java -jar跑。然后 CI 就在 GitLab CI 里写一个 yml先mvn test再mvn package再docker build推到镜像仓库然后kubectl apply或者用 Helm 部署到 K8s。面试官嗯关键步骤都到位了。第 3 轮 · 第 5 题如果 AI 客服、下单服务都挂了你如何排查面试官假设一个夜里事故用户下单 500 错误AI 客服也无法回答你手头有K8s 集群Prometheus GrafanaELK 日志Jaeger / Zipkin 链路追踪你会怎么一步步排查小 Y我就……先看 Grafana 的面板有没有 QPS 降为 0 或错误率飙升再看是不是 pod 掉了。然后看日志有没有异常最后用链路追踪看看哪个服务耗时特别长或者报错。嗯大概就这样。面试官描述得比较泛但至少知道几个工具怎么用。四、面试结束面试官今天就先聊到这里你整体基础还可以但在分布式事务、支付一致性、AI 工程细节上还需要加强。我们这边会再内部评估你先回去等通知吧。小 Y好……谢谢老师心里想这回八成又是“回家等通知”套餐了。五、知识点详解从下单到 AI 客服一条链路串起来下面把刚才面试里的知识点用更系统、更易懂的方式讲一遍方便小白学习与复习。1. 电商下单基础架构Spring Boot 分层 ORM 连接池1.1 三层架构在 Java Web / Spring Boot 项目中最常见的分层结构是Controller 层表示层使用RestController、RequestMapping等注解负责接收 HTTP 请求、参数校验、返回 JSONService 层业务层使用Service编写业务逻辑例如校验库存、计算价格、调用其他服务DAO / Repository 层数据访问层对应 MyBatis 的 Mapper 接口或 JPA 的 Repository负责执行 SQL与数据库交互例子RestController RequestMapping(/order) public class OrderController { Autowired private OrderService orderService; PostMapping(/create) public OrderDTO createOrder(RequestBody CreateOrderRequest request) { return orderService.createOrder(request); } }Service public class OrderService { Autowired private OrderMapper orderMapper; public OrderDTO createOrder(CreateOrderRequest request) { // 1. 校验参数 // 2. 检查库存 // 3. 计算价格 // 4. 写订单表 // 5. 返回结果 } }1.2 ORM 与连接池ORM 可以选择MyBatisSQL 自己写灵活在国内很常见。JPA / Hibernate用实体模型和注解自动生成 SQL。数据库连接池Spring Boot 2.x/3.x 默认使用HikariCP性能好、配置简单。2. 防止超卖与接口幂等2.1 防止库存超卖数据库方案在库存表执行类似UPDATE product_stock SET stock stock - 1 WHERE product_id ? AND stock 0;如果返回更新行数为 0说明库存不足。可以配合事务隔离级别一般用 READ COMMITTED 或 REPEATABLE READ控制并发行为。Redis 方案缓存预扣秒杀时先把库存量放进 RedisSET stock:skuId 1000用户抢购时DECR stock:skuId如果结果 0则说明抢完了直接失败并INCR补回。后台再异步把扣减结果持久化到数据库。2.2 接口幂等防止用户重复下单或第三方重复回调常见做法唯一业务标识 数据库唯一约束订单号order_no或业务请求号biz_id加唯一索引。如果重复插入同一biz_id会报错通过捕获异常保证幂等。Redis requestId防重 Token前端每次请求生成 UUID服务端用SETNX requestId 1过期时间几分钟。成功占位才继续执行再次请求时发现 key 已存在则视为重复。3. 单体到微服务Spring Cloud OpenFeign Resilience4j3.1 服务发现与调用将单体中的模块拆成独立服务订单、库存、支付、用户等。使用Eureka / Nacos作为注册中心服务启动时向注册中心注册自己的地址。调用方通过服务名而非 IP发现实例。使用OpenFeign声明式 HTTP 调用FeignClient(name inventory-service) public interface InventoryClient { PostMapping(/inventory/deduct) DeductResponse deduct(RequestBody DeductRequest request); }3.2 可靠性熔断、重试、限流使用Resilience4jCircuitBreaker连续失败后短路请求防止雪崩。Retry调用失败自动重试几次。RateLimiter限流保护下游。这些配合 Spring Cloud 整合通过配置即可生效。4. 消息队列削峰与支付一致性4.1 用 Kafka / RabbitMQ 做削峰用户请求 → 网关 → 下单接口快速校验参数和基本库存Redis 预扣。把下单请求用户 ID、商品 ID、数量等写入 Kafka 主题。立即返回“下单请求已受理”。后台订单消费者顺序消费消息。真正写数据库、更新库存。好处峰值流量被打散到消息队列中后端可以按自己节奏慢慢消化。4.2 支付回调与最终一致性典型方案本地消息表 消息队列以支付服务为例收到第三方支付成功回调。在本地事务中同时更新支付记录状态如 PAID。写一条“订单已支付”的消息到本地消息表数据库。一个定时任务不断扫描本地消息表将未投递的消息发送到 Kafka或使用事务消息机制。订单服务消费该消息更新订单状态为“已支付”。这样即使消息暂时发送失败也可以通过本地消息表重试最终保证一致性。5. 支付风控规则 大数据 实时计算技术栈举例Java 服务Spring Boot Spring Cloud数据存储Redis用户近期行为数据、Elasticsearch日志和行为查询、Kafka行为流、Flink / Spark Streaming实时计算简单架构客户端下单 / 支付时订单信息写入 Kafka。Flink 程序实时消费这些事件计算用户在 5 分钟内的下单次数IP 是否频繁变动是否命中黑名单设备结果写回 Redis / ES。支付服务调用风控服务 API风控服务基于这些实时指标 规则甚至 ML 模型做判断通过、拒绝、人工审核。6. AI 智能客服RAG / 向量数据库 / Agent 思路6.1 RAG检索增强生成基本流程文档准备企业知识售后政策、商品描述、FAQ、订单状态说明等。从数据库、Markdown 文档、PDF、知识库导出。文档切片 向量化使用文档加载器如 Spring AI 集成的 loader切片为短段落。使用Embedding 模型OpenAI、Ollama、本地模型把每段转成向量。存入向量数据库Milvus、Chroma、Redis-Search 等。在线问答流程用户提问 →chat-service接收。对问题做向量化在向量数据库中做语义检索找相关片段。将检索结果作为上下文连同用户问题一起传给大模型。大模型生成回答。这就是典型的RAG 模式可以大幅减少幻觉提高与业务相关性。6.2 减少 AI 幻觉的工程手段检索约束只允许模型基于检索到的企业文档回答。提示工程Prompt Engineering明确指示模型“如果没有相关资料请回答不知道”。限制不得编造政策。答案后处理对敏感字段比如赔付金额、活动政策做规则校验。发现异常则改用模板回答或转人工。Agentic RAG / 工具调用让 Agent 调用“订单查询 API”、“商品系统 API”等工具获取事实数据再回答。7. 监控运维Micrometer Prometheus Grafana 链路追踪7.1 指标监控在 Spring Boot 中通过Micrometer自动暴露指标HTTP 请求数量、耗时JVM 内存、GC 情况Prometheus 定期拉取/actuator/prometheus指标。Grafana 用这些指标画图QPS 曲线错误率延时分布7.2 日志与链路追踪日志使用Logback / Log4j2 ELK集中存储与检索。链路追踪使用Jaeger / Zipkin每个请求有 traceId跨服务传递。可以看到完整调用链网关 → 订单服务 → 库存服务 → 支付服务 → AI 服务。出问题时按顺序Grafana 看整体健康状况和哪里飙红。K8s 查看 Pod 状态kubectl get pods。ELK 查异常日志关键字。Jaeger 查错误请求的链路定位具体失败服务和接口。8. 容器化与 CI/CDDocker K8s GitLab CI / GitHub Actions8.1 Spring Boot 容器化简单 Dockerfile 示例FROM eclipse-temurin:17-jre-alpine WORKDIR /app COPY target/order-service.jar app.jar EXPOSE 8080 ENTRYPOINT [java, -jar, app.jar]8.2 CI/CD 流水线以 GitLab CI 为例stages: - test - build - deploy test: stage: test script: - mvn test build: stage: build script: - mvn package -DskipTests - docker build -t registry.example.com/order-service:$CI_COMMIT_SHA . - docker push registry.example.com/order-service:$CI_COMMIT_SHA deploy: stage: deploy script: - kubectl set image deployment/order-service order-serviceregistry.example.com/order-service:$CI_COMMIT_SHA代码提交 → 自动跑单测JUnit 5、Mockito。通过后打包、构建镜像、推到仓库。最后更新 K8s 部署完成滚动发布。六、小结面试故事背后的知识地图通过这场“社恐水货程序员小 Y”的面试我们串了一条完整的电商 本地生活 AI 智能客服技术链路Java 基础与 Spring Boot 三层架构MyBatis / JPA HikariCP。防止超卖、接口幂等Redis 缓存与数据库约束。Spring Cloud 微服务拆分OpenFeign 调用Resilience4j 保护。Kafka / RabbitMQ 削峰填谷支付回调与最终一致性。风控服务与实时大数据计算Flink / ES / Redis。RAG 向量数据库 Agent 的 AI 智能客服架构如何减少幻觉。Micrometer Prometheus Grafana ELK Jaeger 的可观测性体系。Docker Kubernetes CI/CD 流水线的一体化交付。对于还在准备 Java 大厂面试的小伙伴可以照着上面的知识点一条条查漏补缺最好自己画一个“电商AI 技术地图”把这些技术栈和业务场景串起来而不是零散地背 API。这样下次再遇到类似的场景面试题就不会像小 Y 一样“含糊其辞”了。

更多文章