设计原则

设计直播间弹幕系统时踩过的坑,让我总结出几条可以复用到其他实时系统的原则。

1. 消息分级

原则

不同消息不能一视同仁,没有分级就无法取舍。

实践

普通弹幕低延迟优先、允许采样;系统公告必须送达;礼物消息以支付结果为准、幂等展示;管理消息强审计、快速生效;点赞事件聚合统计不逐条广播。一张分级表是弹幕系统的核心设计依据,没有它,系统在高峰时无法取舍。

2. 广播放大是核心压力

原则

1 条入站消息会产生 N 条出站消息,先算广播放大。

实践

一条弹幕推给 10 万观众就变成 10 万次下行。系统必须对大房间做策略控制:普通弹幕采样展示、高频用户限速、重复内容合并、只保留高质量消息。这不是偷工减料,而是直播产品的体验取舍。

3. 网关保持轻量

原则

WebSocket 网关只做连接,不承担复杂业务逻辑。

实践

网关维护连接、基础鉴权、接收用户消息、推送房间消息、连接级限流。复杂审核、落库、统计、推荐放消息服务和异步消费者。网关变重会让扩容和稳定性都变差。

4. 实时与异步分离

原则

实时链路追求低延迟,异步链路负责可靠。

实践

用户发弹幕后,服务端同步做快速校验和投递,审核、落库、统计、推荐全部异步。用消息队列削峰和解耦,不同任务进不同队列。不要把需要实时响应的链路和耗时任务绑在一起。

5. 消费幂等

原则

队列可能重复投递,消费端必须幂等。

实践

message_id 做去重。礼物消息尤其注意:展示动画可以容忍重复,余额扣减不能重复。账务动作由支付或账户系统完成,弹幕系统只消费结果事件。

6. 热点隔离

原则

热门房间不能拖垮全站。

实践

大房间使用独立频道和资源池,单房间设置最大入站消息率,单用户/设备/IP 限流,网关发送队列过长时丢弃低优先级弹幕。隔离的目标是让一个爆火直播间不影响其他房间。

7. 资金正确性优先

原则

礼物展示可以最终一致,资金必须强一致。

实践

礼物链路拆成资金链路和展示链路:资金链路必须强一致(扣减、订单、主播收益),展示链路可以最终一致。弹幕系统不直接扣余额,而是调用账户/支付系统完成交易,再消费”礼物支付成功”事件。

8. 近似可接受

原则

展示性数据允许近似,结算性数据必须准确。

实践

在线人数可以允许短时间误差(网关定期上报、聚合服务计算近似值);点赞总数可以聚合广播;但礼物订单、主播收益、榜单贡献值必须与账务对账一致。设计时要把”展示用”和”结算用”数据明确区分。

直播弹幕系统设计 checklist

连接与实时:
✓ WebSocket 有鉴权、心跳、重连和连接清理
✓ 单网关连接数、发送队列、推送失败率有监控

高并发与治理:
✓ 大房间有分片、限流和热点隔离
✓ 普通弹幕采样、礼物/管理消息走独立优先级通道
✓ 敏感词、禁言、黑名单在实时链路生效

一致性与可靠性:
✓ 礼物事件以支付订单为准并保证幂等
✓ 消息队列积压时有降级策略
✓ 弹幕落库、回放、统计异步解耦
✓ 礼物订单/主播收益/榜单定期对账

记住:

  • 弹幕系统的本质是实时消息分发平台
  • 给消息分级,才能在高并发下做出取舍
  • 展示可以近似,资金必须正确,管理必须可追踪