礼物系统

礼物消息和普通弹幕不同。普通弹幕丢一条,用户可能无感;礼物涉及付费、主播收入、房间展示和榜单统计,不能随意丢失或重复扣款。

礼物链路

一次送礼可以拆成两条链路:

资金链路:用户余额 -> 扣减 -> 生成礼物订单 -> 主播收益
展示链路:礼物事件 -> 房间广播 -> 动效展示 -> 榜单统计

资金链路必须强一致,展示链路可以最终一致。弹幕系统不应该直接扣余额,而是调用账户或支付系统完成交易,再消费“礼物支付成功”事件。

礼物事件

礼物事件需要包含:

字段含义
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 排行榜 -> 定期落库

排行榜允许短时间延迟,但不能和账务结果长期不一致。需要定期对账:礼物订单总额、主播收益、榜单贡献值是否匹配。

异常处理

常见异常包括:

  • 扣款成功但礼物未展示。
  • 礼物展示成功但统计延迟。
  • 队列重复投递导致榜单重复累加。
  • 账户系统超时但实际扣款成功。

解决思路是以支付订单为准,所有下游动作幂等消费。礼物系统的设计原则是:资金正确性优先,展示实时性尽力保证。