这是 Beta 探索课程,内容结构、实验步骤和示例可能会继续调整。
完整系统
完整秒杀系统可以分成五层:
流量入口 -> 风控限流 -> Redis 预扣 -> 队列下单 -> 支付确认与库存对账每一层都在削减风险:入口层挡掉异常流量,限流层控制规模,Redis 层快速判断库存,队列层削峰,数据库层保存最终事实。
最终流程
一次秒杀请求可以这样处理:
- 用户进入活动页,完成预约或资格校验。
- 网关和风控服务过滤异常请求。
- 限流系统控制进入核心链路的请求量。
- Redis Lua 脚本原子预扣库存。
- 预扣成功的请求进入订单队列。
- 订单消费者幂等创建待支付订单。
- 用户支付成功后确认库存。
- 超时未支付订单释放库存。
- 对账任务修复 Redis、订单、数据库库存差异。
关键决策
- 数据库扣库存还是 Redis 预扣:数据库正确但吞吐低,Redis 高吞吐但需要补偿和对账。
- 同步下单还是异步排队:同步体验直接,异步能削峰并保护数据库。
- 强一致还是最终一致:库存售卖结果必须正确,展示和排队状态可以最终一致。
- 限流放在哪里:越靠前越省资源,但越靠后越精确,需要分层配合。
- 风控是否影响用户体验:会,但公平性和系统稳定性要求必须控制高风险流量。
上线检查清单
- 秒杀活动是否有独立库存,不直接使用普通商品库存?
- Redis 预扣是否原子,是否防止库存扣成负数?
- 队列消费者是否幂等,是否防止重复订单?
- 支付超时是否能释放库存?
- Redis 和数据库是否有库存对账任务?
- 网关、用户、活动、库存是否都有分层限流?
- 高风险账号、设备、IP 是否会被拦截或降级?
- 售罄、排队、失败结果是否对用户可解释?
- 是否压测过开抢瞬间的峰值流量?
课程总结
秒杀系统的本质是把不可承受的瞬时洪峰拆成可控阶段。它不追求所有请求都进入数据库,而是尽早过滤、限流、排队和降级,让有限库存被正确卖出。
设计秒杀系统时,始终问:
- 哪些请求应该被挡在最外层?
- 库存扣减在哪里完成,失败如何补偿?
- 用户等待结果时看到什么?
- 数据不一致如何发现和修复?
能回答这些问题,秒杀系统才具备上线能力。