用音视频内容社区场景拿下 Java 面试:Spring Boot + 微服务 + Kafka + Redis + RAG 全流程实战
用音视频内容社区场景拿下 Java 面试:Spring Boot + 微服务 + MQ + 缓存 + RAG 全流程实战
场景:互联网大厂音视频内容社区业务线 Java 后端面试
人物:
- 严肃面试官:L 面试官
- 搞笑水货程序员:小 Y(偶尔清醒,偶尔迷糊)
第一幕:基础功能与整体架构(第 1 轮提问)
业务背景: 公司在做一个「短视频 + 图文 UGC 社区」,类似抖音 + 小红书。用户可以发布短视频、图片笔记,进行点赞、评论、关注、私信。你应聘的是 内容服务后端 Java 工程师。
Round 1 · Q1:项目整体技术栈与分层设计
L 面试官:
我们先从整体说起。如果让你从零设计这个音视频内容社区的后端,你会用什么技术栈?整体架构大概怎么分层?
小 Y:
咳…这个我熟,我肯定用 Spring Boot 啊,然后分成 Controller、Service、DAO 三层,然后用 MySQL 存数据,Redis 做下缓存,差不多就能跑起来了。
L 面试官:
说得还行,但太粗了。有没有考虑微服务?网关?认证?调用链路?待会我们再聊细一点。
Round 1 · Q2:用户发布短视频的流程
L 面试官:
我们聚焦到一个最基础的功能:用户发布短视频。从用户在 App 上点击「发布」,到视频可以在首页瀑布流里看到,大致会经历哪些后端流程?涉及哪些服务?
小 Y:
嗯…这个流程就是:
- 用户上传视频到后端;
- 后端保存一下数据库;
- 然后直接在首页查出来就行了。
就是这么个流程,挺简单的。
L 面试官:
你说的是最朴素的版本。真实场景下会涉及 对象存储、转码、审核、Feed 流 等,细节我们放到后面的答案部分展开。
Round 1 · Q3:选择 Spring MVC 还是 Spring WebFlux?
L 面试官:
你来设计内容服务 API,如果有高并发上传/播放请求,你会用 Spring MVC 还是 Spring WebFlux?为什么?
小 Y:
这个…WebFlux 感觉比较先进,我看网上都说高并发用 WebFlux,所以我就用 WebFlux 吧…因为它是响应式的,性能高。
L 面试官:
结论不能算错,但理由太空。你要能说清楚 WebFlux 的优势边界,以及什么时候我们 宁愿用 Spring MVC + 线程池优化 而不是 WebFlux。
Round 1 · Q4:数据库与 ORM 选型
L 面试官:
内容服务里会有很多表:用户、作品、评论、点赞、关注关系等等。你在数据库和 ORM 上怎么选?比如 Hibernate、MyBatis、JPA、Spring Data 等。
小 Y:
我习惯用 MyBatis,写 SQL 更自由。然后配个 HikariCP 连接池就行。Hibernate 我觉得比较重。
L 面试官:
不错,这个点说到关键了:复杂查询场景下 MyBatis 优势。但也要知道 JPA、Spring Data 在一些 CRUD 场景可以提升效率。
Round 1 · Q5:基础日志与监控
L 面试官:
如果这个内容服务要上线生产环境,你会如何设计日志与监控?比如用哪些框架和组件?
小 Y:
日志就 Logback + SLF4J 呗,打到文件里,然后…监控的话,嗯…可以用 Prometheus 和 Grafana 吧,然后再搞个 ELK,搜日志会方便一点。
L 面试官:
这个回答可以,会用到 Logback/SLF4J + ELK + Prometheus + Grafana,后面我们再展开讲具体怎么接入。
第二幕:微服务、消息队列与缓存(第 2 轮提问)
业务背景升级: 平台日活快速增长,短视频与直播功能上线。发布量、播放量、互动量都上来了,需要扩展到 微服务架构,并引入 消息队列、缓存、搜索推荐。
Round 2 · Q1:微服务拆分与调用链路
L 面试官:
现在我们把系统拆成多个微服务,比如:用户服务、内容服务、评论服务、Feed 服务、推荐服务、搜索服务等等。你会用什么技术栈来做微服务?服务之间怎么发现与调用?
小 Y:
微服务肯定用 Spring Cloud 啊,然后用 OpenFeign 调接口,用 Eureka 做注册中心,还有个 Zuul 当网关。差不多就这一套 Netflix OSS 全家桶。
L 面试官:
嗯…Netflix OSS 是经典,但现在很多公司在用 Spring Cloud Alibaba 或者基于 Kubernetes 的服务发现,另外 Zuul 已经比较老了。说明你还停留在旧知识,需要补一下。
Round 2 · Q2:发布视频后的异步处理(消息队列)
L 面试官:
用户发一个视频,除了写数据库,还会触发:
- 视频转码
- 内容审核(涉黄涉政)
- 生成多码率、多清晰度
- 更新推荐系统、搜索索引
这些如果都在同步接口里做,会很慢。你会怎么设计?用什么 MQ?
小 Y:
那就用 Kafka 呗,现在大厂都用 Kafka。发布接口只写一条消息到 Kafka,然后后台有好几个消费者慢慢处理就行。反正 Kafka 特别能扛。
L 面试官:
大方向没问题,但你要考虑 顺序性、幂等、失败重试,还有一些场景 RabbitMQ/Redis Pub/Sub 也会用到。
Round 2 · Q3:热门视频列表的缓存设计
L 面试官:
首页瀑布流会有「热门视频列表」,QPS 非常高。如果你用 Redis 来做缓存,会怎么设计?如何避免缓存雪崩、击穿、穿透?
小 Y:
这个我知道:
- 雪崩就把过期时间打散;
- 击穿就加互斥锁;
- 穿透就加个布隆过滤器。
然后热门列表放在 Redis 的 list 或者 sorted set 里,定时刷新就行。
L 面试官:
思路是对的,不过需要更完整的方案,比如 本地缓存 + 分布式缓存多级缓存,以及如何用 Caffeine/Hazelcast 提升性能。
Round 2 · Q4:Feed 流与去重
L 面试官:
用户关注了很多 UP 主,首页会看到「关注流」,同时还有一个「推荐流」。你怎么设计这个 Feed 流?如何保证用户不会在关注流里看到重复内容?
小 Y:
这个…可以给每个用户维护一个时间线,然后把关注的人发的内容都插进去,再按时间倒序查,然后…去重的话就,把 ID 放一个 set 里,查的时候判断一下。
L 面试官:
你说的是一个方向,但真正的 Feed 流,一般会结合 Redis、消息队列、甚至大数据平台的离线计算,而不仅仅是简单的 set 去重。
Round 2 · Q5:服务的稳定性与熔断限流
L 面试官:
如果推荐服务、搜索服务偶尔超时或者挂掉了,你的内容服务接口要怎么办?会不会一直卡死?你会怎么做熔断、限流、降级?
小 Y:
这个可以用 Resilience4j,或者以前的 Hystrix,做熔断和限流。比如说调用推荐服务失败,就走默认的热门列表。然后设置超时时间,超过就直接返回兜底数据。
L 面试官:
不错,至少知道要 熔断 + 降级策略。后面我们在答案里详细讲一个示例。
第三幕:安全、AI 与 RAG 智能客服(第 3 轮提问)
业务背景再升级: 平台计划上线「智能客服系统」,帮助用户解决「账户问题、内容违规申诉、创作者运营问题」等,并提供 企业文档问答、创作者规则查询 等能力,需要引入 大模型 + RAG + Agent 技术。
Round 3 · Q1:接口安全与用户隐私
L 面试官:
我们的内容社区会涉及用户隐私数据(手机号、聊天记录、提现信息等)。你准备如何保护 API 接口安全?比如认证、授权、Token、权限控制这块。
小 Y:
Spring Security 加 JWT 就可以了。用户登录以后,发一个 JWT,后面请求都带着。然后在接口上做权限注解,@PreAuthorize 之类的。要再高级一点就搞 Keycloak 单点登录。
L 面试官:
整体思路没问题,但你要了解 OAuth2 授权模式、Token 过期与刷新、以及如何与网关配合做统一认证。
Round 3 · Q2:智能客服系统的整体方案
L 面试官:
现在公司要做「智能客服系统」,支持:
- 用户自然语言咨询:比如「为什么我的视频被限流?」
- 创作者查询平台规则:比如「直播带货需要什么资质?」
- 企业内部运营、风控同学查询内部文档
你会怎么设计整体架构?用到哪些 AI 技术点和组件?
小 Y:
这个…那就上大模型啊。比如调用 OpenAI 的接口,用户问什么就丢过去,让它直接回答。然后我们前面用 Spring Boot 搭个 HTTP 接口,转发一下就好了。
L 面试官:
如果只这样做,就会有严重的 AI 幻觉(Hallucination),而且无法回答企业内部文档问题。需要用到 RAG、向量数据库、文档加载等 技术。
Round 3 · Q3:RAG 检索增强生成怎么落地?
L 面试官:
具体一点,你能说说 RAG(检索增强生成)的基本流程吗?比如用 Milvus 或 Redis 作为向量数据库时,数据怎么走?
小 Y:
RAG…我大概知道:就是先向量化,再检索,然后把文档喂给大模型。向量数据库嘛,可以用 Milvus 或者 Redis 的那个…向量索引。我目前还没实战过。
L 面试官:
至少概念答到了,但要是你能把 Embedding 生成、语义检索、提示填充 每一步说清楚,就更好了。
Round 3 · Q4:聊天会话内存与 Agent 能力
L 面试官:
智能客服还要记住用户上下文,比如前后几轮的提问,并支持「办理退款」「修改收货地址」这类带有 工具调用 的复杂流程。你觉得要怎么设计?
小 Y:
这个…是不是就是在 Redis 里把历史聊天记录存一下?然后每次都带上前几条?至于工具调用,我知道有那种 Agent 框架,可以帮模型自动调用接口…但具体我还没研究。
L 面试官:
回答比较模糊,不过算是提到了关键点:
- 聊天会话内存
- 工具调用框架
- Agent 执行工作流
Round 3 · Q5:整体上线与 CI/CD
L 面试官:
最后一个问题:整个内容社区后端 + 智能客服系统,在上线与运维方面,你会用什么 CI/CD、容器化、监控与追踪方案?
小 Y:
CI/CD 就 Jenkins 或 GitLab CI 搭个流水线,打包成 Docker 镜像,部署到 Kubernetes 上。监控的话 Prometheus + Grafana,日志用 ELK。链路追踪可以用 Zipkin 或 Jaeger。
L 面试官:
这块回答比较完整。
面试收尾
L 面试官:
今天就先到这里。你在一些基础和常见框架上的掌握还可以,但在 微服务演进、异步架构、RAG 与 Agent 等新技术 上还需要补课。我们会综合评估,你先回去等通知。
小 Y:
好…那我回去先把 RAG 好好学学。
标准答案与知识拆解(给小白看的详解)
下面是对上面问题的系统梳理,按业务场景 + 技术点来讲,给刚入门的同学一个完整的学习路径。
一、音视频内容社区的整体技术架构
1.1 基础技术栈
- 语言与平台:Java 8/11 为主,JVM 调优视规模而定
- Web 框架:Spring Boot + Spring MVC 为主;需要高并发长连接可用 WebFlux / WebSocket
- 数据库与 ORM:
- 关系型数据库:MySQL / PostgreSQL
- ORM:MyBatis + Spring Data(CRUD 场景),连接池 HikariCP
- 数据迁移:Flyway 或 Liquibase
- 缓存:Redis 为主,可配合 Caffeine 做本地缓存
- 消息队列:Kafka(高吞吐日志流、行为流)、RabbitMQ/Redis Pub/Sub(低延迟通知类)
- 日志与监控:
- 日志:SLF4J + Logback/Log4j2
- 日志采集:Filebeat/Logstash -> Elasticsearch -> Kibana(ELK)
- 指标:Micrometer -> Prometheus -> Grafana
- 链路追踪:Zipkin 或 Jaeger
- 容器与部署:Docker + Kubernetes(K8s),CI/CD 用 Jenkins / GitLab CI / GitHub Actions
1.2 典型分层
- API 层:
- Spring MVC Controller
- DTO、参数校验(Hibernate Validator)
- Service 层:
- 业务逻辑、事务控制(Spring Transaction)
- Repository/DAO 层:
- MyBatis Mapper 或 Spring Data Repository
- 基础组件层:
- Redis 客户端(Lettuce)、MQ 客户端(Kafka/RabbitMQ)、对象存储 SDK
- 网关层(微服务阶段):
- Spring Cloud Gateway / Nginx / Ingress Controller
二、用户发布短视频的完整后端流程
2.1 业务流程拆解
用户在 App 上点击「发布短视频」,背后通常是:
- 上传媒体文件:
- 客户端直传到对象存储(如阿里云 OSS、腾讯云 COS、Amazon S3)
- 只把上传后的 URL/Key 回传给后端服务
- 调用后端发布接口:
- 请求体包含:标题、描述、封面、媒体文件 Key、标签等
- 后端只做必要的参数校验、权限校验
- 写入内容数据库:
- 在
video表中插入一条记录,状态为PROCESSING
- 在
- 发送异步任务(关键):
- 往 Kafka 发送消息:
video_uploaded - 消息内容包含视频 ID、文件 Key 等
- 往 Kafka 发送消息:
- 异步处理服务消费:
- 转码服务:多码率转码、截图、封面生成
- 内容审核服务:涉黄涉政检测、过滤违规内容
- Feed/推荐服务:更新用户 Feed、写入曝光候选池
- 搜索服务:构建索引(Elasticsearch)
- 状态更新:
- 当转码和审核通过后,把
video状态更新为PUBLISHED
- 当转码和审核通过后,把
- 用户可见:
- 首页、个人主页、关注流中都可以看到
2.2 涉及到的技术组件
- Spring Boot + Spring MVC 提供 REST 接口
- 数据库:MySQL + MyBatis
- 消息队列:Kafka(高吞吐异步事件)
- 搜索:Elasticsearch(支撑搜索与复杂排序)
- 审核服务可以接第三方 AI 审核平台
三、Spring MVC vs Spring WebFlux 的选择
3.1 Spring MVC
- 模型:同步阻塞 I/O,一个请求占用一个线程
- 特点:
- 编程模型简单,生态成熟
- 与大部分第三方库天然兼容(因为很多都是阻塞 API)
- 对 CPU 密集、I/O 不是特别重的场景完全够用
适用场景:
- 中等并发的 CRUD 系统、管理后台
- 绝大部分业务服务
3.2 Spring WebFlux
- 模型:基于 Reactor(响应式流),非阻塞 I/O
- 特点:
- 更适合高并发 I/O 密集型业务(如长轮询、WebSocket)
- 对底层驱动和调用链要求比较高,要尽量避免阻塞调用
适用场景:
- 大量长连接、推送、WebSocket
- 需要极致资源利用率,且使用非阻塞驱动(如 R2DBC、WebClient)
3.3 实际建议
很多大厂的主业务接口仍然使用 Spring MVC,通过:
- 合理配置线程池
- 异步任务交给 MQ/线程池处理
来满足高并发。WebFlux 多用于网关层、特定服务,避免「全局响应式」带来的学习和维护成本。
四、数据库与 ORM 的选型
4.1 MyBatis 的优势
- 手写 SQL,灵活性高,能精准利用索引
- 复杂统计、联表、分页、分片等更直观
- 配合 PageHelper、MyBatis-Plus 可提升开发效率
适合:
- 复杂查询、多维度筛选
- 性能要求高、SQL 需细粒度调优的场景
4.2 JPA / Hibernate / Spring Data
- 通过实体与仓库接口快速生成 CRUD 逻辑
- 开发效率高,但复杂查询可读性和性能可控性略差
适合:
- 简单 CRUD、配置中心、小工具系统
4.3 连接池与迁移
- 连接池:HikariCP(性能好,Spring Boot 默认)
- 迁移工具:
- Flyway:版本化 SQL 文件,启动时自动迁移
- Liquibase:支持 XML/YAML/JSON 格式配置变更
五、日志、监控与调用链
5.1 日志
- 日志门面:SLF4J
- 实现:Logback / Log4j2
- 最佳实践:
- 按模块和级别拆分日志(info/error/slow)
- 日志中统一打印 traceId、userId、请求关键参数
5.2 日志检索(ELK)
- Filebeat/Logstash 收集日志文件
- 写入 Elasticsearch
- Kibana 检索、统计
5.3 指标与监控
- Micrometer 作为指标抽象层
- Prometheus 拉取指标
- Grafana 展示 Dashboard
5.4 链路追踪
- Spring Cloud Sleuth + Zipkin / Jaeger
- 为每次请求生成 traceId + spanId,串联跨服务调用
六、微服务拆分与服务调用
6.1 常见拆分方式
以内容社区为例:
- 用户服务(User Service)
- 认证服务(Auth Service)
- 内容服务(Content Service)
- 评论服务(Comment Service)
- 点赞/互动服务(Interaction Service)
- Feed 服务(Feed Service)
- 推荐服务(Recommend Service)
- 搜索服务(Search Service)
- 订单/支付服务(Order/Payment Service)
6.2 服务发现与调用
- 在传统 Spring Cloud(Neflix OSS) 中:Eureka + Ribbon + Feign
- 在 Kubernetes 时代:
- 服务发现:K8s Service + DNS
- 调用:gRPC / HTTP + OpenFeign
如今更推荐:
- 使用 Spring Cloud 结合 Kubernetes,或直接使用 Kubernetes + Spring Boot,借助 K8s 的服务发现能力。
七、消息队列:Kafka/RabbitMQ/Redis 的使用场景
7.1 Kafka
适合:
- 行为日志(播放、点赞、分享)
- 埋点、统计、实时计算
- 视频上传事件流、Feed 流构建
特点:
- 高吞吐、高分区、顺序性可控
7.2 RabbitMQ
适合:
- 可靠性要求高的业务消息(订单创建、支付回调)
- 需要路由、延时队列、死信队列等高级特性
7.3 Redis Pub/Sub / Stream
适合:
- 轻量级实时通知
- 简单的消息分发
7.4 消费端通用设计
- 保证 幂等:
- 使用业务唯一键(如 videoId)去重
- 处理前先检查记录是否已存在
- 失败重试 + 死信队列
- 顺序性要求高时按 key 分区
八、热门视频缓存设计与缓存三大问题
8.1 热门列表数据结构
- Redis Sorted Set:
zadd hot_videos score videoId - score 可以是:播放量 * a + 点赞数 * b + 评论数 * c
查询热门:
ZREVRANGE hot_videos 0 99
8.2 缓存雪崩、击穿、穿透
- 雪崩:大量 key 同时过期
- 解决:过期时间加随机,或者使用永不过期 + 后台异步刷新
- 击穿:热点 key 过期时瞬间大量请求打到数据库
- 解决:互斥锁(只让一个线程回源),或者使用逻辑过期
- 穿透:大量访问不存在的数据
- 解决:布隆过滤器、缓存空值
8.3 多级缓存
- 本地缓存:Caffeine
- 分布式缓存:Redis
- 结合:先查本地,再查 Redis,再回源 DB
九、Feed 流设计与去重
9.1 两种常见模型
-
Push 模型:
- 用户 A 关注了 1000 人,每个人发视频时,往 A 的时间线里 push 一条
- 优点:读快
- 缺点:写放大严重
-
Pull 模型:
- 查用户关注列表,按时间从这些用户的作品列表拉数据
- 优点:写压力小
- 缺点:读请求复杂
大厂常用「冷热分离 + 混合模型」。
9.2 去重思路
- 关注流和推荐流:用 Redis Set / 布隆过滤器记录已曝光内容 ID
- 生成新一页时过滤掉已展示过的 ID
十、熔断、限流与降级(Resilience4j)
- 熔断:下游服务异常比例超过阈值时,临时「断开」,直接走 fallback
- 限流:使用令牌桶/漏桶限制 QPS
- 降级:下游不可用时返回兜底数据(如默认热门列表)
在 Spring Boot 中可通过 Resilience4j 注解实现:
@CircuitBreaker(name = "recommendService", fallbackMethod = "fallbackRecommend")
public List<Video> getRecommendFeed(Long userId) {
return recommendClient.getFeed(userId);
}
public List<Video> fallbackRecommend(Long userId, Throwable t) {
return contentService.getHotVideos();
}
十一、安全:Spring Security、JWT、OAuth2、Keycloak
11.1 认证与授权基本思路
- 登录:用户名 + 密码 / 手机号 + 验证码
- 后端校验后生成 JWT(含 userId、角色、过期时间)
- 客户端保存 Token(通常在 Header:
Authorization: Bearer xxx) - 每次请求网关/服务端校验 JWT
11.2 OAuth2 与单点登录
- 使用 OAuth2/OpenID Connect 实现统一认证中心
- Keycloak 是一个开箱即用的身份管理解决方案
十二、智能客服系统:RAG + Agent 实践
12.1 传统「直接调用大模型」的问题
- 不懂公司内部业务规则
- 容易胡编乱造(AI 幻觉)
- 无法访问实时业务数据(订单状态、申诉记录)
12.2 RAG(检索增强生成)的完整流程
- 文档加载:
- 导入平台规则、帮助中心、内部 SOP 文档(PDF、Word、网页等)
- 分块(Chunking):
- 按段落/小节拆分为较小文本块(几百字)
- 向量化(Embedding):
- 用 OpenAI / Ollama 等 Embedding 模型将每个文本块转成向量
- 存入向量数据库:
- 选择 Milvus/Chroma/Redis Vector 等
- 在线问答流程:
- 用户问题 -> 向量化
- 在向量库中做语义检索,找到最相关的若干文档块
- 把这些文档 + 用户问题组成 Prompt(提示填充)
- 发送给大模型,让模型在这些文档范围内作答
这样模型的回答有「依据」,大幅减少幻觉。
12.3 Agent 与工具调用
为了支持「修改收货地址」「办理退款」等操作,需要:
- 定义一批「工具」:如查询订单、修改订单、查询余额等 API
- 使用 工具调用框架(如 Spring AI 自定义、LangChain4j 等)
- 让大模型根据对话上下文决定:
- 要不要调用某个工具
- 以什么参数调用
- 工具执行后把结果再反馈给模型,让模型把结果用自然语言告诉用户
这就是一个简单的 Agent:
- 能理解用户意图
- 能选择合适的工具
- 能组合多个步骤完成任务(复杂工作流)
12.4 聊天会话内存
- 把前几轮对话摘要/关键字段存储:
- Redis
- 数据库
- 或专门的会话存储组件
- 每次问答构造 Prompt 时带上必要的历史信息,实现「有记忆的对话」。
十三、CI/CD 与运维落地
13.1 CI/CD 流程
- 开发提交代码到 Git(GitLab/GitHub)
- 触发 GitLab CI/Jenkins Pipeline
- 步骤:
- 编译(Maven/Gradle)
- 单元测试(JUnit5 + Mockito + AssertJ)
- 打包 Docker 镜像
- 推送到镜像仓库
- 部署到 Kubernetes(kubectl / Helm / Argo CD)
13.2 运行时观测
- Prometheus + Grafana:监控 QPS、延迟、错误率
- ELK:日志检索
- Jaeger/Zipkin:链路追踪,定位跨服务性能瓶颈
十四、给小白的一条学习路径建议
- 扎实掌握:Java SE + JVM 基础
- Spring Boot + Spring MVC + MyBatis/Redis 基本 CRUD
- 熟悉:Kafka、MySQL 索引、Redis 缓存三大问题
- 慢慢过渡到微服务:Spring Cloud、服务拆分、熔断限流
- 学会:日志监控体系(ELK + Prometheus + Grafana)
- 最后补充:RAG、向量数据库、Agent 等 AI 技术
可以拿本文的内容当成一个「知识地图」,逐个点位去补齐,就不会像小 Y 一样,在关键问题上含糊其辞了。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)