关键决策

这一页整理弹幕系统设计过程中遇到的关键决策点,每个决策都说明了问题、对比过的方案和最终选择理由。

决策 1:WebSocket 还是轮询

问题

客户端如何实时接收新弹幕?

方案对比

  • HTTP 轮询:实现简单,但延迟高、浪费资源,高频率轮询会拖垮服务器和数据库。
  • WebSocket 长连接:客户端和服务端建立长连接,服务端主动推送,延迟低。

决策

WebSocket。直播场景实时性要求高,轮询只适合低频场景。WebSocket 网关保持轻量,只维护连接、基础鉴权、接收消息、推送消息和连接级限流。

决策 2:每条弹幕都广播吗

问题

热门房间每条弹幕都要推给所有观众吗?

决策

大房间不能。广播放大是弹幕系统的核心压力,必须对大房间做策略控制:普通弹幕采样展示、高频用户限速、重复内容合并、礼物和管理消息优先推送。用户需要的是热闹和实时,不是逐字逐条完整接收。

决策 3:网关是否处理业务逻辑

问题

WebSocket 网关要不要承担审核、落库、统计等逻辑?

决策

网关应轻量。网关只做连接维护、基础鉴权和连接级限流。复杂审核、落库、统计、推荐放到消息服务和异步消费者。网关变重会导致扩容和稳定性变差,横向扩展困难。

决策 4:礼物是否和弹幕同链路

问题

礼物消息能复用普通弹幕的链路吗?

决策

展示可以共用分发能力,资金链路必须独立可靠。礼物拆成资金链路(扣减、订单、主播收益,强一致)和展示链路(动效、榜单,最终一致)。弹幕系统不直接扣余额,而是调用账户/支付系统完成交易,再消费”礼物支付成功”事件。高价值礼物走高优先级通道。

决策 5:在线人数是否强准确

问题

在线人数要实时准确到个位数吗?

决策

展示可以近似,结算必须准确。在线人数由网关定期上报本机房间连接数,聚合服务计算近似值,对用户展示允许短时间误差。但涉及结算的统计(礼物订单、主播收益、榜单贡献值)必须与账务系统定期对账。

决策 6:普通弹幕的可靠性

问题

普通弹幕丢一条可以接受吗?要不要保证绝对可靠?

决策

普通弹幕可以接受至少一次投递或少量丢失,低延迟优先。如果为普通弹幕追求强可靠,会把整个系统做得又慢又复杂。礼物、付费和管理消息才需要更可靠的投递语义和幂等消费。按消息类型定义语义,而不是一刀切。

决策 7:在线连接状态存哪

问题

连接和房间的映射关系存在哪里?

决策

存在网关内存。连接状态变化很快(connection_id -> user_id/room_id/device,room_id -> connection_id 列表),不适合每次写数据库。数据库只保留关键事件和审计记录。网关重启后连接重新建立,需要配合重新订阅房间。

决策 8:队列如何拆分与降级

问题

热门直播造成消息队列积压时怎么办?

决策

按任务拆分队列 + 积压降级。realtime_dispatch、content_audit、message_persist、stats_event、gift_event 分队列;礼物和管理员消息高优先级。积压时:普通弹幕队列超阈值丢弃低优先级消息,落库队列延迟时先保证实时分发,礼物队列单独扩容,消费延迟告警触发限流或降级。