大厂内容社区面试实录:从 Spring Boot 微服务到 AI RAG 问答(附详细解析)

张开发
2026/4/14 18:09:19 15 分钟阅读

分享文章

大厂内容社区面试实录:从 Spring Boot 微服务到 AI RAG 问答(附详细解析)
大厂内容社区面试实录从 Spring Boot 微服务到 AI RAG 问答附详细解析一、故事背景内容社区的 Java 面试场景设定公司类型互联网大厂做内容社区 UGC AIGC 推荐类似「知乎 小红书 AI 问答」的综合平台。技术栈以Java Spring Boot Spring Cloud为主配合Kafka、Redis、Elasticsearch、Docker/Kubernetes、Prometheus/Grafana、RAG 智能问答等。主角面试官P8 架构师风格严肃、逻辑性强。候选人小Y简历写满技术栈看起来像“全会”但其实有点“水货”基础还行复杂问题容易飘。面试分3 大轮围绕一个“内容社区 AI 问答”的业务场景层层深入第一轮单体到 Spring Boot 微服务 基础能力第二轮微服务拆分、消息队列、缓存 搜索第三轮监控、链路追踪、CI/CD、以及 AI RAG 智能问答对话结束后文末给出每个问题的详细标准答案 场景解析适合小白系统学习。二、第一轮从用户发帖到基础服务设计场景一个类似「内容社区」的产品用户可以发图文 / 视频内容、点赞、评论后续还要接 AI 生成内容AIGC。第一轮·问题 1项目整体架构面试官假设我们要做一个内容社区用户注册登录、发帖、评论、点赞还有基础推荐。你用Java 技术栈会怎么选型整体架构大概怎么设计小Y嗯……我肯定用Spring Boot再加上Spring MVC写接口。数据库嘛就用MySQL MyBatis。Redis 也要上用来做缓存。日志的话用Logback SLF4J就够了。部署的话可以用Docker打包一下然后丢到Kubernetes上跑这样就很微服务了。面试官点头有一些关键点你提到了但是整体架构还是比较零散后面我会结合你的回答往下深挖。第一轮·问题 2接口设计与 Spring Boot 细节面试官那我们以「发布帖子图文」为例说一下接口的 URL 和请求方式会怎么设计用 Spring Boot Spring MVC大致会写出什么样的 Controller 代码结构小Y发布帖子嘛一般是POST请求比如/api/post/create之类的。Spring Boot 的 Controller我就这么写RestController RequestMapping(/api/post) public class PostController { PostMapping(/create) public PostDTO create(RequestBody CreatePostRequest request) { // 调用 service 保存 return postService.create(request); } }差不多就这样很简单。面试官最基础的确实够用了后面我会问你关于验证、异常处理、链路追踪等更完整的实践。第一轮·问题 3事务与数据库设计面试官发布帖子时我们需要往数据库写入帖子主表、帖子内容表甚至还有标签表。你会如何设计数据库表事务怎么保证用什么技术栈小Y我就建一个post表然后把标题、内容直接都放里面简单好用。事务的话用Spring MyBatis在 Service 上加一个Transactional注解不出问题的。面试官略皱眉你这个设计能用但不太适合后续复杂功能我们后面在答案解析里会展开。第一轮·问题 4简单登录与安全面试官那用户登录这块如果我们先不上复杂的 OAuth2只做最简单的账号密码登录你会用什么方案小Y就写个/login接口然后查数据库匹配账号和密码。然后用JWT生成一个 token 返回给前端。下次请求带上 token 就行。面试官JWT 方向是对的那密码加密、token 校验、权限控制后面再追问。第一轮·问题 5单元测试面试官你上面说的这些 Controller、Service你平时会怎么写单元测试用哪些测试框架小Y我都用JUnit 5有时候也用Mockito。比如 Controller我就写个测试类用SpringBootTest跑起来然后模拟发请求看看返回是不是 ok。就差不多了。面试官轻轻笑至少你知道要写测试这一点值得肯定。那我们进入第二轮聊聊微服务拆分、缓存和消息队列。三、第二轮微服务、缓存、消息队列与搜索场景继续内容社区用户量上升要拆微服务、加缓存、引入消息队列和搜索引擎。第二轮·问题 1微服务拆分与 Spring Cloud面试官用户量上来之后你会怎么把这个内容社区从单体拆成微服务参考Spring Cloud的体系至少划分出哪些核心服务注册发现和调用用什么小Y那肯定要拆成很多服务用户服务帖子服务评论服务点赞服务推荐服务注册发现就用Eureka然后服务间调用用OpenFeign就搞定了。面试官拆的方向还不错但缺少对网关、配置中心、熔断限流的考虑后面答案里我会补充一个完整方案。第二轮·问题 2缓存与 Redis面试官热门帖子详情访问很频繁数据库压力很大。你用Redis做缓存会怎么设计 key、多久过期如何避免缓存击穿、雪崩和穿透小Y略显犹豫嗯……Redis 我一般就用post:{id}这种 key过期时间随便 5 分钟吧。缓存击穿嘛……可以加个互斥锁避免很多请求同时打到数据库。雪崩就……呃……可以随机一下过期时间穿透就……可以用布隆过滤器吧面试官点头概念基本知道但你说得比较散后面我会在解析里系统梳理一下。第二轮·问题 3Kafka 在内容系统中的应用面试官用户发帖、点赞、评论这些行为我们希望用于异步计数、消息通知、推荐特征收集。你会怎么用Kafka来做设计几个 topic消费策略如何小YKafka 的话我就弄一个user-action的 topic把所有行为都发进去。然后消费端根据 action type 不同做不同事情就好了。消费策略嘛反正就是多开几个 consumer做成 consumer group自动分区多一点就快一点。面试官思路有一点但对Topic 设计、幂等、顺序性、死信队列这些没考虑清楚。稍后在答案里我会给出更落地的设计。第二轮·问题 4Elasticsearch 搜索面试官我们的帖子需要支持搜索比如按标题、内容、标签做检索。你会如何用Elasticsearch或Spring Data Elasticsearch来实现索引怎么设计和数据库如何保持一致小Y我会建一个post_index的索引把帖子标题、内容都存进去。然后用Spring Data Elasticsearch定义一个 Repository像查数据库那样用就行了。数据一致性嘛……可以在新建帖子的时候同时写库和 ES就还可以吧。面试官摇头同时写库和 ES 会有不少坑尤其是失败重试、幂等等答案解析里我会给出一个比较通用的方案。第二轮·问题 5接口文档与 Swagger/OpenAPI面试官你们这么多微服务API 怎么管理你会用 Swagger/OpenAPI 吗小Y会的会的我在项目里一般用Springdoc OpenAPI或Swagger加注解就能生成接口文档比如Operation(summary 创建帖子) PostMapping(/create) public PostDTO create(RequestBody CreatePostRequest request) { ... }然后就能在/swagger-ui.html看到文档了。面试官至少你用过没问题。下面第三轮我们聊聊监控、CI/CD以及你简历里写的 AI RAG 问答。四、第三轮监控、链路追踪与 AI RAG 智能问答第三轮·问题 1监控与日志体系面试官这么多服务你怎么做监控与日志请结合日志Logback/SLF4J ELK指标Micrometer Prometheus Grafana链路追踪Jaeger/Zipkin给我一个整体方案。小Y日志就用Logback SLF4J打日志然后收集到ELK里Kibana 查日志。指标的话用Actuator它不是有/actuator/prometheus接口嘛Prometheus 抓一下然后 Grafana 展示。链路追踪……我们可以用Sleuth Zipkin吧现在也可以上 OpenTelemetry 之类的我了解得也不是特别细。面试官有一些关键名词说明你有接触但缺乏整体设计意识。解析部分我会给出一个较完整的监控体系方案。第三轮·问题 2CI/CD 与灰度发布面试官你们代码从提交到上线怎么做 CI/CD结合Git、Jenkins 或 GitLab CI、Docker、Kubernetes说一下。最好顺带讲讲灰度发布怎么做。小Y我们一般是开发提交代码到Git然后由Jenkins拉代码执行Maven构建打包成 jar再用Docker打镜像推到镜像仓库然后部署到Kubernetes上。灰度的话可以把 Deployment 副本数调一下一部分新版本一部分旧版本……差不多是这样。面试官流程还算顺但对灰度/回滚策略讲得过于笼统后面答案里我会补充。第三轮·问题 3AI RAG 问答在内容社区中的应用重点来了业务要引入 AI 问答功能让用户基于社区内容进行智能问答与搜索。面试官你简历上写了“熟悉RAG、Agent、向量数据库等 AI 技术”。现在公司要做一个「基于社区内容的 AI 问答」功能大致要求用户提问系统从社区内容里检索相关帖子作为上下文使用大模型生成回答尽量减少幻觉支持后续扩展成企业文档问答、智能客服。你会怎么用 Java 生态里的技术来落地比如Spring AI、向量数据库Milvus/Chroma/Redis、Embedding、RAG 流程等。小Y开始飘嗯……RAG 就是Retrieval-Augmented Generation嘛就是先检索再生成。我们可以用Spring AI调一下 OpenAI 或者别的大模型然后 Embedding 用 OpenAI 的模型把帖子向量化丢到比如说 Redis 里面吧用作向量数据库……然后用户问问题的时候我们就把问句 Embedding 一下在 Redis 里搜索最近的几个帖子然后把帖子内容拼接到 Prompt 里让大模型输出答案这样就减少幻觉了……至于 Agent 什么的就是让模型调用工具之类的比如再调用一下搜索接口或者数据库 API……面试官稍微沉默你说的方向大差不差但细节非常模糊比如向量检索怎么做如何做会话内存怎么控制幻觉怎么在业务里逐步接入这些都没有说清楚。我们最后一个问题稍微轻一点。第三轮·问题 4接口稳定性与熔断限流面试官AI 接口一般比较贵也可能很慢甚至失败。你会如何在 Java 微服务里对接这些 AI 接口同时保证整体系统稳定可以结合Resilience4j、Spring Cloud Gateway之类的说说。小Y可以用Resilience4j做熔断、限流、重试……比如请求 AI 如果超时的话就快速失败走降级逻辑。在网关那一层比如用Spring Cloud Gateway或者Zuul也可以做限流避免太多请求打到 AI 接口。实在不行就返回一个「稍后再试」啥的。面试官好的今天就先到这里。第三轮结束面试官结束语整体来看你在基础部分还可以复杂场景下的设计能力和实践经验比较欠缺。我们会在一两周内给你反馈你先回去等通知吧。小Y苦笑好好的谢谢老师……五、面试题标准答案与详细解析下面是上面所有问题的参考答案 场景解析按照轮次整理适合新人系统学习。第一轮详解从单体到基础服务1. 整体架构与技术选型业务场景用户注册登录发图文/短视频帖子点赞、评论简单推荐流按时间 热度推荐技术选型核心语言与平台Java 11 / 17长期支持性能与语法特性更好Spring Boot 2.x/3.x 作为应用骨架Web 层Spring MVC同步接口若后续有长连接/推送可配合 WebSocket 或 Spring WebFlux持久层关系型数据库MySQLORMJPA/Hibernate 或 MyBatis连接池HikariCP数据迁移Flyway 或 Liquibase缓存Redis热点数据缓存、计数、会话等消息队列Kafka行为日志、异步计数、推荐特征搜索与推荐Elasticsearch搜索初期推荐可以简单按热度 时间不必一开始就上复杂算法日志 监控日志SLF4J Logback集中到 ELK指标Micrometer Prometheus Grafana链路追踪OpenTelemetry Jaeger/Zipkin部署与运维Docker 容器化Kubernetes 编排CI/CDJenkins/GitLab CI/GitHub Actions架构形态建议初期可以是分层单体Modular Monolithinterface 层Controllerapplication 层Servicedomain 层领域模型infrastructure 层持久化、消息、缓存随着业务发展再逐步拆分微服务。2. 发布帖子接口设计接口设计建议URLPOST /api/v1/posts请求体{ title: 今天在地铁上遇到一件事……, content: 具体内容……, coverImageUrl: https://..., tags: [职场, 通勤], type: ARTICLE // 或 VIDEO }响应体包含帖子 id、创建时间等。Controller 示例要点RestController RequestMapping(/api/v1/posts) public class PostController { private final PostService postService; public PostController(PostService postService) { this.postService postService; } PostMapping public ResponseEntityPostDTO create(Valid RequestBody CreatePostRequest request, AuthenticationPrincipal LoginUser user) { PostDTO result postService.createPost(request, user.getId()); return ResponseEntity.status(HttpStatus.CREATED).body(result); } }关键点使用Valid做参数校验结合javax.validation注解。从安全上下文中获取当前登录用户Spring Security。返回201 Created符合 REST 语义。3. 数据库设计与事务数据表建议post帖子主表id、user_id、title、type图文/视频、status、create_time、update_timepost_content帖子内容表post_id、content可为长文本post_tag标签表id、namepost_tag_rel帖子-标签关联post_id、tag_id事务处理在 Service 层使用TransactionalService public class PostServiceImpl implements PostService { Transactional public PostDTO createPost(CreatePostRequest request, Long userId) { // 1. 写 post // 2. 写 post_content // 3. 处理标签 关联 // 若中间失败整体回滚 } }使用JPA/Hibernate或MyBatis HikariCP作为持久化层。4. 简单登录与安全基本流程用户注册时密码使用BCrypt等算法加密存储不要明文。登录接口根据用户名查用户使用密码加密算法验证签发 JWT内含用户 id、角色等信息返回给前端。每次请求前端在 headerAuthorization: Bearer token传 JWT后端通过 Spring Security 过滤器解析 JWT建立认证上下文。关键技术点Spring Security认证、授权框架JWTJSON Web Token无状态令牌注意令牌要有过期时间签名 key 要妥善保存对敏感操作可配合 redis 黑名单做 token 作废5. 单元测试与测试框架常见组合单元测试JUnit 5 AssertJMockMockitoSpring 相关SpringBootTest、WebMvcTest示例Service 层测试ExtendWith(MockitoExtension.class) class PostServiceTest { Mock private PostRepository postRepository; InjectMocks private PostServiceImpl postService; Test void createPost_shouldSavePost() { CreatePostRequest request new CreatePostRequest(title, content); when(postRepository.save(any(Post.class))) .thenAnswer(invocation - { Post p invocation.getArgument(0); p.setId(1L); return p; }); PostDTO dto postService.createPost(request, 100L); assertThat(dto.getId()).isEqualTo(1L); } }第二轮详解微服务拆分、缓存与 MQ、搜索1. 微服务拆分与 Spring Cloud典型服务划分用户服务user-service账号、资料、关系内容服务post-service帖子 CRUD互动服务interaction-service点赞、收藏、评论搜索服务search-service基于 ES 的搜索推荐服务recommendation-serviceFeed 流、个性化推荐网关服务api-gateway统一入口、鉴权、限流基础组件Spring Cloud Netflix OSS服务注册发现Eureka / Consul配置中心Spring Cloud Config / Nacos网关Spring Cloud Gateway / Zuul客户端调用OpenFeign Ribbon或使用 Spring Cloud LoadBalancer容错Resilience4j替代 Hystrix调用示例FeignClient(name user-service) public interface UserClient { GetMapping(/internal/users/{id}) UserDTO findById(PathVariable(id) Long id); }2. Redis 缓存设计与三大问题Key 设计帖子详情post:detail:{postId}帖子点赞数post:likeCount:{postId}热门列表post:hot:listZSet过期策略热门帖子短 TTL如 5~10 分钟且随机加减几分钟避免集中失效。不常变化的数据可以长 TTL 或不设置 TTL配合后台刷新。缓存三大问题处理缓存穿透大量访问不存在的数据解决对不存在的 key 也写入短期空值使用Bloom Filter预过滤非法 id缓存击穿某个热点 key 失效瞬间大量请求打到数据库解决互斥锁只有一个线程去加载 DB其余等待或返回旧值逻辑过期 后台异步刷新缓存雪崩大量 key 同时失效解决随机过期时间多级缓存本地 Caffeine Redis热 key 提前续期或永不过期 后台刷新技术实现使用 Spring Cache (Cacheable)、Redisson 分布式锁、Caffeine 作为本地缓存。3. Kafka 在内容系统中的使用常见 Topic 设计user-action-log记录用户行为view/like/comment/sharepost-event帖子创建/更新/删除notification-event消息通知事件典型消费场景行为日志用于推荐特征、运营分析post-event用于搜索服务更新 ES计数服务更新统计设计要点幂等消费者处理消息时要能根据业务主键去重比如使用本地表记录已处理 offset 或使用业务 id。顺序性对同一帖子相关的事件可以将 partition key 设为postId保证同一帖子事件顺序消费。死信队列对于多次失败的消息发送到*-dlq主题人工或异步处理。4. Elasticsearch 搜索与数据一致性索引设计PUT post_index { mappings: { properties: { id: {type: keyword}, title: {type: text, analyzer: ik_max_word}, content: {type: text, analyzer: ik_max_word}, tags: {type: keyword}, createTime: {type: date}, status: {type: keyword} } } }与数据库同步的推荐方案写路径业务操作写 MySQL强一致写成功后发送post-event到 Kafkasearch-service订阅post-event异步更新 ES好处解耦业务写入与搜索系统通过重放 Kafka支持重建索引注意点要容忍最终一致性数据在极短时间内可能不在搜索结果中。5. Swagger/OpenAPI 管理 API实践建议统一使用Springdoc OpenAPI生成 OpenAPI 3 规范。每个微服务暴露自己的 API 文档网关或文档服务统一聚合。配置示例Spring Boot 3OpenAPIDefinition( info Info(title Post Service API, version v1) ) SpringBootApplication public class PostServiceApplication { }第三轮详解监控、CI/CD 与 AI RAG1. 监控与日志体系目标出问题能快速定位哪台机器哪个服务哪条链路有数据支持容量规划与性能优化。日志体系ELK应用Logback SLF4J 输出 JSON 格式日志日志收集Filebeat/Fluentd 收集 - Logstash - Elasticsearch可视化Kibana指标监控应用Micrometer Spring Boot Actuator 暴露/actuator/prometheus指标QPS、接口耗时、错误率、JVM 内存、GC 次数、线程数、连接数等Prometheus 抓取 - Grafana 看板展示设置告警链路追踪使用 OpenTelemetry SDK在每个服务中埋点通过 B3 / W3C Trace Context 在 HTTP / MQ 调用中传递 traceIdJaeger 或 Zipkin 展示调用链这样用户一次请求从网关 - 多个微服务 - 数据库 / 缓存 / MQ 的完整路径都可视化。2. CI/CD 与灰度发布典型流水线开发提交代码到 GitGitLab/GitHubCI触发 Jenkins/GitLab CI Pipeline步骤编译 单元测试Maven/Gradle代码扫描SonarQube打包 Jar构建 Docker 镜像并推送到镜像仓库CD通过 Jenkins Pipeline 或 GitOpsArgo CD更新 Kubernetes 部署使用 Rolling Update / Blue-Green / Canary 等策略灰度发布以 Kubernetes Istio 为例把新旧版本同时部署为两个 Deploymentv1、v2。使用 Istio/Service Mesh 或 Gateway 控制流量比例如 5% - 20% - 100%。如果监控指标异常自动或人工回滚到 v1。3. AI RAG 智能问答方案业务目标用户在内容社区提问系统能够检索社区已有内容作为知识库调用大模型生成答案尽量减少纯幻想AI 幻觉可扩展到企业文档问答、智能客服。整体架构文档加载与拆分将帖子、文章、FAQ、文档等内容抽取出来使用分段算法按段落、按长度切成较短文本向量化Embedding调用 Embedding 模型OpenAI、Ollama 等生成向量表示使用 Java 客户端调用比如通过 Spring AI 封装的客户端向量数据库存储在 Milvus/Chroma/Redis Vector 等记录向量 原文 元信息作者、时间、标签等语义检索用户提问 - Embedding - 在向量库中做相似度搜索取 TopK 条最相关内容作为上下文RAG 生成构造 Prompt系统提示你是某内容社区助手只能基于提供的上下文回答上下文检索到的帖子内容们用户问题调用大模型生成最终回答会话内存 Agent 扩展对多轮对话保存历史提问和摘要Agent 可以在需要时调用工具比如搜索接口、用户画像服务、知识库更新服务等在 Java 中的落地示意使用Spring AI封装配置大模型、Embedding 模型定义 RAG Chain检索 生成使用Redis Redisearch或向量数据库存储向量通过 REST API 暴露POST /api/v1/ai/ask接口减少幻觉的手段检索质量合理的分段粒度向量检索 关键词检索混合提示工程Prompting明确要求模型如果上下文没有答案要说「我不知道」引用原文在回答中给出来源链接或片段方便用户验证4. 接口稳定性与 Resilience4j对接外部 AI 接口常见问题延迟高、容易超时调用成本高需控制 QPS偶尔失败网络、限流设计方案在调用 AI 的 Service 层使用Resilience4j超时控制TimeLimiter重试策略Retry断路器CircuitBreaker限流RateLimiter在网关层Spring Cloud Gateway限流基于 IP / 用户 id 限制 AI 问答 QPS认证确保只有登录用户才能访问降级策略当 AI 接口不可用时返回基于搜索的结果提示用户稍后再试六、小结从业务到技术的思考路径通过这场「内容社区 AI 问答」的大厂 Java 面试我们串联了从单体 Spring Boot 应用到Spring Cloud 微服务的演进数据库 Redis 缓存 Kafka Elasticsearch的协同日志、监控、链路追踪、CI/CD、灰度发布的工程化能力如何将RAG、向量数据库、Spring AI等 AI 能力融入到 Java 业务系统中。也可以看到小Y 虽然会一些概念但在系统性设计边界条件处理工程化落地 上仍有明显短板。如果你是刚入门的 Java 开发可以从本文的答案解析开始一边看业务场景一边对照技术点逐步形成自己的系统知识框架这样下次面对类似的大厂面试不至于像小Y那样只能「含糊其辞」。

更多文章