高并发秒杀系统架构解密,不是所有的秒杀都是秒杀!( 二 )


(3)流程简单
秒杀系统的业务流程一般比较简单;总体上来说,秒杀系统的业务流程可以概括为:下单减库存 。
针对这种短时间内大流量的系统来说,就不太适合使用系统扩容了,因为即使系统扩容了,也就是在很短的时间内会使用到扩容后的系统,大部分时间内,系统无需扩容即可正常访问 。那么,我们可以采取哪些方案来提升系统的秒杀性能呢?
秒杀系统方案针对秒杀系统的特点,我们可以采取如下的措施来提升系统的性能 。

高并发秒杀系统架构解密,不是所有的秒杀都是秒杀!

文章插图
 
(1)异步解耦
将整体流程进行拆解,核心流程通过队列方式进行控制 。
(2)限流防刷
控制网站整体流量,提高请求的门槛,避免系统资源耗尽 。
(3)资源控制
将整体流程中的资源调度进行控制,扬长避短 。
由于应用层能够承载的并发量比缓存的并发量少很多 。所以,在高并发系统中,我们可以直接使用OpenResty由负载均衡层访问缓存,避免了调用应用层的性能损耗 。大家可以到https://openresty.org/cn/来了解有关OpenResty更多的知识 。同时,由于秒杀系统中,商品数量比较少,我们也可以使用动态渲染技术,CDN技术来加速网站的访问性能 。
如果在秒杀活动开始时,并发量太高时,我们可以将用户的请求放入队列中进行处理,并为用户弹出排队页面 。
高并发秒杀系统架构解密,不是所有的秒杀都是秒杀!

文章插图
 
秒杀系统时序图网上很多的秒杀系统和对秒杀系统的解决方案,并不是真正的秒杀系统,他们采用的只是同步处理请求的方案,一旦并发量真的上来了,他们所谓的秒杀系统的性能会急剧下降 。我们先来看一下秒杀系统在同步下单时的时序图 。
同步下单流程
高并发秒杀系统架构解密,不是所有的秒杀都是秒杀!

文章插图
 
1.用户发起秒杀请求在同步下单流程中,首先,用户发起秒杀请求 。商城服务需要依次执行如下流程来处理秒杀请求的业务 。
(1)识别验证码是否正确
商城服务判断用户发起秒杀请求时提交的验证码是否正确 。
(2)判断活动是否已经结束
验证当前秒杀活动是否已经结束 。
(3)验证访问请求是否处于黑名单
在电商领域中,存在着很多的恶意竞争,也就是说,其他商家可能会通过不正当手段来恶意请求秒杀系统,占用系统大量的带宽和其他系统资源 。此时,就需要使用风控系统等实现黑名单机制 。为了简单,也可以使用拦截器统计访问频次实现黑名单机制 。
(4)验证真实库存是否足够
系统需要验证商品的真实库存是否足够,是否能够支持本次秒杀活动的商品库存量 。
(5)扣减缓存中的库存
在秒杀业务中,往往会将商品库存等信息存放在缓存中,此时,还需要验证秒杀活动使用的商品库存是否足够,并且需要扣减秒杀活动的商品库存数量 。
(6)计算秒杀的价格
由于在秒杀活动中,商品的秒杀价格和商品的真实价格存在差异,所以,需要计算商品的秒杀价格 。
注意:如果在秒杀场景中,系统涉及的业务更加复杂的话,会涉及更多的业务操作,这里,我只是列举出一些常见的业务操作 。
2.提交订单(1)订单入口
将用户提交的订单信息保存到数据库中 。
(2)扣减真实库存
订单入库后,需要在商品的真实库存中将本次成功下单的商品数量扣除 。
如果我们使用上述流程开发了一个秒杀系统,当用户发起秒杀请求时,由于系统每个业务流程都是串行执行的,整体上系统的性能不会太高,当并发量太高时,我们会为用户弹出下面的排队页面,来提示用户进行等待 。
高并发秒杀系统架构解密,不是所有的秒杀都是秒杀!

文章插图
 
此时的排队时间可能是15秒,也可能是30秒,甚至是更长时间 。这就存在一个问题:在用户发起秒杀请求到服务器返回结果的这段时间内,客户端和服务器之间的连接不会被释放,这就会占大量占用服务器的资源 。
网上很多介绍如何实现秒杀系统的文章都是采用的这种方式,那么,这种方式能做秒杀系统吗?答案是可以做,但是这种方式支撑的并发量并不是太高 。此时,有些网友可能会问:我们公司就是这样做的秒杀系统啊!上线后一直在用,没啥问题啊!我想说的是:使用同步下单方式确实可以做秒杀系统,但是同步下单的性能不会太高 。之所以你们公司采用同步下单的方式做秒杀系统没出现大的问题,那是因为你们的秒杀系统的并发量没达到一定的量级,也就是说,你们的秒杀系统的并发量其实并不高 。


推荐阅读