首页/案例库/秒杀系统设计
高级系统设计

秒杀系统设计

亿级流量下的库存一致性

秒杀系统面临三大挑战:瞬时流量是平时的百倍(流量削峰)、库存不能超卖(一致性)、系统不能被打垮(高可用)。从前端拦截、CDN 静态化、Redis 预扣库存、消息队列异步落库,到熔断降级的完整架构链路。

秒杀高并发库存超卖流量削峰Redis 预扣消息队列幂等
STEP_1
削峰的核心思路:让 90% 的请求在距离数据库最远的地方被拒绝。CDN 静态化减少服务器压力;网关限流保护后端;应用层布隆过滤器快速过滤重复购买;只有极少数合法请求才能真正打到 Redis 和数据库。这让后端看到的流量是"正常峰值"而非"瞬时洪峰"。
把洪峰流量变成平稳水流 — PROCESSING
traffic-peak.log
// Nginx 网关层限流(令牌桶)
// nginx.conf
limit_req_zone $binary_remote_addr zone=seckill:10m rate=1r/s;

location /api/seckill {
  limit_req zone=seckill burst=3 nodelay;
  # burst=3:允许短暂超出,最多积压 3 个请求
  # nodelay:超出立即拒绝,不排队等待
  proxy_pass http://backend;
}

// 应用层:布隆过滤器过滤已购买用户
const purchased = new BloomFilter(100000, 0.01)

async function seckillHandler(userId: string, itemId: string) {
  // 已购买的用户直接拒绝(布隆过滤器 false positive 无所谓)
  if (purchased.has(userId + itemId)) {
    return { code: 'ALREADY_PURCHASED' }
  }
  // 放行到后续流程
  return await processOrder(userId, itemId)
}

流量削峰秒杀前静态页面全部推送到 CDN,按钮在倒计时结束前禁用(前端限制)。网关层对同一用户 ID 限流(令牌桶,1 秒最多 1 次请求),拦截 99% 的无效请求,只放少量请求打到后端。

实时沙盒SANDBOX
FAULT_INJECTED
快速场景
手动调节
瞬时 QPS
秒杀开始瞬间的请求量
100k次/秒
系统可应对,多层削峰有效
库存数量
参与秒杀的商品总量
100
少量库存,竞争激烈,防超卖压力大
异步落库
消息队列解耦 vs 同步写库