一种高并发场景下抢购活动的精细化限流处理方法、装置与流程

文档序号:23760095发布日期:2021-01-29 18:35阅读:230来源:国知局
一种高并发场景下抢购活动的精细化限流处理方法、装置与流程

[0001]
本发明涉及高并发活动处理技术领域,尤其是涉及一种高并发活动精细化限流处理方法、装置。


背景技术:

[0002]
如今流行的营销活动中,秒杀活动是所有客户比较喜欢参加的一种活动,比如总量100个手机,几百万人来抢。这种活动能吸引大量的客户,也能有效提升app的日活。但是秒杀活动往往对服务器产生巨大的压力,对后端系统的承载也提出了极大的要求。为了支持规模化的秒杀活动,现在的做法包括:(1)在活动开始之前预先启动很多的后端节点,由一个硬件负载均衡器进行负载转发,分担节点压力。(2)在负载均衡器上配置限流策略保护后端。
[0003]
当前方案存在以下几个基本问题:1)需要准备很多服务器来扩容后端服务,非秒杀活动时,服务器资源闲置浪费。2)虽然启动多个后端节点,这些节点也有一个系统的承载上线,由于硬件负载均衡器一般是网络四层的,往往在这个负载均衡器上配置连接数限流,连接数和qps无法划等号,往往可能造成无法控制的请求量打到后端,造成雪崩效应。3)超大并发的活动,限流对服务器也有很大的影响。因此,如何提高超高并发活动限流的精细可靠性成为本领域亟待解决的技术问题。


技术实现要素:

