直播弹幕与礼物
→ 返回 高并发
直播间弹幕、礼物打赏:极高 写 QPS、可丢少量展示、需低延迟。典型 日志型写入 + 内存合并展示,不是每条弹幕都落库。
场景特征
| 特征 | 说明 |
|---|---|
| 写远大于读 | 百万在线同时发弹幕 |
| 可有损 | 屏幕装不下,可采样显示 |
| 礼物涉及钱 | 礼物需幂等、账务异步(类 红包雨) |
| 房间隔离 | 热直播间 vs 冷房间 |
解决方案总览
弹幕
客户端 ──► 接入层(按 roomId 分区)
▼
Kafka Topic: danmaku-{roomId % N}
▼
弹幕聚合服务(合并 200ms 窗口内的消息)
▼
长连接推送(WebSocket / QUIC)给在线观众
▼
可选:冷存储 HBase / ES(回放、审核)
礼物
送礼 → 同步扣款/冻结 → MQ → 特效队列 + 榜单更新
1. 接入与分区
| 手段 | 说明 |
|---|---|
| 按房间分 Topic | 热房间独立分区,避免单分区过热 |
| 消息体小 | 文本截断、违禁词过滤在边缘 |
| 限流 | 每用户每秒 N 条 |
2. 合并与采样(计算层缓冲)
| 策略 | 说明 |
|---|---|
| 时间窗口合并 | 200ms 批量推一次,减少推送次数 |
| 优先级 | 礼物、管理员弹幕优先 |
| 丢弃 | 队列超深时丢弃普通弹幕(产品告知「弹幕过多」) |
3. 存储策略
| 数据 | 存储 |
|---|---|
| 实时展示 | 内存 / Redis 最近 N 条 |
| 全量审计 | Kafka → 数仓 / HBase |
| 落 MySQL | 不要每条同步 insert |
4. 长连接扩展
房间 map → 连接组(多机)
同一用户只连一台接入机
跨机广播:Redis Pub/Sub 或 专用 IM 中间件
热房间:独立接入集群,与冷房间舱壁隔离。
5. 礼物榜单
房间维度 ZSet:gift:rank:room:123 — 见 排行榜,可最终一致。
检查清单
- 弹幕是否同步写 MySQL?
- 热房间 Kafka 分区是否倾斜?
- 礼物是否幂等?
- WebSocket 机是否可水平扩展?