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


所以,很多所谓的秒杀系统,存在着秒杀的业务,但是称不上真正的秒杀系统,原因就在于他们使用的是同步的下单流程,限制了系统的并发流量 。之所以上线后没出现太大的问题,是因为系统的并发量不高,不足以压死整个系统 。
如果12306、淘宝、天猫、京东、小米等大型商城的秒杀系统是这么玩的话,那么,他们的系统迟早会被玩死,他们的系统工程师不被开除才怪!所以,在秒杀系统中,这种同步处理下单的业务流程的方案是不可取的 。
以上就是同步下单的整个流程操作,如果下单流程更加复杂的话,就会涉及到更多的业务操作 。
异步下单流程既然同步下单流程的秒杀系统称不上真正的秒杀系统,那我们就需要采用异步的下单流程了 。异步的下单流程不会限制系统的高并发流量 。

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

文章插图
 
1.用户发起秒杀请求用户发起秒杀请求后,商城服务会经过如下业务流程 。
(1)检测验证码是否正确
用户发起秒杀请求时,会将验证码一同发送过来,系统会检验验证码是否有效,并且是否正确 。
(2)是否限流
系统会对用户的请求进行是否限流的判断,这里,我们可以通过判断消息队列的长度来进行判断 。因为我们将用户的请求放在了消息队列中,消息队列中堆积的是用户的请求,我们可以根据当前消息队列中存在的待处理的请求数量来判断是否需要对用户的请求进行限流处理 。
例如,在秒杀活动中,我们出售1000件商品,此时在消息队列中存在1000个请求,如果后续仍然有用户发起秒杀请求,则后续的请求我们可以不再处理,直接向用户返回商品已售完的提示 。
高并发秒杀系统架构解密,不是所有的秒杀都是秒杀!

文章插图
 
所以,使用限流后,我们可以更快的处理用户的请求和释放连接的资源 。
(3)发送MQ
用户的秒杀请求通过前面的验证后,我们就可以将用户的请求参数等信息发送到MQ中进行异步处理,同时,向用户响应结果信息 。在商城服务中,会有专门的异步任务处理模块来消费消息队列中的请求,并处理后续的异步流程 。
在用户发起秒杀请求时,异步下单流程比同步下单流程处理的业务操作更少,它将后续的操作通过MQ发送给异步处理模块进行处理,并迅速向用户返回响应结果,释放请求连接 。
2.异步处理我们可以将下单流程的如下操作进行异步处理 。
(1)判断活动是否已经结束
(2)判断本次请求是否处于系统黑名单,为了防止电商领域同行的恶意竞争可以为系统增加黑名单机制,将恶意的请求放入系统的黑名单中 。可以使用拦截器统计访问频次来实现 。
(3)扣减缓存中的秒杀商品的库存数量 。
(4)生成秒杀Token,这个Token是绑定当前用户和当前秒杀活动的,只有生成了秒杀Token的请求才有资格进行秒杀活动 。
这里我们引入了异步处理机制,在异步处理中,系统使用多少资源,分配多少线程来处理相应的任务,是可以进行控制的 。
3.短轮询查询秒杀结果这里,可以采取客户端短轮询查询是否获得秒杀资格的方案 。例如,客户端可以每隔3秒钟轮询请求服务器,查询是否获得秒杀资格,这里,我们在服务器的处理就是判断当前用户是否存在秒杀Token,如果服务器为当前用户生成了秒杀Token,则当前用户存在秒杀资格 。否则继续轮询查询,直到超时或者服务器返回商品已售完或者无秒杀资格等信息为止 。
采用短轮询查询秒杀结果时,在页面上我们同样可以提示用户排队处理中,但是此时客户端会每隔几秒轮询服务器查询秒杀资格的状态,相比于同步下单流程来说,无需长时间占用请求连接 。
此时,可能会有网友会问:采用短轮询查询的方式,会不会存在直到超时也查询不到是否具有秒杀资格的状态呢?答案是:有可能! 这里我们试想一下秒杀的真实场景,商家参加秒杀活动本质上不是为了赚钱,而是提升商品的销量和商家的知名度,吸引更多的用户来买自己的商品 。所以,我们不必保证用户能够100%的查询到是否具有秒杀资格的状态 。
4.秒杀结算(1)验证下单Token
客户端提交秒杀结算时,会将秒杀Token一同提交到服务器,商城服务会验证当前的秒杀Token是否有效 。
(2)加入秒杀购物车
商城服务在验证秒杀Token合法并有效后,会将用户秒杀的商品添加到秒杀购物车 。


推荐阅读