这是 Beta 探索课程,内容结构、实验步骤和示例可能会继续调整。
消息队列
如果用户发送弹幕后,服务端同步完成审核、落库、统计、推荐、通知再返回,延迟会很高。直播弹幕系统需要把实时链路和异步链路拆开。
用户发送 -> 快速校验 -> 投递消息 -> 实时分发
-> 异步审核/落库/统计消息队列的作用是削峰和解耦。
队列拆分
不同任务应该进入不同队列:
| 队列 | 用途 |
|---|---|
| realtime_dispatch | 房间实时分发 |
| content_audit | 内容审核和风控 |
| message_persist | 消息落库和回放 |
| stats_event | 在线人数、弹幕数、互动统计 |
| gift_event | 礼物展示和账务后处理 |
不要把所有消息塞进一个队列。礼物和管理员消息应该有更高优先级,不能被普通弹幕积压影响。
投递语义
普通弹幕通常接受至少一次投递或少量丢失;礼物消息、付费消息和管理消息需要更可靠。系统可以按消息类型定义语义:
- 普通弹幕:低延迟优先,允许降采样和丢弃。
- 礼物消息:至少一次投递,消费端幂等。
- 管理消息:必须送达或重试,并记录审计。
这能避免为了普通弹幕追求强可靠,把整个系统做得又慢又复杂。
消费幂等
队列可能重复投递,消费端必须幂等。可以使用 message_id 做去重:
processed:message:{message_id}礼物消息尤其要注意:展示动画可以重复容忍,余额扣减不能重复。账务动作应由支付或账户系统完成,弹幕系统只消费结果事件。
积压处理
大促或热门直播会造成队列积压。处理策略包括:
- 普通弹幕队列超过阈值时丢弃低优先级消息。
- 落库队列延迟时先保证实时分发。
- 礼物队列单独扩容,避免被普通消息影响。
- 消费延迟进入告警,触发限流或降级。
消息队列让系统能承受峰值,但也带来延迟和顺序问题。下一章礼物系统会展示如何处理更强一致性的互动消息。