外观
一句话答案
秒杀三层削峰:前端限流(按钮/验证码)→Redis Lua 原子预扣库存→MQ 异步下单,尽量在上游拦截请求。
核心要点
架构分层:
- 前端:按钮灰显/验证码/限制频率
- 网关层:限流/黑名单/令牌桶
- 服务层:Redis Lua 原子预扣库存 → 成功则发 MQ
- 异步层:消费 MQ → 创建订单 → 扣减DB库存
- 数据层:乐观锁防超卖
UPDATE SET stock=stock-1 WHERE stock>0
核心: 尽量在上游拦截,减少到达数据库的请求
追问与易错
追问方向:
- Redis 预扣库存和 DB 扣减不一致怎么办?(MQ 保证最终一致 + 对账补偿)
- 如何防止黄牛/脚本?(验证码/设备指纹/限频/风控)
- 如果 Redis 挂了怎么兜底?(降级方案:直接 DB 乐观锁,但性能下降)
易错点:
- ❌ "直接查 DB 判断库存"——高并发下 DB 扛不住
- ❌ "先扣 DB 再发 MQ"——应该先 Redis 预扣,成功后再发 MQ 异步落 DB
💡 记忆锚点
漏斗模型:前端按钮灰显+验证码挡90%请求 -> 网关限流令牌桶再挡一层 -> Redis Lua原子预扣库存(核心关卡)-> MQ异步削峰 -> DB乐观锁落库(WHERE stock>0)。每层过滤掉大部分请求,最终到DB的可能只有万分之一。核心原则:把请求挡在离用户最近的地方。