直播弹幕与礼物

返回 高并发

直播间弹幕、礼物打赏:极高 写 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 机是否可水平扩展?

相关