CN117499311A - 分布式限流方法、装置、设备以及存储介质 - Google Patents
分布式限流方法、装置、设备以及存储介质 Download PDFInfo
- Publication number
- CN117499311A CN117499311A CN202311580575.0A CN202311580575A CN117499311A CN 117499311 A CN117499311 A CN 117499311A CN 202311580575 A CN202311580575 A CN 202311580575A CN 117499311 A CN117499311 A CN 117499311A
- Authority
- CN
- China
- Prior art keywords
- request message
- redis
- current limiting
- double
- queue
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 67
- 230000004044 response Effects 0.000 claims description 33
- 230000000694 effects Effects 0.000 abstract description 3
- 230000008569 process Effects 0.000 description 10
- 238000012545 processing Methods 0.000 description 10
- 230000006870 function Effects 0.000 description 9
- 238000004422 calculation algorithm Methods 0.000 description 3
- 238000004891 communication Methods 0.000 description 3
- 238000005516 engineering process Methods 0.000 description 3
- 230000009286 beneficial effect Effects 0.000 description 2
- 238000010586 diagram Methods 0.000 description 2
- 241000508269 Psidium Species 0.000 description 1
- 239000008186 active pharmaceutical agent Substances 0.000 description 1
- 230000003044 adaptive effect Effects 0.000 description 1
- 238000013459 approach Methods 0.000 description 1
- 230000005540 biological transmission Effects 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 230000001419 dependent effect Effects 0.000 description 1
- 230000007246 mechanism Effects 0.000 description 1
- 238000010295 mobile communication Methods 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 230000002085 persistent effect Effects 0.000 description 1
- 230000002035 prolonged effect Effects 0.000 description 1
- 238000011084 recovery Methods 0.000 description 1
- 238000011144 upstream manufacturing Methods 0.000 description 1
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L47/00—Traffic control in data switching networks
- H04L47/10—Flow control; Congestion control
- H04L47/29—Flow control; Congestion control using a combination of thresholds
Abstract
本申请公开了一种分布式限流方法、装置、设备以及存储介质,其分布式限流方法包括:接收用户发送的请求消息;根据所述用户的身份标识判断所述请求消息是否需要限流;若所述请求消息需要限流,则向Redis双端队列的入口端加入所述请求消息;在处理所述请求消息时,从所述Redis双端队列的出口端获取所述请求消息;基于所述请求消息获取可用许可,根据所述可用许可调用下游服务。本申请实现了既能支持分布式场景下的限流,又能确保消息重放时不产生乱序的效果。
Description
技术领域
本申请涉及大数据处理技术领域,尤其涉及一种分布式限流方法、装置、设备以及存储介质。
背景技术
对于线上系统来说,当业务处理状态发生变化之后,异步给下游服务发送消息以通知下一步业务处理是常见的一种手段。在实际的工作中,面对比较容易受到流量高峰的影响,进而导致响应(发送)时间变长甚至拥堵失败的情况,通常会设计一些限流和保护的机制。现有主流框架下的限流策略主要有以下几种:
(1)采用Google的Guava RateLimiter令牌桶算法来实现限流:
RateLimiter令牌桶算法是一种基于存放固定容量令牌的桶,按照固定速率往桶里添加令牌,其中,桶中存放的令牌数有最大上限阈值,超出阈值之后令牌就被丢弃或者拒绝的技术。然而,RateLimiter以jar包形式集成在应用中,应用的不同实例使用的是不同的阈值,所以该技术只能在应用的单实例中实现限流,不能满足应用的分布式限流要求。
(2)采用Alibaba Sentinel框架来实现限流:
Sentinel可以通过搭建一个Token Server服务来实现分布式限流,其中,限流消息存储在各自实例的内存中。然而,该技术不能控制不同实例间的重放顺序,因此在限流消息重放时无法做到严格意义的先进先出,导致消息消费容易产生乱序的情况。
因此,针对现有技术存在的问题,有必要提出一种解决消息重放时容易产生乱序的分布式限流方案。
发明内容
本申请的主要目的在于提供一种分布式限流方法、装置、设备以及存储介质,旨在解决现有分布式限流方案存在的消息重放时容易产生乱序的问题。
为实现上述目的,本申请提供一种分布式限流方法,所述分布式限流方法包括:
接收用户发送的请求消息;
根据所述用户的身份标识判断所述请求消息是否需要限流;
若所述请求消息需要限流,则向远程字典服务Redis双端队列的入口端加入所述请求消息;
在处理所述请求消息时,从所述Redis双端队列的出口端获取所述请求消息;
基于所述请求消息获取可用许可,根据所述可用许可调用下游服务。
可选地,所述根据所述用户的身份标识判断所述请求消息是否需要限流的步骤包括:
确定所述用户的身份标识是否存在于所述Redis双端队列中;
若所述身份标识存在于所述Redis双端队列中,则判定所述请求消息需要限流。
可选地,所述确定所述用户的身份标识是否存在于所述Redis双端队列中的步骤之后,还包括:
若所述身份标识不存在于所述Redis双端队列中,则确定当前流量是否达到当前限流阈值;
在当前流量达到当前限流阈值的情况下,判定所述请求消息需要限流,并将所述身份标识与所述请求消息关联存储于所述Redis双端队列中。
可选地,所述根据所述用户的身份标识判断所述请求消息是否需要限流的步骤之后,还包括:
若所述请求消息不需要限流,则执行步骤:基于所述请求消息获取可用许可,根据所述可用许可调用下游服务;
其中,获取可用许可的步骤包括:
增加Redis的Lua脚本中的计数;
判断增加后的计数是否超过所述当前限流阈值;
若所述增加后的计数未超过所述当前限流阈值,则获取可用许可并生成对应的执行返回值,将所述增加后的计数更新到Redis中。
可选地,所述接收用户发送的请求消息的步骤之前,还包括:
获取预设时间范围内的接口平均响应时间;
将所述接口平均响应时间与预设时间值进行比较;
若所述接口平均响应时间大于所述预设时间值,则发送告警信息并根据预设比例降低所述当前限流阈值;
若所述接口平均响应时间小于所述预设时间值,则确定所述当前限流阈值是否达到预设最大值;
若所述当前限流阈值未达到所述预设最大值,则增加所述当前限流阈值。
可选地,向Redis双端队列的入口端加入所述请求消息的步骤包括:
通过Redis的Lpush命令向所述Redis双端队列的入口端加入所述请求消息,其中,所述请求消息为首次被限流的请求消息;
从所述Redis双端队列的出口端获取所述请求消息的步骤包括:
通过Redis的Rpop命令从所述Redis双端队列的出口端获取所述请求消息。
可选地,所述基于所述请求消息获取可用许可的步骤之后,还包括:
确定所述可用许可是否获取成功;
若所述可用许可获取成功,则执行步骤:根据所述可用许可调用下游服务;
若所述可用许可获取失败,则通过Redis的Rpush命令向所述Redis双端队列的出口端加入所述请求消息。
本申请实施例还提出一种分布式限流装置,所述分布式限流装置包括:
接收模块,用于接收用户发送的请求消息;
判断模块,用于根据所述用户的身份标识判断所述请求消息是否需要限流;
消息加入模块,用于若所述请求消息需要限流,则向远程字典服务Redis双端队列的入口端加入所述请求消息;
消息获取模块,用于在处理所述请求消息时,从所述Redis双端队列的出口端获取所述请求消息;
调用模块,用于基于所述请求消息获取可用许可,根据所述可用许可调用下游服务。
本申请实施例还提出一种分布式限流设备,所述分布式限流设备包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的分布式限流程序,所述分布式限流程序被所述处理器执行时实现如上所述的分布式限流方法的步骤。
本申请实施例还提出一种计算机可读存储介质,所述计算机可读存储介质上存储有分布式限流程序,所述分布式限流程序被处理器执行时实现如上所述的分布式限流方法的步骤。
本申请实施例提出的分布式限流方法、装置、设备以及存储介质,通过接收用户发送的请求消息;根据所述用户的身份标识判断所述请求消息是否需要限流;若所述请求消息需要限流,则向Redis双端队列的入口端加入所述请求消息;在处理所述请求消息时,从所述Redis双端队列的出口端获取所述请求消息;基于所述请求消息获取可用许可,根据所述可用许可调用下游服务。通过根据用户的身份标识判断请求消息是否需要限流,将需要限流的请求消息存储在Redis双端队列中,实现了分布式场景下的限流功能;通过使用Redis双端队列来存放需要限流的请求消息,能实现极大的存储空间,同时也能支持限流后请求消息的顺序重放,防止消息顺序错乱带来的客户满意度问题。
附图说明
图1为本申请分布式限流装置所属终端设备的功能模块示意图;
图2为本申请分布式限流方法第一示例性实施例的流程示意图;
图3为本申请分布式限流方法第二示例性实施例的流程示意图;
图4为本申请分布式限流方法第三示例性实施例的流程示意图;
图5为本申请分布式限流方法第四示例性实施例的流程示意图;
图6为本申请分布式限流方法第五示例性实施例的流程示意图。
本申请目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。
具体实施方式
应当理解,此处所描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
本申请实施例的主要解决方案是:通过接收用户发送的请求消息;根据所述用户的身份标识判断所述请求消息是否需要限流;若所述请求消息需要限流,则向Redis双端队列的入口端加入所述请求消息;在处理所述请求消息时,从所述Redis双端队列的出口端获取所述请求消息;基于所述请求消息获取可用许可,根据所述可用许可调用下游服务。通过根据用户的身份标识判断请求消息是否需要限流,将需要限流的请求消息存储在Redis双端队列中,实现了分布式场景下的限流功能;通过使用Redis双端队列来存放需要限流的请求消息,能实现极大的存储空间,同时也能支持限流后请求消息的顺序重放,防止消息顺序错乱带来的客户满意度问题。
具体地,参照图1,图1为本申请分布式限流装置所属终端设备的功能模块示意图。该分布式限流装置可以为独立于终端设备的、能够进行数据处理的装置,其可以通过硬件或软件的形式承载于终端设备上。该终端设备可以为手机、平板电脑等具有数据处理功能的智能移动终端,还可以为具有数据处理功能的固定终端设备或服务器等。
在本实施例中,该分布式限流装置所属终端设备至少包括输出模块110、处理器120、存储器130以及通信模块140。
存储器130中存储有操作系统以及分布式限流程序,分布式限流装置可以将接收到的用户发送的请求消息,根据所述用户的身份标识判断所述请求消息是否需要限流的判定结果,从Redis双端队列的入口端加入的请求消息,从Redis双端队列的出口端获取的请求消息,以及基于请求消息获取到的可用许可等信息存储于该存储器130中;输出模块110可为显示屏等。通信模块140可以包括WIFI模块、移动通信模块以及蓝牙模块等,通过通信模块140与外部设备或服务器进行通信。
其中,存储器130中的分布式限流程序被处理器执行时实现以下步骤:
接收用户发送的请求消息;
根据所述用户的身份标识判断所述请求消息是否需要限流;
若所述请求消息需要限流,则向远程字典服务Redis双端队列的入口端加入所述请求消息;
在处理所述请求消息时,从所述Redis双端队列的出口端获取所述请求消息;
基于所述请求消息获取可用许可,根据所述可用许可调用下游服务。
进一步地,存储器130中的分布式限流程序被处理器执行时还实现以下步骤:
确定所述用户的身份标识是否存在于所述Redis双端队列中;
若所述身份标识存在于所述Redis双端队列中,则判定所述请求消息需要限流。
进一步地,存储器130中的分布式限流程序被处理器执行时还实现以下步骤:
若所述身份标识不存在于所述Redis双端队列中,则确定当前流量是否达到当前限流阈值;
在当前流量达到当前限流阈值的情况下,判定所述请求消息需要限流,并将所述身份标识与所述请求消息关联存储于所述Redis双端队列中。
进一步地,存储器130中的分布式限流程序被处理器执行时还实现以下步骤:
若所述请求消息不需要限流,则执行步骤:基于所述请求消息获取可用许可,根据所述可用许可调用下游服务;
其中,获取可用许可的步骤包括:
增加Redis的Lua脚本中的计数;
判断增加后的计数是否超过所述当前限流阈值;
若所述增加后的计数未超过所述当前限流阈值,则获取可用许可并生成对应的执行返回值,将所述增加后的计数更新到Redis中。
进一步地,存储器130中的分布式限流程序被处理器执行时还实现以下步骤:
获取预设时间范围内的接口平均响应时间;
将所述接口平均响应时间与预设时间值进行比较;
若所述接口平均响应时间大于所述预设时间值,则发送告警信息并根据预设比例降低所述当前限流阈值;
若所述接口平均响应时间小于所述预设时间值,则确定所述当前限流阈值是否达到预设最大值;
若所述当前限流阈值未达到所述预设最大值,则增加所述当前限流阈值。
进一步地,存储器130中的分布式限流程序被处理器执行时还实现以下步骤:
通过Redis的Lpush命令向所述Redis双端队列的入口端加入所述请求消息,其中,所述请求消息为首次被限流的请求消息;
通过Redis的Rpop命令从所述Redis双端队列的出口端获取所述请求消息。
进一步地,存储器130中的分布式限流程序被处理器执行时还实现以下步骤:
确定所述可用许可是否获取成功;
若所述可用许可获取成功,则执行步骤:根据所述可用许可调用下游服务;
若所述可用许可获取失败,则通过Redis的Rpush命令向所述Redis双端队列的出口端加入所述请求消息。
本实施例通过上述方案,具体通过接收用户发送的请求消息;根据所述用户的身份标识判断所述请求消息是否需要限流;若所述请求消息需要限流,则向Redis双端队列的入口端加入所述请求消息;在处理所述请求消息时,从所述Redis双端队列的出口端获取所述请求消息;基于所述请求消息获取可用许可,根据所述可用许可调用下游服务。通过根据用户的身份标识判断请求消息是否需要限流,将需要限流的请求消息存储在Redis双端队列中,实现了分布式场景下的限流功能;通过使用Redis双端队列来存放需要限流的请求消息,能实现极大的存储空间,同时也能支持限流后请求消息的顺序重放,防止消息顺序错乱带来的客户满意度问题。
基于上述终端设备架构但不限于上述架构,提出本申请方法实施例。
参照图2,图2为本申请分布式限流方法第一示例性实施例的流程示意图。所述分布式限流方法包括:
步骤S110,接收用户发送的请求消息。
本实施例方法的执行主体可以是一种分布式限流装置,也可以是一种分布式限流终端设备或服务器,本实施例以分布式限流装置进行举例,该分布式限流装置可以集成在具有数据处理功能的智能手机、电脑等设备上。
具体地,在用户发送请求消息到分布式限流装置上时,通过该分布式限流装置接收用户发送的请求消息。其中,该分布式限流装置可用于提供限流服务,基于限流服务通过被允许的请求消息,并将不被允许的请求消息加入到等待队列中。
步骤S120,根据所述用户的身份标识判断所述请求消息是否需要限流。
具体地,在接收到用户发送的请求消息后,根据该用户的身份标识判断接收到的请求消息是否需要限流。其中,用户的身份标识是指用以唯一确定用户身份的信息,可以包括但不限于用户ID、设备ID和IP地址等。
更为具体地,在接收到用户发送的请求消息后,根据预设的限流条件和用户的身份标识进行判断,在用户的身份标识符合限流条件的情况下,将该用户发送的请求消息判定为需要限流;反之,在该用户的身份标识不符合限流条件的情况下,将该用户发送的请求消息判定为不需要限流。
步骤S130,若所述请求消息需要限流,则向远程字典服务Redis双端队列的入口端加入所述请求消息。
具体地,远程字典服务(Redis,Remote Dictionary Server)是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。Redis双端队列可以通过Redis的list特性实现双端队列操作,其中,Redislist的最大长度是232-1,能够满足大存放空间要求。Redis双端队列具备两个端口,分别是入口端和出口端。
在本实施例中,在判定用户的请求消息需要限流的情况下,将该请求消息从Redis双端队列的入口端处加入至Redis双端队列。同时,还可以将与该请求消息相关联的用户的身份标识也加入至Redis双端队列中。
加入至redis双端队列中的请求消息需等待调度处理,直到顺序在前的请求消息被消费完成,才开始处理该用户发送的请求消息。
步骤S140,在处理所述请求消息时,从所述Redis双端队列的出口端获取所述请求消息。
具体地,循环从Redis双端队列中消费消息,直到顺序在前的请求消息被消费完成时,开始处理该用户发送的请求消息。在处理该用户发送的请求消息时,从Redis双端队列的出口端处获取该用户发送的请求消息。
在本实施例中,请求消息被限流后存放在Redis双端队列中,在满足大存放空间要求的同时,可以通过控制请求消息进出队列的方向,解决消息重放时的乱序问题。
步骤S150,基于所述请求消息获取可用许可,根据所述可用许可调用下游服务。
具体地,根据Redis双端队列的出口端获取到的请求消息获取可用许可;根据获取到的可用许可调用下游服务。
更为具体地,根据Redis双端队列的出口端获取到的请求消息获取可用许可,如果获取可用许可成功,则根据获取到的可用许可调用下游服务,并继续处理下一条请求消息;如果获取可用许可失败,则说明当前流量仍处在峰值范围,自旋等待后再次获取可用许可,直到可用许可获取成功后,继续处理下一条请求消息。
本实施例通过上述方案,具体通过接收用户发送的请求消息;根据所述用户的身份标识判断所述请求消息是否需要限流;若所述请求消息需要限流,则向Redis双端队列的入口端加入所述请求消息;在处理所述请求消息时,从所述Redis双端队列的出口端获取所述请求消息;基于所述请求消息获取可用许可,根据所述可用许可调用下游服务。通过根据用户的身份标识判断请求消息是否需要限流,将需要限流的请求消息存储在Redis双端队列中,实现了分布式场景下的限流功能;通过使用Redis双端队列来存放需要限流的请求消息,能实现极大的存储空间,同时也能支持限流后请求消息的顺序重放,防止消息顺序错乱带来的客户满意度问题。
进一步地,参照图3,图3为本申请分布式限流方法第二示例性实施例的流程示意图。基于上述图2所示的实施例,在本实施例中,上述步骤S120,根据所述用户的身份标识判断所述请求消息是否需要限流可以包括:
步骤S121,确定所述用户的身份标识是否存在于所述Redis双端队列中。
具体地,在接收到用户发送的请求消息后,确定该用户的身份标识是否存在于Redis双端队列中;也即,确定在接收到该用户发送的当前请求消息之前,Redis双端队列中是否已加入该用户之前发送的其他请求消息。
步骤S122,若所述身份标识存在于所述Redis双端队列中,则判定所述请求消息需要限流。
具体地,在确定该用户的身份标识存在于Redis双端队列的情况下,也即表明在接收到该用户发送的当前请求消息之前,Redis双端队列中已加入该用户发送的其他请求消息,为确保同一用户发送的请求消息可以按顺序处理,则判定当前接收到的请求消息需要限流,以便将当前接收到的请求消息加入Redis双端队列中等待调度处理。
本实施例通过确定所述用户的身份标识是否存在于所述Redis双端队列中;若所述身份标识存在于所述Redis双端队列中,则判定所述请求消息需要限流,确保了同一用户发送的请求消息可以按顺序处理,避免消息顺序错乱带来的客户满意度问题。
进一步地,在一实施例中,上述步骤S121之后还可以包括:
步骤S123,若所述身份标识不存在于所述Redis双端队列中,则确定当前流量是否达到当前限流阈值;
步骤S124,在当前流量达到当前限流阈值的情况下,判定所述请求消息需要限流,并将所述身份标识与所述请求消息关联存储于所述Redis双端队列中。
具体地,在确定该用户的身份标识不存在于Redis双端队列的情况下,也即表明在接收到该用户发送的当前请求消息之前,在Redis双端队列中未加入该用户发送的其他请求消息,或者在Redis双端队列中存储的该用户之前发送的其他请求消息已经被消费完成,此时,进一步确定当前流量是否达到当前限流阈值。
在当前流量达到当前限流阈值的情况下,判定当前接收到的请求消息需要限流,此时,将该用户的身份标识与请求消息进行关联,一起加入Redis双端队列的入口端以便暂时存储于Redis双端队列中。
可选地,在当前流量未达到当前限流阈值的情况下,判定所述请求消息不需要限流。
本实施例通过在身份标识不存在于Redis双端队列的情况下,确定当前流量是否达到当前限流阈值;在当前流量达到当前限流阈值的情况下,判定所述请求消息需要限流,并将所述身份标识与所述请求消息关联存储于所述Redis双端队列中,可以进一步基于当前流量情况判定请求消息是否需要限流,避免下游可能出现的堵塞、故障问题。
进一步地,参照图4,图4为本申请分布式限流方法第三示例性实施例的流程示意图。基于上述图2或图3所示的实施例,在上述步骤S120,根据所述用户的身份标识判断所述请求消息是否需要限流之后,还可以包括:
步骤S200,若所述请求消息不需要限流,则执行步骤:基于所述请求消息获取可用许可,根据所述可用许可调用下游服务。
具体地,在判定用户的请求消息不需要限流的情况下,根据接收到的用户发送的请求消息获取可用许可;根据获取到的可用许可调用下游服务,比如下游业务组件。其中,下游业务组件是接收该用户发送的请求消息的最终处理服务,是一个重要的基础组件。
更为具体地,根据接收到的用户发送的请求消息获取可用许可,如果获取可用许可成功,则根据获取到的可用许可调用下游服务,并继续处理下一条请求消息;如果获取可用许可失败,则将请求消息加入Redis双端队列中,自旋等待后再次获取可用许可,直到可用许可获取成功后,继续处理下一条请求消息。
在本实施例中,上述获取可用许可的步骤包括:
步骤S201,增加Redis的Lua脚本中的计数;
步骤S202,判断自增后的计数是否超过所述当前限流阈值;
步骤S203,若所述自增后的计数未超过所述当前限流阈值,则获取可用许可并生成对应的执行返回值,将所述自增后的计数更新到Redis中。
具体地,本实施例采用Redis+Lua脚本来实现计数器限流方案,该方案中所有实例使用Redis中同一个计数器,因此应用中的最大流量可以使用设定的当前限流阈值进行约束。预先将设定的当前限流阈值配置在Redis缓存中,以便根据实际情况进行动态调整。
本实施例方案在获取可用许可时,调用并执行Redis的Lua脚本,具体包括:在Lua脚本的原有计数的基础上自行增加计数。判断增加后的计数是否超过当前限流阈值,在增加后的计数没有超过当前限流阈值的情况下,基于请求消息获取对应的可用许可,并生成对应的执行返回值。同时,将增加后的计数更新到Redis中,以便下次获取可用许可时使用。
比如,判断当前计数+1后是否超过限流阈值,如果超过则生成执行返回值0并返回;如果不超过则把当前计数+1后更新到Redis中,以便下次使用,然后生成执行返回值1并返回。
可选地,在一实施例中,上述步骤S202之后还可以包括:
步骤S204,若所述增加后的计数超过所述当前限流阈值,则执行向Redis双端队列的入口端加入所述请求消息及之后的步骤。
具体地,在增加后的计数超过当前限流阈值的情况下,向Redis双端队列的入口端加入所述请求消息;在处理所述请求消息时,从所述Redis双端队列的出口端获取所述请求消息;基于所述请求消息获取可用许可,根据所述可用许可调用下游服务。
本实施例通过在分布式应用多实例下共享同一个计数器,采用Redis+Lua脚本来获取可用许可,根据可用许可调用下游服务,实现了分布式场景下的计数器限流功能。
进一步地,参照图5,图5为本申请分布式限流方法第四示例性实施例的流程示意图。基于上述所示的实施例,在本实施例中,在步骤S110,接收用户发送的请求消息之前,所述分布式限流方法还可以包括:
步骤S101,获取预设时间范围内的接口平均响应时间。
需要说明的是,在现有技术中,RateLimiter令牌桶算法的应用实例数会直接影响限流的令牌桶总数,由于每个实例流量不能完全一致,所以容易导致流量大的实例启动限流,而流量小的实例还有较大富余资源的情况,因此难以实现自适应限流效果。而在Alibaba Sentinel框架中,其需要引入额外的依赖服务,而且限流的阈值在设定后不能根据下游响应时间来动态调整,因此同样无法满足限流的自适应情况。
因此,针对现有技术难以实现分布式场景下的自适应限流问题,本实施例方案设计了一种满足自适应限流及保障请求消息顺序恢复的解决方案。
具体地,本实施例方案首先获取预设时间范围内的接口平均响应时间。其中,该接口平均响应时间可以是预先采集的任意时间段内的接口平均响应时间;还可以是设定定时间隔,基于定时间隔循环采集到的接口平均响应时间;还可以是在接收到用户发送的请求消息时,基于请求消息的接收时刻获取到的该接收时刻前几分钟内的接口平均响应时间。
步骤S102,将所述接口平均响应时间与预设时间值进行比较;
步骤S103,若所述接口平均响应时间大于所述预设时间值,则发送告警信息并根据预设比例降低所述当前限流阈值。
具体地,将获取到的接口平均响应时间与预设时间值进行比较。在接口平均响应时间大于预设时间值的情况下,发送告警信息以提醒管理人员,并根据预设比例降低当前限流阈值,减少流量高峰带来的响应(发送)时间变长甚至拥堵失败的情况。
进一步地,以当前限流阈值的调整时间开始,继续统计后续预设时间范围内的接口平均响应时间,基于统计到的接口平均响应时间、预设时间值和预设比例调整限流阈值,直到接口平均响应时间小于预设时间值。
本实施例方案通过根据接口平均响应时间,动态调整当前限流阈值以适应下游服务带宽的波动性,可以在一定范围内自动调整流量应对冲击;同时,当冲击缓解后支持限流过程中消息的顺序重放,增强了客户体验。
步骤S104,若所述接口平均响应时间小于所述预设时间值,则确定所述当前限流阈值是否达到预设最大值;
步骤S105,若所述当前限流阈值未达到所述预设最大值,则增加所述当前限流阈值。
具体地,在接口平均响应时间大于预设时间值的情况下,对比当前限流阈值与预设最大值,确定当前限流阈值是否达到预设最大值。在当前限流阈值未达到预设最大值的情况下,增加当前限流阈值,以提高带宽利用率。
在本实施例中,以步骤S101-S105在步骤S110之前实施;在其他实施例中,步骤S101-S105也可以在步骤S110与步骤S120之间实施。
本实施例通过上述方案,通过在接口平均响应时间大于预设时间值时,根据预设比例降低当前限流阈值,可以实现从上游端对下游服务做出主动保护,降低对下游服务的冲击。通过在接口平均响应时间小于预设时间值时,增加当前限流阈值,实现了提高带宽利用率的效果。
进一步地,参照图6,图6为本申请分布式限流方法第五示例性实施例的流程示意图。基于上述所示的实施例,在本实施例中,上述向Redis双端队列的入口端加入所述请求消息的步骤可以包括:
步骤S131,通过Redis的Lpush命令向所述Redis双端队列的入口端加入所述请求消息,其中,所述请求消息为首次被限流的请求消息。
具体地,在判定请求消息需要限流的情况下,通过Redis的Lpush命令向Redis双端队列的入口端加入首次被限流的请求消息。其中,首次被限流的请求消息是指在接收到用户发送的请求消息后,首次将该请求消息加入Redis双端队列中。
上述从所述Redis双端队列的出口端获取所述请求消息的步骤可以包括:
步骤S141,通过Redis的Rpop命令从所述Redis双端队列的出口端获取所述请求消息。
具体地,在处理该用户发送的请求消息时,通过Redis的Rpop命令从Redis双端队列的出口端处获取该用户发送的请求消息。进一步地,在获取到该用户发送的请求消息之后,将与该请求消息关联保存的身份标识从Redis双端队列中删除。
进一步地,在上述基于所述请求消息获取可用许可的步骤之后,还可以包括:
步骤S151,确定所述可用许可是否获取成功;
步骤S152,若所述可用许可获取成功,则执行步骤:根据所述可用许可调用下游服务;
步骤S153,若所述可用许可获取失败,则通过Redis的Rpush命令向所述Redis双端队列的出口端加入所述请求消息。
具体地,在根据Redis双端队列的出口端弹出的请求消息获取可用许可后,确定该可用许可是否获取成功。在可用许可获取成功的情况下,根据获取到的可用许可调用下游服务。
为保证消费消息的顺序性,在可用许可获取失败的情况下,通过Redis的Rpush命令向Redis双端队列的出口端加入该获取可用许可失败的请求消息,以确保Redis双端队列中下一次消费的请求消息仍是该获取可用许可失败的请求消息,解决消息重放的顺序性问题。
进一步地,在可用许可获取失败的情况下,说明当前流量仍处在峰值范围,通过Redis的Rpush命令向Redis双端队列的出口端加入该获取可用许可失败的请求消息,等待再次获取可用许可。若连续获取许可失败次数超过预设值,则将该请求消息从出口端返回Redis双端队列,等待预设的更长的时间段后,继续尝试获取可用许可。基于上述方案,在实现限流的同时,保证了消费消息的顺序性。
此外,本申请实施例还提出一种分布式限流装置,所述分布式限流装置包括:
接收模块,用于接收用户发送的请求消息;
判断模块,用于根据所述用户的身份标识判断所述请求消息是否需要限流;
消息加入模块,用于若所述请求消息需要限流,则向远程字典服务Redis双端队列的入口端加入所述请求消息;
消息获取模块,用于在处理所述请求消息时,从所述Redis双端队列的出口端获取所述请求消息;
调用模块,用于基于所述请求消息获取可用许可,根据所述可用许可调用下游服务。
本实施例实现分布式限流的原理及实施过程,请参照上述各实施例,在此不再一一赘述。
此外,本申请实施例还提出一种分布式限流设备,所述分布式限流设备包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的分布式限流程序,所述分布式限流程序被所述处理器执行时实现如上所述的分布式限流方法的步骤。
由于本分布式限流程序被处理器执行时,采用了前述所有实施例的全部技术方案,因此至少具有前述所有实施例的全部技术方案所带来的所有有益效果,在此不再一一赘述。
此外,本申请实施例还提出一种计算机可读存储介质,所述计算机可读存储介质上存储有分布式限流程序,所述分布式限流程序被处理器执行时实现如上所述的分布式限流方法的步骤。
由于本分布式限流程序被处理器执行时,采用了前述所有实施例的全部技术方案,因此至少具有前述所有实施例的全部技术方案所带来的所有有益效果,在此不再一一赘述。
相比现有技术,本申请实施例提出的分布式限流方法、装置、设备以及存储介质,通过接收用户发送的请求消息;根据所述用户的身份标识判断所述请求消息是否需要限流;若所述请求消息需要限流,则向Redis双端队列的入口端加入所述请求消息;在处理所述请求消息时,从所述Redis双端队列的出口端获取所述请求消息;基于所述请求消息获取可用许可,根据所述可用许可调用下游服务。通过根据用户的身份标识判断请求消息是否需要限流,将需要限流的请求消息存储在Redis双端队列中,实现了分布式场景下的限流功能;通过使用Redis双端队列来存放需要限流的请求消息,能实现极大的存储空间,同时也能支持限流后请求消息的顺序重放,防止消息顺序错乱带来的客户满意度问题。
需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者系统不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者系统所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者系统中还存在另外的相同要素。
上述本申请实施例序号仅仅为了描述,不代表实施例的优劣。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在如上的一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,被控终端,或者网络设备等)执行本申请每个实施例的方法。
以上仅为本申请的优选实施例,并非因此限制本申请的专利范围,凡是利用本申请说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本申请的专利保护范围内。
Claims (10)
1.一种分布式限流方法,其特征在于,所述分布式限流方法包括:
接收用户发送的请求消息;
根据所述用户的身份标识判断所述请求消息是否需要限流;
若所述请求消息需要限流,则向远程字典服务Redis双端队列的入口端加入所述请求消息;
在处理所述请求消息时,从所述Redis双端队列的出口端获取所述请求消息;
基于所述请求消息获取可用许可,根据所述可用许可调用下游服务。
2.根据权利要求1所述的分布式限流方法,其特征在于,所述根据所述用户的身份标识判断所述请求消息是否需要限流的步骤包括:
确定所述用户的身份标识是否存在于所述Redis双端队列中;
若所述身份标识存在于所述Redis双端队列中,则判定所述请求消息需要限流。
3.根据权利要求2所述的分布式限流方法,其特征在于,所述确定所述用户的身份标识是否存在于所述Redis双端队列中的步骤之后,还包括:
若所述身份标识不存在于所述Redis双端队列中,则确定当前流量是否达到当前限流阈值;
在当前流量达到当前限流阈值的情况下,判定所述请求消息需要限流,并将所述身份标识与所述请求消息关联存储于所述Redis双端队列中。
4.根据权利要求1所述的分布式限流方法,其特征在于,所述根据所述用户的身份标识判断所述请求消息是否需要限流的步骤之后,还包括:
若所述请求消息不需要限流,则执行步骤:基于所述请求消息获取可用许可,根据所述可用许可调用下游服务;
其中,获取可用许可的步骤包括:
增加Redis的Lua脚本中的计数;
判断增加后的计数是否超过当前限流阈值;
若所述增加后的计数未超过所述当前限流阈值,则获取可用许可并生成对应的执行返回值,将所述增加后的计数更新到Redis中。
5.根据权利要求1所述的分布式限流方法,其特征在于,所述接收用户发送的请求消息的步骤之前,还包括:
获取预设时间范围内的接口平均响应时间;
将所述接口平均响应时间与预设时间值进行比较;
若所述接口平均响应时间大于所述预设时间值,则发送告警信息并根据预设比例降低当前限流阈值;
若所述接口平均响应时间小于所述预设时间值,则确定所述当前限流阈值是否达到预设最大值;
若所述当前限流阈值未达到所述预设最大值,则增加所述当前限流阈值。
6.根据权利要求1-5中任意一项所述的分布式限流方法,其特征在于,向Redis双端队列的入口端加入所述请求消息的步骤包括:
通过Redis的Lpush命令向所述Redis双端队列的入口端加入所述请求消息,其中,所述请求消息为首次被限流的请求消息;
从所述Redis双端队列的出口端获取所述请求消息的步骤包括:
通过Redis的Rpop命令从所述Redis双端队列的出口端获取所述请求消息。
7.根据权利要求6所述的分布式限流方法,其特征在于,所述基于所述请求消息获取可用许可的步骤之后,还包括:
确定所述可用许可是否获取成功;
若所述可用许可获取成功,则执行步骤:根据所述可用许可调用下游服务;
若所述可用许可获取失败,则通过Redis的Rpush命令向所述Redis双端队列的出口端加入所述请求消息。
8.一种分布式限流装置,其特征在于,所述分布式限流装置包括:
接收模块,用于接收用户发送的请求消息;
判断模块,用于根据所述用户的身份标识判断所述请求消息是否需要限流;
消息加入模块,用于若所述请求消息需要限流,则向远程字典服务Redis双端队列的入口端加入所述请求消息;
消息获取模块,用于在处理所述请求消息时,从所述Redis双端队列的出口端获取所述请求消息;
调用模块,用于基于所述请求消息获取可用许可,根据所述可用许可调用下游服务。
9.一种分布式限流设备,其特征在于,所述终端设备包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的分布式限流程序,所述分布式限流程序被所述处理器执行时实现如权利要求1-7中任一项所述的分布式限流方法的步骤。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有分布式限流程序,所述分布式限流程序被处理器执行时实现如权利要求1-7中任一项所述的分布式限流方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311580575.0A CN117499311A (zh) | 2023-11-22 | 2023-11-22 | 分布式限流方法、装置、设备以及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311580575.0A CN117499311A (zh) | 2023-11-22 | 2023-11-22 | 分布式限流方法、装置、设备以及存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN117499311A true CN117499311A (zh) | 2024-02-02 |
Family
ID=89676199
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311580575.0A Pending CN117499311A (zh) | 2023-11-22 | 2023-11-22 | 分布式限流方法、装置、设备以及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117499311A (zh) |
-
2023
- 2023-11-22 CN CN202311580575.0A patent/CN117499311A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11711442B2 (en) | Push notification delivery system | |
CN109684358B (zh) | 数据查询的方法和装置 | |
KR101670642B1 (ko) | 클라이언트 디바이스 상에서의 패킷 송신을 스케줄링하기 위한 시스템 및 방법 | |
CN109743358B (zh) | 异步消息接口熔断控制方法、装置、计算机设备及存储介质 | |
US8666940B2 (en) | Method and apparatus for communicating data between computer devices | |
US20030158883A1 (en) | Message processing | |
CN111753065A (zh) | 请求响应方法、系统、计算机系统和可读存储介质 | |
US20140092737A1 (en) | Traffic control method and traffic control apparatus | |
WO2023279896A1 (zh) | 消息处理方法、电子设备及存储介质 | |
CN117499311A (zh) | 分布式限流方法、装置、设备以及存储介质 | |
CN110275780B (zh) | 用于限制流量的方法和装置 | |
CN114374657A (zh) | 一种数据处理方法和装置 | |
CN112312165A (zh) | 视频下发方法、装置及计算机可读存储介质 | |
KR101029788B1 (ko) | 미들웨어의 레이어 간 메시지 전달 방법 및 이를 행하는 프로그램을 기록한 컴퓨터로 읽을 수 있는 매체 | |
CN113141319B (zh) | 消息处理方法、装置、电子设备及存储介质 | |
WO2024046303A1 (zh) | 访问请求处理方法、装置及系统 | |
US20230362856A1 (en) | Data transmission method, data transmission apparatus, computer-readable medium, and electronic device | |
US20230045030A1 (en) | User service processing method, system, and related device | |
CN115981731A (zh) | 适用于密码卡异步接口的轮询方法、代理和介质 | |
CN116915606A (zh) | 一种熔断方法、装置、电子设备和存储介质 | |
CN110839113B (zh) | 虚假来电号码识别方法及装置 | |
CN116545926A (zh) | 一种系统限流方法、装置、电子设备及存储介质 | |
JP4153196B2 (ja) | データベースアクセス制御方法及びデータベースアクセス制御装置 | |
CN115357363A (zh) | 限流方法、装置、任务响应系统、电子设备及存储介质 | |
CN115733804A (zh) | 一种控制网络访问的方法、装置及可读存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |