这是 Beta 探索课程,内容结构、实验步骤和示例可能会继续调整。
库存同步
Redis 预扣库存解决了性能问题,但库存一致性变复杂了。现在系统里至少有三种状态:
- Redis 中的可抢库存。
- 数据库中的真实库存。
- 订单中的占用和支付状态。
库存同步要保证这些状态最终能对齐。
状态流转
秒杀库存可以分成:
可售库存 -> 预扣库存 -> 已下单库存 -> 已支付库存
-> 超时释放用户抢到资格后,库存先被预扣;订单创建后进入待支付;支付成功后确认销售;超时未支付则释放库存。
防超卖与防少卖
防超卖是底线,但防少卖也重要。常见少卖原因:
- Redis 预扣成功,订单创建失败,库存没有释放。
- 用户未支付,库存长期占用。
- 消费者异常导致队列消息丢失。
- 数据库回写失败但 Redis 已扣减。
所以系统需要补偿任务扫描异常订单和库存差异。
对账机制
对账可以按活动维度定期执行:
初始库存 = 已支付订单 + 待支付占用 + Redis 剩余库存 + 异常差异如果不平,需要生成补偿记录,并限制活动继续放量,避免错误扩大。
支付超时
秒杀订单通常有短支付时间。超时后要释放库存,但释放要幂等:
- 订单已经支付,不能释放。
- 订单已经取消,不能重复释放。
- 释放 Redis 和数据库状态要有补偿。
库存同步是秒杀系统最容易出事故的部分。它要求每个状态变化都有记录、可重试、可对账。