51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

设计一个支持千万级用户、低延迟(毫秒级)的直播弹幕系统,请从技术选型、架构设计、性能优化等方面阐述。

快手前端开发工程师 📦 工程类难度:困难

答案

1) 【一句话结论】
采用“WebSocket+消息队列+CDN+分布式数据库(分库分表+Redis缓存)”的分布式架构,通过异步解耦、就近加速、数据水平拆分,支撑千万级用户毫秒级弹幕交互,并考虑用户离线消息重发等边界场景。

2) 【原理/概念讲解】
老师口吻解释各组件:

  • WebSocket:实时双向通信协议,客户端与服务端保持长连接,减少HTTP请求建立成本,支持毫秒级消息推送。类比:实时聊天管道,持续在线,消息直接推送。
  • 消息队列(如Kafka):分布式消息中转站,将弹幕消息异步写入,服务端消费时再分发,解耦发送与接收,提升系统吞吐。类比:快递中转仓,发送端放包裹,接收端取,避免发送端阻塞。
  • CDN:内容分发网络,缓存弹幕内容到离用户最近的节点,减少网络跳数,降低延迟。类比:本地快递点,用户取包裹更近,更快。
  • 分布式数据库:分库分表(如MySQL按直播间ID分表),将弹幕数据水平拆分,避免单库瓶颈;Redis缓存热点数据(如top10弹幕),提升高频读取性能。类比:把数据分到不同仓库,读时并行处理;热点数据存到缓存,快速读取。

3) 【对比与适用场景】

  • 消息队列(Kafka vs RabbitMQ):
    方案定义特性使用场景注意点
    Kafka分布式发布-订阅消息系统高吞吐、持久化、多消费者、顺序保证实时数据流、千万级消息推送、日志需持久化存储,启动慢,适合大规模
    RabbitMQ企业级消息代理队列、交换机、路由、延迟低中间件解耦、小规模消息、顺序保证延迟低,但吞吐不如Kafka,适合中小规模
  • 数据库(MySQL vs Redis):
    方案定义特性使用场景注意点
    MySQL关系型数据库,支持事务结构化存储、事务一致性、持久化弹幕内容、用户关联数据(如用户ID、直播间ID)分库分表复杂,读写分离需额外设计
    RedisKey-Value内存缓存毫秒级读写、缓存热点数据弹幕实时缓存(如top10热点弹幕)、热点数据读取内存有限,需持久化(RDB/AOF),适合高频读取

4) 【示例】
客户端发送弹幕(通过WebSocket):

// 客户端请求示例
POST /api/barrage
{
  "userId": "user_001",
  "roomId": "live_001",
  "content": "直播太精彩了!",
  "timestamp": 1672531200
}

服务端处理流程:

  1. WebSocket接收:客户端通过长连接发送弹幕,服务端接收消息。
  2. 写入Kafka:将弹幕消息写入Kafka主题(如barrage_topic),消息包含用户ID、直播间ID、内容等。
  3. Kafka消费者:多实例消费者(如Nginx+Worker模式)消费消息,解析后通过Nginx反向代理推送到前端(WebSocket长连接)。
  4. 写入Redis:同时将弹幕写入Redis(如barrage:hot:top10缓存热点弹幕,barrage:live_001存储该直播间弹幕列表)。
  5. 写入MySQL:按直播间ID分表(如barrage_live_001表),存储完整弹幕记录(用户ID、内容、时间等)。

5) 【面试口播版答案】
面试官您好,针对千万级用户低延迟弹幕系统,核心是构建分布式实时通信架构。首先,客户端通过WebSocket与服务器建立长连接,实现毫秒级消息推送。服务端将弹幕消息异步写入消息队列(如Kafka),利用其高吞吐特性解耦消息处理,避免单点阻塞。消息队列消费者负责将消息分发给多个前端节点,结合CDN缓存弹幕内容,减少网络延迟。同时,数据库采用分库分表(如MySQL按直播间ID分表,Redis缓存热点数据),存储弹幕数据,确保读写性能。通过这种架构,既能支撑高并发,又能保证低延迟,实现千万级用户毫秒级交互,并考虑用户离线时消息重发等边界场景。

6) 【追问清单】

  • 问题1:如何保证WebSocket连接的稳定?
    回答要点:设置心跳机制(如每秒发送心跳包),检测连接异常(超时重连),确保客户端断线后自动重连。
  • 问题2:消息队列如何保证弹幕的顺序?
    回答要点:Kafka按分区顺序消费,每个分区由一个消费者实例处理,确保同一分区的消息顺序,避免乱序。
  • 问题3:数据库分库分表后,如何实现读写分离?
    回答要点:主从复制(MySQL主库写,从库读),结合Redis缓存热点数据,减少数据库压力。
  • 问题4:系统如何处理消息丢失?
    回答要点:消息队列持久化(Kafka日志存储),消费确认机制(ACK),失败重试(幂等处理),确保消息不丢失。

7) 【常见坑/雷区】

  • 坑1:忽略用户离线时消息重发,导致用户断线后无法收到历史弹幕。
  • 坑2:消息队列选择不当(如RabbitMQ在高并发下延迟增加),导致弹幕延迟过高。
  • 坑3:分库分表策略不合理(如未按直播间ID分表),导致单库压力过大,读性能下降。
  • 坑4:Redis缓存未设置过期或淘汰策略,导致缓存击穿,热点数据读取变慢。
  • 坑5:消息去重处理不当,导致重复弹幕显示(如Kafka消息重复消费,未实现幂等性)。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1