高并发场景下,优惠券秒杀系统的稳定性与公平性保障
背景
-
场景:
- 在“年度超级秒杀”活动中,限量100张(高价值优惠券),活动上线首秒吸引大量用户同时涌入,瞬时峰值QPS达10万次/秒。
-
核心诉求
-
服务器稳定性:确保系统在超高并发下不崩溃、不超卖(优惠券库存准确扣减)。
-
业务公平性保障:保证先到、先点击的用户抢购成功。
-
回答
这是一个典型的秒杀问题。几千万个并发抢100个库存。
-
几个重点问题:
-
如何保证不超卖、不少卖?
-
如何保证服务不被打垮?
-
如何保证前面的人能抢到?(本节重点)
-
-
如何保证前面的人先抢到?
- 借助 Redis + lua 进行库存扣减。
- Redis 可以保证命令执行的先后顺序。先来的请求,先进行库存扣减了。
- 扣减成功,则说明有库存。就可以给他发放优惠券了。(操作数据库)
- 当库存为0之后,后续的请求再进来,会在 Redis 中操作失败。因为,库存已经没有了,无法扣减了。这样就可以把后续的所有流量都抗在数据库之前了。
-
注意:使用 分布式锁+限流 的方案,是没办法保证先后顺序的。