消息队列

如果用户发送弹幕后,服务端同步完成审核、落库、统计、推荐、通知再返回,延迟会很高。直播弹幕系统需要把实时链路和异步链路拆开。

用户发送 -> 快速校验 -> 投递消息 -> 实时分发
                         -> 异步审核/落库/统计

消息队列的作用是削峰和解耦。

队列拆分

不同任务应该进入不同队列:

队列用途
realtime_dispatch房间实时分发
content_audit内容审核和风控
message_persist消息落库和回放
stats_event在线人数、弹幕数、互动统计
gift_event礼物展示和账务后处理

不要把所有消息塞进一个队列。礼物和管理员消息应该有更高优先级,不能被普通弹幕积压影响。

投递语义

普通弹幕通常接受至少一次投递或少量丢失;礼物消息、付费消息和管理消息需要更可靠。系统可以按消息类型定义语义:

  • 普通弹幕:低延迟优先,允许降采样和丢弃。
  • 礼物消息:至少一次投递,消费端幂等。
  • 管理消息:必须送达或重试,并记录审计。

这能避免为了普通弹幕追求强可靠,把整个系统做得又慢又复杂。

消费幂等

队列可能重复投递,消费端必须幂等。可以使用 message_id 做去重:

processed:message:{message_id}

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

积压处理

大促或热门直播会造成队列积压。处理策略包括:

  • 普通弹幕队列超过阈值时丢弃低优先级消息。
  • 落库队列延迟时先保证实时分发。
  • 礼物队列单独扩容,避免被普通消息影响。
  • 消费延迟进入告警,触发限流或降级。

消息队列让系统能承受峰值,但也带来延迟和顺序问题。下一章礼物系统会展示如何处理更强一致性的互动消息。