场景
- 商品库存
- 兑换码
操作
- 查库存
- 秒杀入队
中间件
- Zookeeper
Leader选举(单任务队列),节点命名(多任务队列) - Redis
单任务队列,资源池,库存计数,已秒杀用户Mapping
实现方法
- 单任务队列
Zk Leader选举,Redis实现任务队列,Redis维护单个码池与库存计数 - 多任务队列
Zk节点命名,Redis维护各节点码池与库存计数,JVM本地SingleThreadExecutor任务队列
秒杀
通过Redis判断用户是否已秒杀
判断并加载库存
入队列(bounded,discard policy)
查库存
判断并加载库存
- 单队列
直接返回Redis库存计数
-多队列
Redis中各计算节点库存计数之和
任务执行
判断并加载库存
库存不足或码池为空,尝试加载库存或码池(多节点或redis宕机场景)
码池peek兑换码
begin db transaction
读节点库存或读兑换码
库存不够或兑换码已使用或用户已秒杀,更新redis(库存=0,删码,更新mapping)(乐观回滚或悲观锁),重新入任务队列或discard,直接return
更新DB
end db transaction
db事务成功,Redis更新:
- 用户秒杀mapping
- 库存 - 1 or 删码
判断并加载库存
初始状态(Redis宕机或应用首次启动),中间状态(节点池归零),终结状态(总池归零)
初始状态和中间状态需加载库存,如加载发现总池归零,进入终结状态
终结状态秒杀任务不再入队列,秒杀结束
已入队列任务直接return