题目
设计一个支持百万并发的直播弹幕系统
信息
- 类型:问答
- 难度:⭐⭐
考点
高并发架构,消息队列,分布式系统,WebSocket,缓存策略
快速回答
设计要点:
- 使用WebSocket长连接实现实时双向通信
- 通过消息队列(如Kafka)解耦弹幕生产和消费
- 采用房间分区+负载均衡的分布式架构
- 结合Redis缓存存储近期弹幕
- 实施分级限流策略(用户/房间/全局)
1. 核心架构设计
分层架构:
- 客户端层:WebSocket连接管理
- 接入层:Nginx反向代理 + WebSocket网关(如Socket.IO)
- 业务层:弹幕处理微服务集群
- 数据层:Kafka消息队列 + Redis缓存
// WebSocket连接示例(Node.js)
const io = require('socket.io')(server);
io.on('connection', (socket) => {
socket.join(roomId); // 加入直播间房间
socket.on('danmaku', (data) => {
kafkaProducer.send(data); // 弹幕发送到Kafka
});
});2. 关键技术实现
消息流转流程:
- 用户发送弹幕 → WebSocket网关
- 网关写入Kafka(分区键=房间ID)
- 弹幕服务消费Kafka消息
- 通过WebSocket广播给房间内所有用户
- 同时写入Redis缓存(Sorted Set存储,score=时间戳)
Redis数据结构示例:
ZADD room:123 1625097600000 "{userId:456,text:'Hello'}"
ZREVRANGE room:123 0 50 WITHSCORES // 获取最新50条弹幕3. 高并发优化策略
- 分布式分区:按房间ID分片(如roomId % 1024),不同分片由不同服务节点处理
- 消息压缩:Protobuf二进制编码减少网络传输
- 合并广播:每50ms批量发送弹幕(非逐条发送)
- 边缘计算:使用CDN边缘节点缓存热门房间弹幕
4. 容错与限流机制
- 分级限流:
- 用户级:单个用户10条/秒
- 房间级:根据热度动态调整(如1000条/秒)
- 系统级:Kafka生产端速率限制
- 降级策略:
- 过载时丢弃非VIP用户弹幕
- 极端情况关闭弹幕功能
5. 常见错误与规避
| 错误 | 解决方案 |
|---|---|
| 单节点广播风暴 | 使用分片+树状广播结构 |
| 消息顺序错乱 | Kafka分区内有序消费 |
| Redis内存溢出 | 设置TTL自动清理(如5分钟) |
| WebSocket连接数瓶颈 | 使用epoll/kqueue I/O多路复用 |
6. 扩展知识
- 消息协议优化:MQTT协议比原生WebSocket节省50%流量
- 智能过滤:布隆过滤器拦截重复弹幕,AI模型过滤违规内容
- 全球化部署:通过DNS分区域调度,欧美/亚洲独立集群
- 监控指标:重点关注P99延迟(<100ms)、消息丢失率(<0.1%)