客户端–负载均衡 (LB)–限流/接入层–应用服务 (无状态)
│
├─> Redis库存原子减
│ │
│ ▼
│ 成功 → 写入 MQ
│ 失败 → 返回秒杀失败
│
▼
消息队列 (削峰)
│
▼
消费者服务
│
├─> 写数据库 (库存更新 + 订单)
└─> 发送通知 / 返回结果
秒杀需要考虑以下的问题:
1.瞬时流量太高,需要必须要限流;然后用mq缓冲流量,避免DB的瞬时压力;预热缓存将热数据提前预热到redis中
2.库存一致性问题:redis使用lua表达式原子性扣减、MQ消费者顺序处理确保库存不被重复扣减、DB 乐观锁或事务保证库存更新原子性
3.接口需要幂等设计,避免重复下单
4.动态封禁,拦截恶意流量
5.做好降级预案,当瞬时流量超阈值提示稍后再试
6.监控好对应的QPS,库存,延迟和异常率