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 同步写库