从本地生活电商到 AI RAG:互联网大厂 Java 面试场景完整实战
标题从本地生活电商到 AI RAG互联网大厂 Java 面试场景完整实战一、面试背景本地生活电商 智能客服系统场景设定某互联网大厂正在招聘 Java 后端开发业务线是本地生活服务 电商 智能客服AIGC RAG。面试官老王是技术严谨的架构师候选人小Y是号称“全栈AI”的程序员但其实有点水。面试采用场景化提问方式以「同城外卖 到店团购」的本地生活电商为主线引出Spring Boot 微服务、Redis 缓存、Kafka 消息队列、ElasticSearch 搜索、AI 智能客服RAG、监控与日志共3 轮问答每轮 3~5 个问题难度逐步升级二、第一轮基础服务与电商核心流程场景用户在本地生活 App 上下单到店团购券涉及用户服务、商品服务、订单服务。Q1项目整体技术栈怎么选Java Spring Boot 微服务面试官假设你来负责一个本地生活电商后端从技术栈上你会怎么设计语言、框架、微服务方案简单说一下。小Y这个简单我一般就用Java 17吧比较新框架肯定上Spring Boot微服务就用Spring Cloud啊像 Eureka、OpenFeign 那些数据库就 MySQL JPA构建工具用 Maven差不多就这样大家都这么搞的。面试官点点头基础方向没问题但要更具体一些尤其是和业务场景的匹配后面我会追问。Q2订单服务的数据库与 ORM 设计事务与并发面试官用户下单买到店团购券一个订单会涉及用户表、商品表、订单表。你用什么 ORM怎么保证下单扣库存的事务一致性小YORM 我用Spring Data JPA Hibernate就可以了写个OrderEntity就行。事务的话我就加个Transactional在方法里先查库存然后减库存然后插入订单。加了事务就不会有问题了。面试官Transactional是一种手段但在并发下你要考虑锁和隔离级别等问题稍后我们细讲。Q3为什么要使用连接池HikariCP 的作用面试官在这种高并发订单场景数据库连接你怎么管理你会选什么连接池为什么小Y嗯……我们一般就用 Spring Boot 默认的那个……好像叫HikariCP它性能比较好配置也不用写Spring Boot 会自动帮我们装配好连接池。至于为什么好我感觉就是快……比以前的 C3P0 要快很多吧。面试官笑知道用 HikariCP 算不错但要理解它的核心优势这样你才能在连接耗尽、慢查询的时候知道怎么排查问题。Q4基础监控与日志ELK Prometheus Grafana面试官一个面向城市用户的电商平台流量高、接口多。你怎么做监控和日志用什么技术栈小Y嗯监控的话我们一般就接个Prometheus Grafana啊然后日志用Logback SLF4J再把日志丢到ELK里面。只要能看到 QPS 和错误率就可以了。面试官有基础概念后面我们会结合具体指标聊。Q5接口设计与 API 文档REST Swagger面试官用户下单接口你怎么设计比如URL 是什么用什么 HTTP 方法怎么对外描述这套 API小Y就 Restful 风格嘛URLPOST /api/orders请求体里放用户 ID、商品 ID、支付方式之类文档就用Swagger/OpenAPI自动生成Spring Boot 项目加个依赖、打上注解就能生成页面测试也方便。面试官嗯这部分还比较清晰有实践经验。三、第二轮性能优化、缓存与搜索场景平台做活动热门商家和团购券流量激增需要做缓存和搜索优化。Q6Redis 缓存设计与热点商品面试官热门团购券被大量访问如果每次都查数据库会有压力。你如何设计 Redis 缓存具体怎么用考虑哪些问题小Y我肯定用Redis啊在 Spring Boot 里用Spring Data Redis或Spring Cache把商品详情放进 Redis比如 key 叫item:{id}过期时间设长一点这样就不用每次查数据库了。问题的话……可能有缓存穿透、击穿和雪崩这个我感觉就是加点过期时间再搞个热点数据就好了吧。面试官能叫出几个名词不错但场景里要具体设计比如如何防止缓存击穿稍后解析。Q7Redis 与数据库一致性问题面试官商品价格、库存是会变化的你的 Redis 里存的是旧值怎么办怎么保证 Redis 和数据库的数据一致性小Y这个嘛……可以在更新数据库的时候顺便删 Redis 的 key这样下次就会重新从数据库加载。然后如果是批量更新就批量删。再不行就设个比较短的 TTL过期了就会刷新。面试官「删除缓存再更新数据库」这类方案需要注意顺序和并发条件你大致懂思路后面我给你更完整的方案。Q8搜索服务ElasticSearch 如何落地本地生活场景面试官用户在 App 里按关键词搜「火锅自助」还要按距离、评分、价格过滤。你会怎么设计搜索用什么技术小Y这种肯定用ElasticSearch啊把店铺信息、团购信息都索引进去比如店名、品类、评分、经纬度。用户搜索的时候就在 ES 里按关键词 地理位置排序。至于具体 mapping 和查询 DSL我知道有点复杂但可以网上抄一下。尴尬一笑面试官有场景意识这是加分项。但真实环境里要考虑索引更新、数据从 MySQL 到 ES 的同步这到后面会变成一个小系统。Q9限流与熔断保护后端服务面试官大促活动时流量巨大你怎么保护后端服务有没有用过限流、熔断相关的技术小Y嗯可以用Resilience4j啊或者以前的 Netflix Hystrix那种可以对接口做熔断、限流、重试之类。限流的话我们一般搞个网关像Spring Cloud Gateway或者Nginx加上限流配置就能把请求挡一部分。面试官思路可以但要更加明确哪些接口要限流熔断之后用户体验怎么办稍后我会讲落地方案。Q10应用监控指标设计Micrometer Prometheus面试官你刚才提到监控那针对下单这个接口你会采集哪些指标用 Micrometer / Prometheus 怎么做小Y指标嘛……肯定有 QPS、响应时间、错误率。Micrometer 可以自动采集一些 Spring Boot 的指标然后 Prometheus 去拉Grafana 展示图表。具体怎么写我好像就只用过默认的没怎么自定义过。面试官至少知道这条链路后面我们在答案里会给一些示例。四、第三轮消息队列与 AI 智能客服RAG场景订单创建后要异步通知商家、优惠券系统、消息推送平台要做一个智能客服系统支持用户问「这家火锅有自助吗」「可以开发票吗」等问题接入 AI 与业务数据。Q11订单创建后的异步解耦Kafka / RabbitMQ面试官用户下单成功后除了写数据库你还要通知商家系统发送站内信 / App 推送更新搜索索引 这些如果都在一个事务里做系统会很慢也很脆弱。你怎么解耦会用什么消息队列小Y我会用Kafka吧比较大厂标配。订单服务只要往 Kafka 发一个order-created的消息其他系统订阅这个 topic各自做自己的事情。这样订单接口就很快返回了。至于保证不丢消息什么的……可以通过 Kafka 自己的机制吧我记得有 ack 之类。声音越来越小面试官思路对就是经典的事件驱动模型只是可靠性细节你需要再补。Q12消息消费的幂等与重试面试官消费 Kafka 消息时如果消费失败了会重试甚至可能多次消费同一个消息。你怎么保证幂等性小Y嗯……可以在数据库里建一个表记录处理过的消息 ID收到消息先查这个表如果已经处理过就跳过。或者在业务上用订单号做幂等比如更新订单状态的时候用WHERE order_id ? AND status ?这种条件。面试官好这部分比你刚才说得更具体有点经验味道。Q13智能客服系统从 ChatGPT 到 RAG面试官现在业务方说我们要做一个智能客服能回答用户关于商家、团购券的具体问题不能胡说八道还要支持企业知识库问答。你怎么设计这个系统请说到 AI 技术栈。小Y这个我最近也在看。基础上可以用Spring AI做一个统一的调用层支持接入比如OpenAI或Ollama的 Embedding 模型和聊天模型。做RAG检索增强生成先把商家介绍、团购详情、平台规则这些文档用 Embedding 模型转换成向量存到向量数据库比如Milvus或Chroma甚至Redis也可以用户提问时先做语义检索拿到相关文档片段再把这些片段填充到提示词里Prompt Filling让模型生成答案至于什么MCP模型上下文协议啊、工具调用框架我最近只看了点概念还没在生产上用过。面试官眼睛一亮这一段回答还挺像个做过 PoC 的。等下我们在答案部分详细展开让你真的搞明白 RAG。Q14如何降低 AI 幻觉Hallucination风险面试官业务方特别强调回答必须靠谱不能乱编比如不能把没有发票的店说成可以开发票。这就是所谓的AI 幻觉问题。你打算怎么控制小Y嗯……我知道模型有时候会瞎说所以尽量用检索到的文档来回答不要让它自己瞎想在提示里写清楚「只根据提供的上下文回答没信息就说不知道」可能还要做一些规则校验像发票这个信息直接走数据库或者 API不让 AI自己猜吧……具体怎么保证我感觉还要多看资料。有点心虚面试官方向对得把业务关键字段从「生成」改成「查询」。Q15复杂工作流与 Agentic RAG面试官有些问题不是一句话能解决比如用户问「帮我推荐附近 3 家支持电子发票、评价在 4.5 星以上、今晚 9 点还有位置的火锅店。」 这显然是一个复杂工作流先查店铺数据再查发票支持情况再查实时排队或座位信息然后再综合生成回答你听过Agent / Agentic RAG吗觉得可以怎么用在这里小Y我有在看一些 Agent 的文章。大概就是让模型做「大脑」分配任务、调用不同的工具比如一个工具负责查店铺搜索基于 ES一个工具查商家实时状态走 Kafka 或 Redis 里的实时数据一个工具查发票支持的配置 然后 Agent 根据用户问题来组织调用这些工具最后把结果合并并生成答案。不过我还没有真正落地过都是在 demo 里玩玩。不好意思地笑面试官没落地也没关系至少你理解方向。真正上线要考虑的东西会很多。五、面试收尾面试官今天的面试就到这儿吧你在基础 Java Spring Boot 上还可以对 Redis、Kafka、RAG 这些有一些概念但很多细节还需要加强。我们内部评估后会通过邮箱和招聘系统通知你结果你先回去等通知也可以把今天说到的技术点再系统地学习一下。小Y好的好的我一定好好补课心想幸好还没问到 Dubbo、R2DBC、WebSocket、Kubernetes……六、详细答案解析从业务场景到技术落地下面按问题顺序把前面面试中的技术点系统展开给小白一个可学习的路线。A1本地生活电商的整体技术栈设计业务场景同城外卖、到店团购、优惠券、商家管理用户量大、请求多且有明显的活动高峰推荐技术栈语言与平台Java 11 或 17JVM 调优堆大小、GC 选择如 G1/ZGC基础框架Spring Boot快速启动、自动配置Spring MVC / WebFlux根据同步接口或高并发流式场景选择微服务与服务发现Spring Cloud服务注册Eureka / Consul负载均衡Spring Cloud LoadBalancer声明式调用OpenFeign配置中心Spring Cloud Config / Nacos持久层数据库MySQL / PostgreSQLORMSpring Data JPA Hibernate 或 MyBatis连接池HikariCPSpring Boot 默认构建与 CI/CDMaven / GradleJenkins / GitLab CI / GitHub ActionsDocker Kubernetes 部署监控与日志MetricsMicrometer Prometheus Grafana日志Logback/Log4j2 SLF4J集中日志ELKElasticsearch Logstash Kibana这一套是大厂常见的基础架构可以支撑电商类系统。A2订单服务事务与并发控制典型下单流程校验用户状态校验商品状态是否上架、是否有库存生成订单记录扣减库存支付相关逻辑可能是异步技术实现要点事务控制在 Spring 中常用Transactional保证方法内数据库操作要么全部成功要么全部回滚。Transactional public Order createOrder(Long userId, Long itemId) { Item item itemRepository.findById(itemId) .orElseThrow(() - new ItemNotFoundException()); if (item.getStock() 0) { throw new OutOfStockException(); } item.setStock(item.getStock() - 1); itemRepository.save(item); Order order new Order(userId, itemId, OrderStatus.CREATED); return orderRepository.save(order); }并发与锁如果多个请求同时扣库存会出现超卖问题解决方案数据库层UPDATE item SET stock stock - 1 WHERE id ? AND stock 0根据影响行数判断成功与否悲观锁SELECT ... FOR UPDATE注意性能乐观锁用版本号字段version配合更新条件隔离级别常用READ_COMMITTED或REPEATABLE_READ需要避免脏读、不可重复读、幻读根据实际场景选型A3HikariCP 的作用与连接池原理为什么要连接池创建和销毁数据库连接非常昂贵涉及网络和数据库握手高并发下频繁创建连接会导致性能崩溃连接池做了什么启动时创建一定数量的连接空闲连接请求到来时从池中借出连接用完再归还池内维护最大连接数、空闲连接数、连接健康检查HikariCP 的特点高性能相比旧的 C3P0/Druid在延迟和吞吐上有明显优势简洁参数少默认配置合理Spring Boot 2 开始的默认连接池常见配置spring: datasource: url: jdbc:mysql://localhost:3306/demo username: root password: secret hikari: maximum-pool-size: 30 minimum-idle: 5 idle-timeout: 600000 max-lifetime: 1800000 connection-timeout: 30000需要根据业务并发和数据库能力调整这些参数。A4监控与日志体系Micrometer Prometheus ELK监控维度基础系统CPU、内存、磁盘、网络应用层QPS、响应时间、错误率、线程池使用情况、数据库连接池使用情况业务层订单数、支付成功率、退款率等实现方案Micrometer Prometheus GrafanaSpring Boot 集成 Micrometer 后会暴露/actuator/prometheusPrometheus 定时拉取数据Grafana 用来展示图表和告警ELK 日志体系应用使用 Logback / Log4j2 输出日志到文件或直接到 LogstashLogstash 将日志转换后存入 ElasticsearchKibana 用于查询、分析、做 Dashboard结合监控和日志可以快速定位线上问题。A5REST API 设计与 Swagger/OpenAPI 文档订单创建接口示例URLPOST /api/ordersRequest Body{ userId: 123, itemId: 456, paymentMethod: ALIPAY }Response{ orderId: 789, status: CREATED, payUrl: https://pay.example.com/... }Swagger/OpenAPI使用springdoc-openapi或springfox通过注解自动生成 API 文档优点前后端对接口约定清晰可以用在线文档页面测试接口A6Redis 缓存设计与热点问题**业务场景**热门团购详情页被频繁访问。缓存设计Key 设计item:{id}Value商品详情 JSON过期时间如 5~30 分钟几类典型问题**缓存击穿**某个热点 key 在过期瞬间大量请求同时打到数据库。解决使用互斥锁只有一个请求回源数据库其余请求等待使用「逻辑过期」值里存过期时间后台异步刷新**缓存穿透**大量访问根本不存在的 key。解决对不存在的数据缓存一个空对象短 TTL使用布隆过滤器阻挡明显不存在的 key**缓存雪崩**大量 key 同时过期引发系统压力骤增。解决设置不同的过期时间增加随机性做热点数据预加载A7Redis 与数据库一致性方案经典方案删除缓存 更新数据库先更新数据库再删除缓存问题并发场景下可能出现顺序错乱读请求在删缓存后、写请求前写入旧值。改进使用消息队列异步更新缓存把更新操作变成事件驱动数据库成功更新后发送事件专门的消费者负责刷新或删除缓存在大部分电商场景中会采用「最终一致性」而非强一致性。A8ElasticSearch 搜索服务在本地生活中的应用业务需求支持关键词搜索店名、品类、商圈筛选条件距离、价格、评分、是否支持发票排序综合评分、距离优先、销量优先技术要点索引设计字段name,category,location,rating,price,hasInvoice,tags等使用地理位置类型字段geo_point支持距离排序数据同步通过 Kafka 或 Binlog 监听数据库变更有专门的索引服务负责把变更写入 ES查询优化使用多字段匹配multi_match使用聚合aggregation做统计比如每个商圈的店铺数量A9限流与熔断保护后端服务限流防止单个接口被恶意或异常调用导致后端崩溃常见方式网关限流Nginx / Spring Cloud Gateway固定窗口、滑动窗口、令牌桶算法应用层限流Resilience4j RateLimiter熔断下游服务出现大量错误或超时时短期「断开」该服务调用快速失败防止雪崩Resilience4j 提供熔断器CircuitBreaker可以配置错误率阈值和半开状态恢复策略业务处理当接口被限流或熔断时返回友好错误提示比如「当前访问量过大请稍后再试」或者「部分服务暂时不可用」。A10Micrometer 指标实践示例在 Spring Boot 中Autowired MeterRegistry meterRegistry; public void recordOrderMetrics(boolean success, long timeMs) { Counter counter Counter.builder(orders.count) .tag(success, String.valueOf(success)) .register(meterRegistry); counter.increment(); Timer timer Timer.builder(orders.latency) .register(meterRegistry); timer.record(timeMs, TimeUnit.MILLISECONDS); }Prometheus 会采集这些指标Grafana 可以画出订单量、成功率、延迟分布等图表。A11Kafka 事件驱动架构业务场景订单创建后需要通知多个下游系统事件模型Topicorder-created消息体包含orderId,userId,itemId,amount,createTime优点生产者订单服务只负责发事件逻辑简单、响应快消费者可以独立扩展互相不影响易于扩展新功能例如新加一个数据分析服务只需订阅该 topicA12消息消费的幂等与重试问题消息可能重复投递消费者可能在处理过程中失败重试后可能重复操作幂等方案业务幂等根据订单号、用户号、业务状态做条件更新例如UPDATE order SET status PAID WHERE order_id ? AND status CREATED记录处理历史建表processed_message记录消息 ID收到消息先检查有则跳过消费失败重试使用 Kafka 的重试机制或应用层重试失败次数过多时进入死信队列由人工或专用服务处理A13智能客服系统中的 RAG 架构目标让 AI 回答时基于企业真实数据而不是「凭空编故事」RAGRetrieval-Augmented Generation核心流程文档收集与预处理商家介绍、团购详情、平台规则、FAQ、合同条款等使用文档加载组件整理比如分段、去噪声向量化Embedding使用 Embedding 模型OpenAI / Ollama / 其他把每个文本块转换为向量向量是文本的语义表示方便做相似度检索向量数据库存储Milvus / Chroma / Redis支持向量类型存储向量和对应的原文片段检索与重排用户提问时同样做 Embedding在向量库中检索相似度最高的若干文档片段提示填充Prompt Filling把检索到的文档片段 用户问题组织成 Prompt提示模型「请只根据下面提供的文档回答问题不能自己编造如果信息缺失请明确回答不知道。」生成回答使用聊天模型如 GPT-4、Ollama 上的 LLaMA 等生成自然语言回答Spring AI 的作用作为统一的客户端层屏蔽底层不同厂商 API 的差异提供工具调用、向量检索等封装A14降低 AI 幻觉风险的策略幻觉Hallucination模型会生成看起来合理但事实错误的内容控制策略检索优先所有业务问题先走检索模型只基于检索结果回答提示工程明确写出约束只允许使用给定上下文没有信息时必须回答不知道关键字段使用「查询而不是生成」比如「是否可以开发票」、「营业时间」、「地址」等通过业务服务或数据库查询获取模型只负责组织自然语言描述规则与校验对模型输出做后置校验例如发票字段必须与数据库一致人机协同对高风险场景投诉、退款、法律相关启用人工审核或半自动流程A15Agent 与 Agentic RAG 的复杂工作流复杂问题示例帮我推荐附近 3 家支持电子发票、评价在 4.5 星以上、今晚 9 点还有位置的火锅店。这实际上涉及多个系统店铺搜索ES店铺扩展属性是否支持电子发票实时座位/排队信息Redis / Kafka 实时流Agentic RAG 思路工具定义Tool A搜索店铺ESTool B查询发票属性数据库 / 配置中心Tool C查询实时座位信息Redis / KafkaAgent 控制流程解析用户意图和约束条件按顺序调用 Tool A/B/C汇总结果过滤不满足条件的店铺最终生成回答将上述结构化结果作为上下文调用语言模型生成自然语言推荐这样Agent 不是自己「想象」数据而是负责 orchestrate编排不同工具的调用数据仍然来自可靠的业务系统。七、如何继续学习与扩展如果你是小白或在准备互联网大厂 Java 面试建议按照以下路径学习基础打牢Java SE集合、并发、JVM、泛型、IO、StreamSpring Boot Spring MVC核心服务能力数据库设计、事务、ORMHibernate / MyBatisRedis 缓存、常见缓存问题穿透、击穿、雪崩消息队列Kafka / RabbitMQ、事件驱动模型工程化与运维日志与监控Micrometer、Prometheus、ELKDocker、Kubernetes、CI/CD搜索与大数据ElasticSearch 搜索简单了解 Hadoop、Spark、Flink 等AI 与 RAGEmbedding、向量数据库、语义检索RAG 架构、Agent、工具调用框架把本文的场景当作一条主线多次复盘相当于提前做了一次「模拟大厂业务线」面试对你后续真实面试和工作都会有帮助。