
百万级并发直播弹幕系统需通过“分层解耦(消息队列+缓存+数据库)+实时流处理”架构,结合动态扩展(如Kafka分区数自动调整)与缓存一致性策略(读时回源+并发控制),平衡低延迟、高可用与可扩展性,核心是削峰填谷与实时性保障。
老师口吻:高并发弹幕系统设计的关键是“解耦+削峰+加速”,各组件作用如下:
| 方案 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 直接数据库写入 | 用户直接写入数据库 | 代码简单,无中间环节 | 低并发(万级) | 高并发下数据库压力过大,延迟高,无法扩展 |
| 消息队列+数据库 | 用户写入队列,消费端写入数据库 | 解耦,削峰,支持水平扩展 | 百万级并发 | 需处理消息积压,确保顺序;Kafka ack=1保证消息不丢失 |
| Redis缓存 | 内存数据库,缓存热点弹幕 | 延迟低(毫秒级),支持列表等结构 | 热点弹幕展示 | 需考虑缓存击穿(预热)、雪崩(短TTL+互斥锁) |
| 消息队列+缓存+数据库 | 三层架构 | 综合性能,低延迟,高可用 | 百万级+ | 需复杂一致性策略,成本高,需动态扩展 |
伪代码(用户发送弹幕流程):
用户端:POST /danmu?roomId=101, userId=1001, content="太棒了!"
服务端:
1. 验证用户,生成消息:{ts: 1678888888, userId: 1001, content: "太棒了!", roomId: 101}
2. 写入Kafka,topic: danmu_room_101,分区键:roomId(分区数=5,每个分区1个消费者实例)
3. 写入Redis:key=room_101_danmu(列表,LPush序列化消息,过期5分钟)
4. 写入MySQL:INSERT INTO danmu (id, userId, content, roomId, time) VALUES (UUID(), 1001, "太棒了!", 101, NOW())
消费端(实时推送):
1. 从Kafka消费topic: danmu_room_101,分区0-4
2. 解析消息,写入Redis(RPush追加列表)
3. 通过WebSocket推送到前端
前端展示:
1. 从Redis获取room_101_danmu(LRANGE -100 0,倒序)
2. 渲染弹幕
(约90秒)
“面试官您好,针对百万级并发直播弹幕系统,我的核心策略是通过分层解耦+实时流处理,结合消息队列分区、缓存一致性及动态扩展机制,确保低延迟和高可用。首先,需求定义上拆解为‘发送-展示-存储’三个环节,技术实现上采用Kafka解耦发送与展示,Redis加速热点弹幕读取,MySQL持久化存储。具体来说,用户发送弹幕后,先写入Kafka(分区按房间ID,每个分区1-5个消费者),再写入Redis(列表结构,倒序存储),最后写入数据库。消费端实时通过WebSocket推送,展示时优先从Redis读取。衡量成功指标包括:弹幕发送延迟(<100ms)、展示延迟(<200ms)、系统吞吐量(百万级QPS)、可用性(99.9%以上)。通过这些策略,系统能应对高并发,同时保证用户体验。”