这是 Beta 探索课程,内容结构、实验步骤和示例可能会继续调整。
礼物系统
礼物消息和普通弹幕不同。普通弹幕丢一条,用户可能无感;礼物涉及付费、主播收入、房间展示和榜单统计,不能随意丢失或重复扣款。
礼物链路
一次送礼可以拆成两条链路:
资金链路:用户余额 -> 扣减 -> 生成礼物订单 -> 主播收益
展示链路:礼物事件 -> 房间广播 -> 动效展示 -> 榜单统计资金链路必须强一致,展示链路可以最终一致。弹幕系统不应该直接扣余额,而是调用账户或支付系统完成交易,再消费“礼物支付成功”事件。
礼物事件
礼物事件需要包含:
| 字段 | 含义 |
|---|---|
| gift_event_id | 礼物事件唯一 ID |
| order_id | 支付订单 |
| room_id | 房间 |
| sender_id | 送礼用户 |
| anchor_id | 主播 |
| gift_id | 礼物类型 |
| count | 数量 |
| amount | 金额 |
| paid_at | 支付完成时间 |
gift_event_id 用于展示和统计幂等,order_id 用于和账务系统对账。
展示优先级
礼物展示需要优先于普通弹幕:
- 高价值礼物走高优先级通道。
- 普通弹幕积压时不能阻塞礼物。
- 房间广播要保证礼物至少展示一次。
- 客户端根据礼物类型播放不同动效。
如果礼物事件重复到达,客户端或网关要能去重,避免重复播放过多次。
榜单和统计
礼物会影响贡献榜、小时榜、主播收入等统计。这些统计通常可以异步更新:
gift_event -> stats_consumer -> Redis 排行榜 -> 定期落库排行榜允许短时间延迟,但不能和账务结果长期不一致。需要定期对账:礼物订单总额、主播收益、榜单贡献值是否匹配。
异常处理
常见异常包括:
- 扣款成功但礼物未展示。
- 礼物展示成功但统计延迟。
- 队列重复投递导致榜单重复累加。
- 账户系统超时但实际扣款成功。
解决思路是以支付订单为准,所有下游动作幂等消费。礼物系统的设计原则是:资金正确性优先,展示实时性尽力保证。