秒杀系统设计

秒杀系统不单单适用于电商的抢购场景,其实一切涉及到大并发的场景都适合于使用该套秒杀系统方案,秒杀系统也是日常工作中经常用到的技术。

秒杀系统的难点

  • 瞬时大并发:一提到秒杀系统给人最深刻的印象是超大的瞬时并发,这时你可以联想到小米手机的抢购场景,在小米手机抢购的场景一般都会有10w+的用户同时访问一个商品页面去抢购手机,这就是一个典型的瞬时大并发,如果系统没有经过限流或者熔断处理,那么系统瞬间就会崩掉,就好像被DDos攻击一样;

  • 超卖:秒杀除了大并发这样的难点,还有一个所有电商都会遇到的痛,那就是超卖,电商搞大促最怕什么?最怕的就是超卖,产生超卖了以后会影响到用户体验,会导致订单系统、库存系统、供应链等等,产生的问题是一系列的连锁反应,所以电商都不希望超卖发生,但是在大并发的场景最容易发生的就是超卖,不同线程读取到的当前库存数据可能下个毫秒就被其他线程修改了,如果没有一定的锁库存机制那么库存数据必然出错,都不用上万并发,几十并发就可以导致商品超卖;

  • 性能:当遇到大并发和超卖问题后,必然会引出另一个问题,那就是性能问题,如何保证在大并发请求下,系统能够有好的性能,让用户能够有更好的体验,不然每个用户都等几十秒才能知道结果,那体验必然是很糟糕的;

秒杀系统方案

  1. 使用静态页面,方便个渠道分发和横向扩展;

  2. 将静态页面提前刷新到CDN,通过CDN缓解访问压力;

  3. 禁止重复提交;

  4. 对同一个用户记性访问次数限制,防止使用插件频繁调用接口;

  5. 在Server端进行流量限流,熔断控制,服务降级,防止影响其他服务;

  6. 数据库使用乐观锁,使用多段锁;

  7. 使用redis缓存,避免并发问题,异步同步到mysql等数据库;

Last updated