秒杀系统问题与方案设计
概述
秒杀业务问题
高并发读商品,登录,抢
高并发抢的问题:超卖,卖不完,交易丢失,重复购买
手段:
针对各个问题采用多种方法:缓存,预热,异步,集群,阶段拆分,交互优化
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,反馈稍后再试。
端上也可以进行动画播放(故意等一会),后续再请求。
交易等异步执行时可反馈用户处理中,稍后通知。
隔离与保障
基础环境隔离,按需临时购买。
版权声明: 本文为 InfoQ 作者【superman】的原创文章。
原文链接:【http://xie.infoq.cn/article/1895cfec0ffe4f3c392ee95cf】。文章转载请联系作者。
评论