谈谈如何设计秒杀系统

没做过电商类网站,不过面试的时候,遇到过很多面试官问这个问题,把自己的理解记录下:

什么是秒杀?通俗一点讲就是网络商家为促销等目的组织的网上限时抢购活动。

特点

  1. 瞬时并发量大
  2. 库存量有限
  3. 业务一般都简单

方案

  1. 前端限流
    前端页面控制同一客户只允许点击一次秒杀按钮,防止重复请求。
    前端页面可以根据业务要求,让部分客户请求不达到后端,直接秒杀失败。

  2. 流量削峰和异步化
    流量削峰就是用讲请求放到队列中,然后秒杀服务依次处理(开启几个秒杀服务处理几个请求,将到秒杀服务的并发峰值平缓下来)。
    异步化就是不用立即直接处理完秒杀的逻辑,而是简单将任务消息放入队列,让异步任务去处理,让秒杀页面等待队列的处理完成,如果规定时间还未处理完或者商品已经卖完,就秒杀失败了。

  3. 限流
    见文章

  4. 缓存
    数据库读写性能比直接读写内存缓存要慢很多,可以让秒杀直接在缓存中完成,后续再同步数据到数据库中。

  5. 超卖问题

    • DB的方案:在更新数据库的时候加where条件,where 商品数>0,更新失败的就是购买失败。这里起始就是利用了排它锁也叫写锁,执行update的时候,默认给相关的行加了写锁,其他线程不能修改和读取。
      或者用乐观锁也可以,就是加一个版本号,版本一致才可以更新。
    • DB的方案性能比较差,可以用redis的方案:把商品放到一个队列(一个商品一个元素),pop是原子操作,pop为空表示卖完了;或者用decr会更好,更省存储。

Flag Counter