如何设计一个秒杀系统

如何设计一个秒杀系统

这是曾经面试时遇到的一个问题,当初我的回答是:
使用乐观锁,在下单时,先减掉库存,update的时候带上条件,商品库存不能小于1,这样就不会存在下单数量超过库存的问题了
现在回想下,完全没考虑到高并发时的性能

一个真正的秒杀系统应该如何设计呢?

在一个不考虑秒杀的系统中,下单应该包含以下的步骤:

  1. 检查库存,是否足够下单
  2. 减掉库存
  3. 创建订单
  4. 订单支付

那么在秒杀情况下,会遇到什么问题呢?
首先是突然大量增加的访问量,大量的请求在秒杀开始的一瞬间开始请求,是一种短时间的高并发,所以我们要保证在高并发下的性能。并且要注意秒杀商品的库存,不能以秒杀价卖出超出库存的商品,这样会造成损失。

面对这些问题,首先想到的是应对高并发场景的几个常见手段:

  1. 限流:将流量限制在前端,限制掉无效流量,减轻服务端和数据库的压力。
  2. 削峰:流量瞬间达到峰值时系统支撑不住容易被直接压垮,具体做法包括异步处理,使用缓存以及各种消息中间件技术
  3. 使用内存数据库:一些数据如果可以放在内存数据库中,性能会提升很多,支持的并发量会大幅上升
  4. 可扩展性:实现可扩展性,在应对不同级别的流量时可以通过增加机器数量来实现对流量的支持

在具体实现中我们怎么去优化呢?

  1. 在秒杀活动开始前,就会有大量的请求开始访问页面,所以要减少页面上的动态元素,将可以静态化的元素全部静态化。
  2. 利用页面级缓存来控制用户不能重复提交请求,限制住用户频繁连续的点击按钮
  3. 在网关层面,为了应对攻击,我们要对用户id和ip进行控制
  4. 采用消息队列来应对大量请求,参与秒杀的商品库存是固定的,没有必要把全部的请求都和数据层交互,把请求缓存到消息队列中,数据层来订阅这些消息进行处理
  5. 读多写少的数据充分利用缓存提高效率

《如何设计一个秒杀系统》有2个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注