秒杀系统设计方案的思考

前言

秒杀系统是我们电商系统中常见的一种业务模式,用于吸引用户,刺激留存级消费所做的一种活动。

秒杀系统的特点:
1.瞬时流量极大,过了秒杀时间点流量结束。所以不能单纯用机器对QPS。
2.秒杀商品库存很少,例如有1万用户去抢2瓶茅台。
3.秒杀时间点味道的时候,刷新量极大,静态资源被访问剧增。比如10点开始秒杀。可能用户9点50分就已经进来开始刷新页面了。

秒杀活动一般流程:
1.运营策划一个秒杀活动,选定好商品,在秒杀中台建立秒杀活动,需要距离秒杀开始提前一段时间,将秒杀数据,库存信息写入缓存。
2.业务方研发根据实际情况来看看自身服务器是否扛得住这么高的访问量。
3.用户开始进行秒杀

针对以上秒杀系统的特点,我们映射到技术层面上,就有一些要考虑的点:
1.高并发,快响应:秒杀一般是C端产品吸引用户的点,需要考虑用户体验。并发量极高,对服务有要求,要抗住并发。

针对于请求和用户的高并发。我们需要在上线之前,首先做好压测,知道服务的QPS瓶颈点。针对我们的日常业务秒杀的预估,进行服务器的准备。测试TPS,寻找薄弱点进行代码优化,服务支撑优化。
一般采用 redis+热数据+mq。前端页面资源静态化,cdn加速。带宽扩展。集群负载均衡

2.防止超卖:商品库存数量有限,不能因为用户量高,并发扣减库存,导致商品超卖,库存变负。

我们一般为了速度快,我们要在秒杀活动建立之前就把商品库存同步到redis中。在真正秒杀的时候,一般再分为两步。
第一步:判断库存名额是否充足。
第二步:减少库存名额,扣减成功就是代表用户抢到了这个商品。
那么我们一般是借助redis的lua脚本特性来进行库存的扣减。lua脚本可以保证我们的原子性

3.防刷子:防止机器人,恶意刷子,去抢占订单,导致正常用户抢不到商品。

限流我们主要采取两种策略,一种是同一用户id限流,一种是同一ip进行限流。首先秒杀是一种非常快就结束的活动,我们无需担心进行限流会影响用户秒杀的体验。假如一个人1秒内只能请求10次。一个ip最多只能请求10次。对于热点上来说10次都抢不到,那就代表这个用户真的抢不到该商品。限流也给我们服务带来了极大的好处,因为有一些流量可能是机器产生,不是人工手动点击的

限流策略:待定。

4,页面资源访问多:需要考虑静态化,CDN,静态资源缓存及压缩。

我们在进行静态化的时候,需要对页面资源进行提前的缓存,保证用户直接请求URL的时候,无需去解析请求头,无需重组http协议,可以直接找到静态资源进行返回,不与后端做数据交互。一般静态资源我们放在CDN上。CDN的就近原则可以提高我们的响应速度和命中率。同时CDN开启资源压缩,减少传输数据量,提高速度

5.秒杀按钮:前端的按钮可以进行限制一些请求打到后端。没到时间点之前都可以置灰。

一个秒杀活动可能是10点准时开始,但是用户可能提前就进来了,疯狂点击秒杀按钮,如果这个时候让用户疯狂点击按钮,那么无论对于我们的前端还是对于服务端都会产生交互的压力。所以我们的秒杀一定是在未达到时间点的时候,不让用户点击。可以通过前端的定时器来将按钮的状态作为变更

6.秒杀真链接隐藏:防止后台交互链接,非秒杀期间漏出。

如果说我们的秒杀活动开始之前就被一些黄牛,刷子或者一些懂网络的人知道了我们请求格式。那么他们就可以提前准备好,通过机器的方式进行提前请求。这样会造成压力到达服务器,也会造成正常人根本秒杀不到商品。所以我们要采取链接加密,每次秒杀无规律可言,比如说什么id递增是不行的。时间到了才可以看到真实秒杀地址

7.异步处理订单后续:秒杀成功后,订单处理交于异步服务。

随着我们用户参与秒杀已经成功,那么我们不应该同步去返回秒杀结果,比如扣减库存成功过后,再等执行完我们的业务逻辑再给用户返回。而是交给我们的消息队列,将秒杀成功的消息放入队列,让其他服务进行后续的处理,快速返回给用户,告诉他秒杀成功。随着用户点击查看订单的过程,你的后端其实基本就已经处理完毕,让用户看到已经秒杀成功的订单。所以后端服务处理也要提升速度,不能很慢。防止用户此时查不到订单数据,造成歧义。

8.订单失败补偿:遇到订单后续处理失败,必须补偿。

对于用户来说,我已经秒杀成功,那么我们要保证的是订单一定要处理成功,不能说因为我们服务处理的原因,造成订单丢失,导致无法履约,这样会给用户带来不好的体验和纠纷。通常我们都是用mq的方式进行驱动。mq只要存在,就一定要消费成功,如果消费失败,出现异常,也要重试,或者要有报警机制及时预警处理。

9.服务降级:遇到紧急情况,可以快速处理。

这种方式可能是最后最后的策略了,用于我们的服务确实出现了极大的问题,导致秒杀业务不能正常进行。比如,秒杀的价格标错,有10倍100倍的差错。为了及时止损,我们就要做一个降级的开关,不做任何的交互,可以直接返回一些提示文案。如,秒杀结束
那么还有可能是我们的服务器撑不住了,例如作为一个秒杀中台服务,某一时间点大量秒杀活动瞬间开启,我们没有预料到访问量,防止整理业务全崩,我们选择弃车保帅,根据业务线降级

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值