标准答案

  1. 入口使用 CDN、网关、验证码、用户和商品维度限流,尽早拒绝明显无效或重复请求。
  2. 把抢购请求转成带幂等键的排队任务,消费者按商品或库存 Key 控制并发。
  3. 库存扣减使用原子条件和唯一订单约束,成功后异步创建订单或返回可查询的受理状态。
  4. 处理取消、超时、重复点击、消息积压和最终库存对账,不能只测成功路径。

题目解析

秒杀入口的主要目标是尽早过滤无资格、重复和超过容量的请求,让有限的数据库和消费者资源只处理有价值的工作。入口限流、资格校验和排队不是为了制造“排队成功”的假象,而是为了控制在途数量。

排队任务必须保存用户、商品、幂等键和过期时间,消费者按商品或库存 Key 控制并发。库存条件更新和订单唯一约束仍是最终裁决,缓存不能代替它们。

用户体验要区分排队受理、下单成功、库存不足、处理中和失败。恢复时还要处理积压、取消和超时,不能只压测一条全部成功的路径。

常见误区

  • 误区:所有请求先查数据库库存再决定。改正:在入口和缓存层过滤无效流量,把有限的库存库容量留给有效请求。
  • 误区:只用前端按钮禁用防重复。改正:服务端使用幂等键和唯一约束,前端控制只能改善体验。
  • 误区:排队成功就直接承诺订单成功。改正:排队只表示受理,最终结果要通过库存、订单和支付状态确认。

作者信息