写点什么

秒杀系统问题与方案设计

用户头像
superman
关注
发布于: 2020 年 08 月 03 日

概述

秒杀业务问题

高并发读商品,登录,抢

高并发抢的问题:超卖,卖不完,交易丢失,重复购买

手段:

针对各个问题采用多种方法:缓存,预热,异步,集群,阶段拆分,交互优化



1:秒杀场景分析

1.1 业务场景分析

短时间内对相同商品的大量购买(消费)

1:多人抢-同样的商品

2:单个商品的数量有限,购买人数远大于商品数

3:尽量保证公平,先到先得。

 

1.2 抢购交互过程

1:用户获取商品信息

2:时间到,抢购

3:抢到的进入下一步,支付等后续流程。

4:抢失败的,提示商品消费完了。

 

1.3 特点

1:并发请求量大

      并发请求两类

      并发获取商品信息

      并发下单

2:交易信息可靠

      告知用户成功后要保证数据正确。

3:交易量要与商品数匹配

 

2: 设计

 

2.1 商品信息高并发获取

    商品信息提前产生并进入多级缓存

商品信息是提前产生的,后面才可抢购,商品信息产生与抢购间可有充裕处理时间。

     可在商品信息产生后,将信息生成固定静态数据,推送到多级缓存中。

     多级缓存包括:客户端缓存,CDN,反向代理缓存,应用服务缓存。

     查询商品信息时不进入数据库查询。

  登录预热

     抢购前用户可能出现高并发的登录,缓存中要提前预热用户信息。

     可在抢购前一段时间将用户登录失效延长。

        

2.2 高并发抢

     抢的业务流程

     1>用户是合格购买人--有资格

     2>商品有剩余,抢一个

     3> 抢到记录抢购成功

     4>反馈用户抢购成功,进入下一步。

     请求成功数量逐步递减,最后有与商品数量批量的请求成功。

    

2.2.1 资格校验

部分场景会存在资格校验,不是所有用户都有权限    

添加交互步骤进行资格校验,资格用户缓存预热

 1:添加步骤

      交互上拆分为两个阶段,第一步交互进行资格校验。

      a:进入抢购页前面加一道入口页,入口页进行资格校验,通过的获取token,进入资格校验叶。

             比如宣传页->跳转抢购列表页->具体商品抢购页。

             可在进入下一级页面时进行资格校验。

       b:没有入口页的

            对信息会发散出去,都可以看到,只能抢的时候判断的,可对交互流程添加一步。

            将抢购流程从交互上分为两步,第一个进行校验,并进行限流。

            典型的抢红包业务,先获取红包,后抢拆,取的时候资格校验,只放有资格的进入下一步。

    2:预热资格列表

商品与用户资格提前预热到缓存

2.2.2 商品抢购

     要解决问题:高并发,公平-先到先得,避免超卖,避免卖不完提示没有,防止重复购买,防止提前下单(抢跑)。

     高并发

            1:集群

                  多节点应对并发请求。

            2:分阶段提前拦截

             如果资格用户数与商品数差距很大,可在网关层就进行拦截

            只保留最开始的部分用户进入服务层(进入用户稍大于商品数)。

             网关层可各节点分配一定的数,节点内计数。      

      公平

                绝对公平:整体请求排队,先到先得。

                相对公平:各个节点排队,先到先得。

      商品计数

防止超卖,少卖

               如果网关层做了拦截到服务层的是比商品数稍大的请求。

               商品计数防超卖

使用队列或共享计数器保证公平并防止超卖。

                 追求绝对公平:全局计数器

                 相对公平:各个节点按比例分配计数。

抢购结束状态防止少卖

缓存记录整体是否抢购完的状态。

状态为完成,反馈抢购结束,状态未完成但队列消费完或计数器为零,告知稍后再试。

节点完成后上报状态,汇总后更新全局状态为完成。

这种情况仅用于对少卖敏感,并且抢购人数与商品数差距不大的情况。否则节点本地消费完就

可以告知抢购完了。

         

        防止重复购买

                   端上:购买成功后记录状态,不再重新请求。

                   后端:记录抢购成功缓存购买成功用户-用户不再有资格。

防止提前下单

购买商品的请求token(可为url一部分),到期在生成。商品全局状态到期再打开。

2.3 交易成功保证

       用户抢购成功的,必须保住数据可靠,要以数据库提交事务成功为准。

抢购是唯一与数据库交互就是记录抢购记录。防止影响系统其他部分,提高抢购并发。

可对记录抢购记录的用单独的库处理,并且可以用多个库多个表处理。

       用户抢到商品:缓存抢购记录,同时数据库提交一条插入记录,提交成功反馈成功。

用数据库是防止缓存故障导致丢失抢购记录。

       抢购成功的后续步骤由任务队列异步进行。

2.4 支付与后续流程

      如果商品量给的较多,抢购成功后的支付等流程并发量也比较大,可以用异步模式。在交互上告知用户处理中,处理完毕后在通过发异步消息,短信等手段告知用户。



2.5 基础环境隔离与保障

为避免影响正常系统,可独立部署,走独立独立域名 等与正常系统隔离

对并发是需要高带宽,多服务器节点支持的,可预估出资源量,临时购买服务。

2.6 总结

针对各个问题采用多种方法:缓存,集群,多阶段拆分,限流,异步,交互调整,隔离与保障。



缓存

应对高并发读商品信息,高并发登录

           提前预热缓存:商品信息,用户信息提前预热到缓存。

           灵活设置缓存有限期:减少商信息与用户登录信息并发请求量。

 

集群

应对高并发,请求分到多个节点,商品计数分到多个节点。

拆分多阶段

     拆分为多阶段实现限流,提前拦截请求,校验资格等。        

异步

   数据库:抢时数据库只记录抢购记录,保住抢的结果可靠,其他异步处理。

交互调整

         防止卖不完可在对用户拦截或卖完前节点计数为0,反馈稍后再试。

         端上也可以进行动画播放(故意等一会),后续再请求。

         交易等异步执行时可反馈用户处理中,稍后通知。

隔离与保障

基础环境隔离,按需临时购买。



发布于: 2020 年 08 月 03 日阅读数: 95
用户头像

superman

关注

还未添加个人签名 2018.07.20 加入

还未添加个人简介

评论

发布
暂无评论
秒杀系统问题与方案设计