秒杀系统设计
秒杀系统在很多平台都有,小米手机的秒杀购买,京东618,淘宝双11等等。
秒杀系统特点
1. 瞬时流量突增
秒杀活动一般会定某个特定时间开启,大量用户请求在活动开始的瞬间涌入,会给服务造成极大的压力。
2. 持续时间短
一半秒杀活动持续时间比较短,可能几个小时就结束了。
3. 对数据的争抢,数据一致性要求很高
秒杀中的最大压力就是对商品库存的并发争抢,秒杀一般是访问请求数量远远大于库存数量,只有少部分用户能够秒杀成功。
商品秒杀可以简单分为两步,第一步锁单,第二步支付。锁单是用户在获得秒杀资格的时候能够及时占用库存,库存中心也能及时减库存。在获得秒杀资格后,要能够及时让用户支付,否则会因为无法支付引起客诉。
秒杀系统需要解决问题
1. 对现有业务的冲击
秒杀是营销活动中的一种,如果和其他营销活动应用部署在同一服务器上,肯定会对现有其他活动造成冲击,极端情况下可能导致整个电商系统服务宕机。
2. 高并发导致系统负载高
3. 突然增加的网络与服务带宽
4. 超发设计
当库存数量有限,如何有效控制商品超卖是秒杀系统不可避免的一个问题。
5. 木桶短板理论,整个系统的瓶颈往往都在 DB,如何设计出高并发、高可用系统
6. 友好的用户体验,用户不能接受破窗的体验,例如:系统超时、系统错误的提示,或者直接 404 页面
秒杀系统架构设计思想
1. 限流
由于活动库存量一般都是很少,对应的只有少部分用户才能秒杀成功。所以我们需要限制大部分用户流量,只准少量用户流量进入后端服务器。
2. 削峰
秒杀开始的那一瞬间,会有大量用户冲击进来,所以在开始时候会有一个瞬间流量峰值。如何把瞬间的流量峰值变得更平缓,是能否成功设计好秒杀系统的关键因素。实现流量削峰填谷,一般的采用缓存和 MQ 中间件来解决。
3. 异步处理
秒杀其实可以当做高并发系统来处理,在这个时候,可以考虑从业务上做兼容,将同步的业务,设计成异步处理的任务,提高网站的整体可用性。
4. 缓存
秒杀系统的瓶颈主要体现在下订单、扣减库存流程中,对数据库读写,在这些流程中主要用到 OLTP 的数据库,类似 MySQL、SQLServer、Oracle。由于数据库读写属于磁盘IO,对应我们随机写入与读取的效率,相对较低,如果能够把部分数据或业务逻迁移到内存的缓存或者 Redis 中,会极大的提高并发效率。如果我们把部分业务逻辑。
5. 动静分离
将大量静态资源进行CDN缓存,减少后端服务器的请求压力。