← 返回面试专题

⚡ 秒杀系统如何设计?

核心目标:抗峰值、高可用、库存不超卖、下单可追溯

🧩 典型题干

场景:一个商品库存 100,活动开始瞬间 100 万 QPS。 要求:不超卖、尽量不少卖、系统不能被打挂,支持风控与限购。
💡 标准拆解:入口限流与拦截(挡住无效流量)→ 异步化下单(削峰)→ 库存模型(不超卖)→ 订单最终一致(可追溯)→ 风控与监控。

📚 学习正文:秒杀系统如何扛住百万 QPS 且不超卖?

交互图:秒杀关键链路闭环(点步骤看“为什么要这么做”)

面试时建议按“挡 → 削 → 扣 → 落 → 补 → 观”的顺序讲:先挡住无效流量,再用队列削峰,再用库存模型保证不超卖,最后用补偿/对账兜底一致性。

1) 入口拦截:把无效流量挡在系统外

  • 静态化:活动页/商品信息尽量走 CDN,减少回源。
  • 限流:网关按 IP/用户/接口限流,优先保护 DB/Redis/MQ。
  • 防刷:验证码/滑块/设备指纹/动态路径;把黑产请求变“昂贵”。

系统架构图(面试时用它讲全链路)

用户/APP/小程序 | v CDN/静态化(活动页/商品信息) | v 网关/API Gateway(限流/黑白名单/验证码/动态路径) | v 秒杀接入层(参数校验/限购校验/用户幂等 Key) | +--> Redis(库存预扣:Lua/DECR 原子扣减;预扣记录/排队状态) | +--> MQ(下单事件:削峰/异步化;支持重试/顺序/死信) | v 下单服务(消费幂等:唯一约束/去重表;状态机) | +--> 订单库 MySQL(订单/预扣/支付状态) | +--> 支付/风控(可选) | +--> 失败补偿(回补库存/回滚预扣/对账修复) 观测与治理:监控告警(QPS/RT/错误率/队列堆积/库存一致性) + 压测演练 + 灰度回滚

1) 需求与量级澄清(面试先问)

2) 整体架构:分层拦截 + 异步化 + 最终一致

入口层:CDN/静态化 + 网关限流 + 防刷 核心层:Redis 预扣库存 + MQ 异步下单 + DB 落单 一致性:幂等/去重 + 失败补偿 + 对账回补 稳定性:降级/熔断/监控 + 灰度回滚

3) 数据模型:库存、订单、预扣记录

4) 关键链路:从请求到下单的完整闭环

1) 校验前置(时间/黑名单/限购) 2) Redis 预扣库存(原子 DECR) 3) 发送 MQ(可靠事件) 4) 异步落单(幂等/唯一约束) 5) 失败补偿(回补库存/对账)

5) 可靠性与一致性保障

6) 稳定性治理

限流降级:网关限流、排队、降级返回 熔断:Redis/DB/MQ 异常时快速失败 监控:库存、QPS、RT、错误率、队列堆积 演练:压测、故障演练、灰度发布

🎯 面试题(建议学完上面正文再做)

1. 先澄清需求:你会问哪些问题?简单
  • 库存模型:允许少卖吗?允许超卖吗?是否要严格不超卖?
  • 下单链路:是否必须同步返回“下单成功”?能否先返回“排队中”?
  • 限购/黑名单:每人限购几件?是否需要验证码、设备指纹、风控?
  • 量级与 SLA:峰值 QPS、可接受 RT、失败率与降级策略。
2. 怎么挡住无效流量(入口层)?中等
  • CDN/静态化:活动页与商品信息尽量静态化,减少回源。
  • 网关限流:按 IP/用户/接口限流;令牌桶允许突发。
  • 校验前置:活动时间校验、库存预判、用户登录态/黑名单。
  • 防刷:验证码、滑块、设备指纹、动态路径。
⚠️ 重点:限流要“可降级”,宁可返回排队/稍后再试,也不要把系统打挂。
3. 不超卖的库存扣减怎么做?困难

常见三种路径(按性能/一致性权衡):

  • DB 乐观锁:`update ... set stock = stock-1 where id=? and stock>0`,简单可靠但扛不住百万 QPS。
  • Redis 预扣库存:活动开始把库存加载到 Redis,使用原子 `DECR` 预扣;扣成功则发送 MQ 异步落单,失败直接返回。
  • 令牌化:提前生成 N 个“库存令牌”,请求拿到令牌才可下单;令牌即库存。
💡 工程常用:Redis 预扣(不超卖)+ MQ 异步下单(削峰)+ DB 最终落库校验(兜底一致性)。
4. 异步下单如何保证可靠与可追溯?困难
  • 请求幂等:用户/活动/商品维度幂等键,避免重复下单。
  • Outbox/事务消息:保证“预扣成功 → 订单创建事件”不丢。
  • 消费幂等:订单表唯一约束或去重表;重试不会重复扣款。
  • 查询结果:下单接口返回“排队中”,提供查询接口返回最终状态。
5. 面试 2 分钟总结怎么讲?中等
  1. 入口:CDN/静态化 + 网关限流 + 防刷。
  2. 核心:Redis 预扣库存(原子)+ MQ 异步下单(削峰)。
  3. 一致性:DB 落单兜底校验 + 幂等/去重 + 失败补偿回补库存。
  4. 稳定性:降级/熔断/监控告警 + 灰度发布与回滚。