[0004]
本发明的目的就是为了克服上述现有技术存在的缺陷而提供一种高并发场景下抢购活动的精细化限流处理方法、装置。
[0005]
本发明的目的可以通过以下技术方案来实现:
[0006]
一种高并发场景下抢购活动的精细化限流处理方法,该方法包括:
[0007]
设置软件负载均衡节点,对于并发进行的不同抢购活动按照活动编号将对应抢购活动的商品库存分配至软件负载均衡节点;
[0008]
对于并发进行的不同抢购活动分别设置一定数量的令牌并存储至redis中;
[0009]
当开启某一抢购活动后,执行以下抢购步骤:
[0010]
s1、根据参与抢购活动的用户请求获取参加该抢购活动的人数;
[0011]
s2、对参加该抢购活动的用户请求进行概率限流,放行可访问redis的用户请求;
[0012]
s3、对访问redis的用户请求进行令牌桶限流,用户申请并获取令牌;
[0013]
s4、已获取令牌的用户进行两秒点击限流并进入步骤s5,未获取令牌的用户进行两秒点击限流并重复执行步骤s1~s4;
[0014]
s5、对已获取令牌的用户进行漏桶限流,经漏桶限流的用户请求转发至后端真实地址;
[0015]
s6、后端响应抢购成功,减少商品库存,重复s1~s6直至商品库存为零。
[0016]
优选地,所述的抢购活动的商品库存采用平均分配的方式分配至软件负载均衡节
点。
[0017]
优选地,对于一个抢购活动,在redis中存储的令牌数量为商品库存的x倍,x为常数。
[0018]
优选地,获取参加抢购活动的人数具体方式为:
[0019]
维护一个全局的哈希表,哈希表名定义为抢购活动的活动编号,哈希表中key为用户会员号,value为用户请求上次点击时间,用户进行抢购活动的页面,页面会周期性的与抢购活动核对时间,在核对时间的心跳请求时上送用户会员号信息,供软件负载均衡系统记录,进而根据用户会员号信息确定参加该抢购活动的人数,确定参加该抢购活动的人数时将以获取令牌的用户剔除。
[0020]
优选地,所述的概率限流的具体方式为:
[0021]
根据所有用户请求,随机选取n个用户请求分配至任意一个负载均衡节点,若n<ns,则放行此部分用户请求,否则返回表征抢购结束的信息提示,其中n取值为1/m~p/m,ns=k*ks,其中,m为软件负载均衡节点的个数,p为参加相应抢购活动的人数,ns为当前软件负载均衡节点可分配的令牌数量,k为当前软件负载均衡节点可抢购的商品库存数量,ks为设定常数。
[0022]
优选地,在抢购过程中,各负载均衡节点的令牌在抢购活动开始前一次性放入或在抢购过程中分批次放入。
[0023]
优选地,在令牌桶限流过程中,用户申请并获取令牌后,将令牌与用户会员号绑定并写入该用户的用户请求头中。
[0024]
优选地,所述的两秒点击限流具体为:对于任意一个用户,若当前用户请求与其上一次用户请求的间接小于2秒,则忽略当前用户请求,若大于2秒,则响应当前用户请求,根据用户是否已获取令牌执行对应操作。
[0025]
优选地,所述的漏桶限流具体为:根据提前配置好的后端真实地址所能承载的qps数,进行漏桶流量的限制,即每秒放行固定数量的用户请求,其他用户请求放在一个队列里,等待放行,如超过了队列大小,则返回表征抢购结束的信息提示,如超过了限定超时时间,返回表征系统繁忙的信息提示。
[0026]
一种高并发场景下抢购活动的精细化限流处理装置,包括存储器和处理器,所述的存储器用于存储计算机程序,所述处理器用于当执行所述计算机程序时,实现所述的精细化限流处理方法。
[0027]
与现有技术相比,本发明具有如下优点:
[0028]
(1)本发明设置软件负载均衡节点,采用软件负载均衡器实现高并发场景下抢购活动的精细化限流,由于是软件负载均衡器,可用活动编号来区分不同的高并发场景(多个抢购活动),从而支持多场抢购活动的同时进行;
[0029]
(2)本发明设置多重限流方式,保证不会冲破后端服务的承载量,保证高并发场景下抢购活动的可靠进行;
[0030]
(3)本发明设置概率限流,根据库存总量进行概率限流,有效的控制流量,又能让库存消耗完,大大提高高并发场景下抢购活动的可靠性。
附图说明
[0031]
图1为本发明高并发场景下抢购活动的精细化限流处理方法的流程框图。
具体实施方式
[0032]
下面结合附图和具体实施例对本发明进行详细说明。注意,以下的实施方式的说明只是实质上的例示,本发明并不意在对其适用物或其用途进行限定,且本发明并不限定于以下的实施方式。
[0033]
实施例1
[0034]
如图1所示,本实施例提供一种高并发场景下抢购活动的精细化限流处理方法,该方法包括:
[0035]
设置软件负载均衡节点,对于并发进行的不同抢购活动按照活动编号将对应抢购活动的商品库存分配至软件负载均衡节点;
[0036]
对于并发进行的不同抢购活动分别设置一定数量的令牌并存储至redis中;
[0037]
当开启某一抢购活动后,执行以下抢购步骤:
[0038]
s1、根据参与抢购活动的用户请求获取参加该抢购活动的人数;
[0039]
s2、对参加该抢购活动的用户请求进行概率限流,放行可访问redis的用户请求;
[0040]
s3、对访问redis的用户请求进行令牌桶限流,用户申请并获取令牌;
[0041]
s4、已获取令牌的用户进行两秒点击限流并进入步骤s5,未获取令牌的用户进行两秒点击限流并重复执行步骤s1~s4;
[0042]
s5、对已获取令牌的用户进行漏桶限流,经漏桶限流的用户请求转发至后端真实地址;
[0043]
s6、后端响应抢购成功,减少商品库存,重复s1~s6直至商品库存为零。
[0044]
抢购活动的商品库存采用平均分配的方式分配至软件负载均衡节点。
[0045]
对于一个抢购活动,在redis中存储的令牌数量为商品库存的x倍,x为常数。
[0046]
获取参加抢购活动的人数具体方式为:
[0047]
维护一个全局的哈希表,哈希表名定义为抢购活动的活动编号,哈希表中key为用户会员号,value为用户请求上次点击时间,用户进行抢购活动的页面,页面会周期性的与抢购活动核对时间,在核对时间的心跳请求时上送用户会员号信息,供软件负载均衡系统记录,进而根据用户会员号信息确定参加该抢购活动的人数,确定参加该抢购活动的人数时将以获取令牌的用户剔除。
[0048]
概率限流的具体方式为:
[0049]
根据所有用户请求,随机选取n个用户请求分配至任意一个负载均衡节点,若n<ns,则放行此部分用户请求,否则返回表征抢购结束的信息提示,其中n取值为1/m~p/m,ns=k*ks,其中,m为软件负载均衡节点的个数,p为参加相应抢购活动的人数,ns为当前软件负载均衡节点可分配的令牌数量,k为当前软件负载均衡节点可抢购的商品库存数量,ks为设定常数。
[0050]
在抢购过程中,各负载均衡节点的令牌在抢购活动开始前一次性放入或在抢购过程中分批次放入。
[0051]
在令牌桶限流过程中,用户申请并获取令牌后,将令牌与用户会员号绑定并写入
该用户的用户请求头中。
[0052]
两秒点击限流具体为:对于任意一个用户,若当前用户请求与其上一次用户请求的间接小于2秒,则忽略当前用户请求,若大于2秒,则响应当前用户请求,根据用户是否已获取令牌执行对应操作。
[0053]
漏桶限流具体为:根据提前配置好的后端真实地址所能承载的qps数,进行漏桶流量的限制,即每秒放行固定数量的用户请求,其他用户请求放在一个队列里,等待放行,如超过了队列大小,则返回表征抢购结束的信息提示,如超过了限定超时时间,返回表征系统繁忙的信息提示。
[0054]
本实施例以“举行活动总量100个手机,同时都有几百万人来抢这个商品,每人只能抢购1个手机”的场景举例:
[0055]
设置10个软件负载均衡节点,每个负载均衡节点有一个key记录各个活动的库存状态,这个库存状态存放在各个软件负载均衡的内存中,0表示无库存,1表示有库存。活动开始前把100个手机商品库存存放在redis中,活动开始后经过一段时间抢购,只要有一个请求访问redis中数据返回库存为空,则将软件负载均衡内存中的库存状态改为0,所有的请求进来会先判断库存状态,有库存才进行下面的限流操作,没有则直接返回,如果库存被抢购空了,后面又补充了库存,会同时修改这个库存状态为1。
[0056]
为了控制后端整体流量可控,在redis里提前预置库存*5倍的令牌量,本实施例中即为50个令牌,获取到请求令牌的请求才能进行抢购,并且客户号需要与令牌绑定,使每个用户只能获取一个令牌,来控制每个客户只能抢购一件商品。
[0057]
由于redis每秒最多10w的qps的瓶颈,需要对进入redis获取令牌的请求进行限流,防止redis被流量打垮。
[0058]
其具体处理过程为:
[0059]
具体实现说明如下:
[0060]
1)计算活动参加人数
[0061]
维护一个全局的hashmap,map名定义成活动id,key名为会员号,value为上次点击时间。客户进入秒杀页面,页面会周期性的与秒杀服务核对时间,在核对时间的心跳请求时上送会员号信息,供软件负载均衡系统记录。
[0062]
2)概率限流
[0063]
活动开始后,抢购请求到软件负载均衡,根据参加活动的人数,取[(1~活动人数)/10]的随机数n,n与当前软件负载均衡节点的库存*5(即上述参数ns,该参数可以随时调整,为了保证令牌可以消耗完)的数相比,若n<ns则放行,否则返回奖品已抢购结束(超大并发限流核心限流方法,此举可以大幅降低请求对redis的访问量。)
[0064]
3)令牌桶限流
[0065]
活动开始前,根据软件负载均衡节点的库存*5,提前预置令牌在redis,使足够人数能获取令牌进行库存抢购,确保库存能消耗完。此用户如已携带令牌则直接进入下一步限流操作,如未携带令牌则去申请令牌,并跟会员id进行绑定,绑定完写入到请求头中。(获取到令牌的用户,本次活动一直都可以进行抢购,直到库存抢完。需要说明的是在该实施例中令牌提前方式在软件负载均衡节点,在一些实施例方式中令牌可以在抢购过程中分批次放入。
[0066]
4)两秒点击限流
[0067]
根据会员号获取用户请求的点击事件,判断是否为2秒以内,如2秒以内,返回等两秒再试,如超过两秒则进入下一步限流。
[0068]
5)漏桶限流
[0069]
根据提前配置好的后端真实地址所能承载的qps数,进行漏桶流量的限制,即每秒放行固定的请求,其他请求放在一个队列里,等待放行,如超过了队列大小,则返回奖品已抢购结束,如超过了限定超时时间,返回繁忙请重试。(因库存可能很多,造成令牌桶瞬间可能冲破下游qps限制,所以需要再加这层漏桶限流)。
[0070]
6)减少库存
[0071]
经过上述多重限流之后的请求,转发到真实后端地址。如后端响应抢购成功,则在redis中库存减少1。
[0072]
7)结束抢购
[0073]
直到库存为0,则将库存状态改为没有库存的状态,将此标志放置在限流第一位(即请求刚进软件负载均衡器获取库存状态为零直接将请求打回显示奖品已抢购完)。如有人退货或者补库存,则调用软件负载均衡接口,增加库存,同时增加令牌,使客户能继续抢购。
[0074]
本发明设置软件负载均衡节点,采用软件负载均衡器实现高并发场景下抢购活动的精细化限流,由于是软件负载均衡器,可用活动编号来区分不同的高并发场景(多个抢购活动),从而支持多场抢购活动的同时进行;抢购过程中,采用多重限流方式,保证不会冲破后端服务的承载量,保证高并发场景下抢购活动的可靠进行;其中设置的概率限流能根据库存总量进行概率限流,有效的控制流量,又能让库存消耗完,大大提高高并发场景下抢购活动的可靠性。
[0075]
实施例2
[0076]
本实施例提供一种高并发场景下抢购活动的精细化限流处理装置,该装置包括存储器和处理器,存储器用于存储计算机程序,所述处理器用于当执行所述计算机程序时,实现实施例1中的高并发场景下抢购活动的精细化限流处理方法,此处对实施例1中的高并发场景下抢购活动的精细化限流处理方法不再赘述。
[0077]
上述实施方式仅为例举,不表示对本发明范围的限定。这些实施方式还能以其它各种方式来实施,且能在不脱离本发明技术思想的范围内作各种省略、置换、变更。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1