基于Redis的流量控制方法、装置、电子设备及存储介质转让专利

申请号 : CN202210656437.5

文献号 : CN114915593B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 苏珂任亚军

申请人 : 北京世纪好未来教育科技有限公司

摘要 :

本公开提供一种基于Redis的流量控制方法、装置、电子设备及存储介质,方法包括:根据接收的业务请求,确定业务请求对应的用户标识和接口标识;确定用户标识对应的目标用户的流量限值;在流量限值大于预设流量阈值时获取与接口标识对应的目标接口的请求计数器的计数值;根据计数值和缓存服务中间件的集群分片数,确定分片索引;从与分片索引对应的第一Redis分片中获取剩余令牌数和请求执行时间进行令牌桶限流计算,在根据计算结果确定从令牌桶中获取到令牌的情况下,向后转发业务请求。本方案可以使得同一用户标识及同一接口标识下的请求计算被均衡分配到Redis中的各个分片上,实现各分片CPU的负载均衡,从而有效避免单分片计算资源耗尽的问题。

权利要求 :

1.一种基于Redis的流量控制方法,所述方法包括:根据接收的业务请求,确定所述业务请求对应的用户标识和接口标识;

根据所述用户标识,确定所述用户标识对应的目标用户的流量限值;

在所述流量限值大于预设流量阈值的情况下,获取与所述接口标识对应的目标接口的请求计数器的计数值;

根据所述计数值和缓存服务中间件的集群分片数,确定分片索引;

从与所述分片索引对应的第一Redis分片中获取剩余令牌数和请求执行时间进行令牌桶限流计算,并获取返回结果;

在根据所述返回结果确定从令牌桶中获取到令牌的情况下,将所述业务请求转发给所述目标接口下的服务实例进行执行。

2.如权利要求1所述的基于Redis的流量控制方法,其中,所述方法还包括:将所述请求计数器的计数值累加1。

3.如权利要求1所述的基于Redis的流量控制方法,其中,进行令牌桶限流计算时所需的与所述第一Redis分片对应的分片令牌桶容量和分片令牌桶填充速率,与所述集群分片数成反比。

4.如权利要求3所述的基于Redis的流量控制方法,其中,所述分片令牌桶容量为:rate’=rate/slices;

所述分片令牌桶填充速率为:

capacity’=capacity/slices;

其中,所述rate’表示所述分片令牌桶填充速率,capacity’表示所述令牌桶容量,所述rate表示所述缓存服务中间件对应的令牌桶填充速率,所述capacity表示所述缓存服务中间件对应的令牌桶总容量,所述slices表示所述缓存服务中间件的集群分片数。

5.如权利要求1‑4任一项所述的基于Redis的流量控制方法,其中,所述根据所述计数值和缓存服务中间件的集群分片数,确定分片索引,包括:根据所述计数值确定第一运算参数;

根据所述缓存服务中间件的集群分片数确定第二运算参数;

对所述第一运算参数和所述第二运算参数进行与运算,并获取运算结果;

将所述运算结果确定为所述分片索引。

6.如权利要求5所述的基于Redis的流量控制方法,其中,所述根据所述计数值确定第一运算参数,包括:在所述计数值大于所述集群分片数的情况下,获取所述计数值除以所述集群分片数的余数;

将所述余数确定为所述第一运算参数。

7.如权利要求1‑4任一项所述的基于Redis的流量控制方法,其中,所述方法还包括:在所述流量限值小于等于所述预设流量阈值的情况下,根据所述用户标识和所述接口标识确定对应的第二Redis分片;

从所述第二Redis分片中获取剩余令牌数和请求执行时间进行令牌桶限流计算,并获取返回结果。

8.一种基于Redis的流量控制装置,包括:第一确定模块,用于根据接收的业务请求,确定所述业务请求对应的用户标识和接口标识;

第二确定模块,用于根据所述用户标识,确定所述用户标识对应的目标用户的流量限值;

第一获取模块,用于在所述流量限值大于预设流量阈值的情况下,获取与所述接口标识对应的目标接口的请求计数器的计数值;

第三确定模块,用于根据所述计数值和缓存服务中间件的集群分片数,确定分片索引;

第二获取模块,用于从与所述分片索引对应的第一Redis分片中获取剩余令牌数和请求执行时间进行令牌桶限流计算,并获取返回结果;

发送模块,用于在根据所述返回结果确定从令牌桶中获取到令牌的情况下,将所述业务请求转发给所述目标接口下的服务实例进行执行。

9.一种电子设备,包括:

处理器;以及

存储程序的存储器,

其中,所述程序包括指令,所述指令在由所述处理器执行时使所述处理器执行根据权利要求1‑7中任一项所述的基于Redis的流量控制方法。

10.一种存储有计算机指令的非瞬时计算机可读存储介质,其中,所述计算机指令用于使所述计算机执行根据权利要求1‑7中任一项所述的基于Redis的流量控制方法。

说明书 :

基于Redis的流量控制方法、装置、电子设备及存储介质

技术领域

[0001] 本公开涉及流量管理技术领域,尤其涉及一种基于Redis的流量控制方法、装置、电子设备及存储介质。

背景技术

[0002] 缓存服务中间件Redis是分布式系统和微服务容器系统中的重要组成部分,很多系统利用Redis的内存高吞吐特性来做全局流量控制等核心业务功能,有效的流控措施对保障系统平台的稳定运行起到了至关重要的作用。
[0003] 目前,常用的流控措施是基于Redis的令牌桶流控算法,能够在限制调用的平均速率的同时还允许一定程度的突发调用。然而,基于Redis实现令牌桶算法时,由于大型系统的高并发大流量特性,需要使用集群版多分片的Redis,在此基础上,在单一用户接口的超高并发流量场景下,容易导致单分片计算资源耗尽的问题,从而使得整个Redis不可用。

发明内容

[0004] 为了解决上述技术问题或者至少部分地解决上述技术问题,本公开实施例提供了一种基于Redis的流量控制方法、装置、电子设备及存储介质。
[0005] 根据本公开的一方面,提供了一种基于Redis的流量控制方法,包括:
[0006] 根据接收的业务请求,确定所述业务请求对应的用户标识和接口标识;
[0007] 根据所述用户标识,确定所述用户标识对应的目标用户的流量限值;
[0008] 在所述流量限值大于预设流量阈值的情况下,获取与所述接口标识对应的目标接口的请求计数器的计数值;
[0009] 根据所述计数值和缓存服务中间件的集群分片数,确定分片索引;
[0010] 从与所述分片索引对应的第一Redis分片中获取剩余令牌数和请求执行时间进行令牌桶限流计算,并获取返回结果;
[0011] 在根据所述返回结果确定从令牌桶中获取到令牌的情况下,将所述业务请求转发给所述目标接口下的服务实例进行执行。
[0012] 根据本公开的另一方面,提供了一种基于Redis的流量控制装置,包括:
[0013] 第一确定模块,用于根据接收的业务请求,确定所述业务请求对应的用户标识和接口标识;
[0014] 第二确定模块,用于根据所述用户标识,确定所述用户标识对应的目标用户的流量限值;
[0015] 第一获取模块,用于在所述流量限值大于预设流量阈值的情况下,获取与所述接口标识对应的目标接口的请求计数器的计数值;
[0016] 第三确定模块,用于根据所述计数值和缓存服务中间件的集群分片数,确定分片索引;
[0017] 第二获取模块,用于从与所述分片索引对应的第一Redis分片中获取剩余令牌数和请求执行时间进行令牌桶限流计算,并获取返回结果;
[0018] 发送模块,用于在根据所述返回结果确定从令牌桶中获取到令牌的情况下,将所述业务请求转发给所述目标接口下的服务实例进行执行。
[0019] 根据本公开的另一方面,提供了一种电子设备,包括:
[0020] 处理器;以及
[0021] 存储程序的存储器,
[0022] 其中,所述程序包括指令,所述指令在由所述处理器执行时使所述处理器执行根据前述一方面所述的基于Redis的流量控制方法。
[0023] 根据本公开的另一方面,提供了一种存储有计算机指令的非瞬时计算机可读存储介质,其中,所述计算机指令用于使所述计算机执行根据前述一方面所述的基于Redis的流量控制方法。
[0024] 根据本公开的另一方面,提供了一种计算机程序产品,包括计算机程序,其中,所述计算机程序在被处理器执行时实现前述一方面所述的基于Redis的流量控制方法。
[0025] 本公开实施例中提供的一个或多个技术方案,通过在用户的流量限值大于预设流量阈值的情况下,根据目标接口的请求计数器的计数值和Redis的集群分片数确定分片索引,进而从分片索引对应的Redis分片中获取相关参数进行令牌桶限流计算,由于用于计算分片索引的计数值是变化的,从而计算得到的分片索引也是变化的,使得同一用户标识及同一接口标识下的请求计算被均衡分配到Redis中的各个分片上,实现了各分片CPU的负载均衡,从而有效避免了单分片计算资源耗尽的问题,保证了Redis的可用性。

附图说明

[0026] 在下面结合附图对于示例性实施例的描述中,本公开的更多细节、特征和优点被公开,在附图中:
[0027] 图1示出了服务请求处理的主流程示意图;
[0028] 图2示出了令牌桶算法的流程示意图;
[0029] 图3示出了根据本公开一示例性实施例的基于Redis的流量控制方法的流程图;
[0030] 图4示出了根据本公开另一示例性实施例的基于Redis的流量控制方法的流程图;
[0031] 图5示出了根据本公开示例性实施例的基于Redis的流量控制装置的示意性框图;
[0032] 图6示出了能够用于实现本公开的实施例的示例性电子设备的结构框图。

具体实施方式

[0033] 下面将参照附图更详细地描述本公开的实施例。虽然附图中显示了本公开的某些实施例,然而应当理解的是,本公开可以通过各种形式来实现,而且不应该被解释为限于这里阐述的实施例,相反提供这些实施例是为了更加透彻和完整地理解本公开。应当理解的是,本公开的附图及实施例仅用于示例性作用,并非用于限制本公开的保护范围。
[0034] 应当理解,本公开的方法实施方式中记载的各个步骤可以按照不同的顺序执行,和/或并行执行。此外,方法实施方式可以包括附加的步骤和/或省略执行示出的步骤。本公开的范围在此方面不受限制。
[0035] 本文使用的术语“包括”及其变形是开放性包括,即“包括但不限于”。术语“基于”是“至少部分地基于”。术语“一个实施例”表示“至少一个实施例”;术语“另一实施例”表示“至少一个另外的实施例”;术语“一些实施例”表示“至少一些实施例”。其他术语的相关定义将在下文描述中给出。需要注意,本公开中提及的“第一”、“第二”等概念仅用于对不同的装置、模块或单元进行区分,并非用于限定这些装置、模块或单元所执行的功能的顺序或者相互依存关系。
[0036] 需要注意,本公开中提及的“一个”、“多个”的修饰是示意性而非限制性的,本领域技术人员应当理解,除非在上下文另有明确指出,否则应该理解为“一个或多个”。
[0037] 本公开实施方式中的多个装置之间所交互的消息或者信息的名称仅用于说明性的目的,而并不是用于对这些消息或信息的范围进行限制。
[0038] 以下参照附图描述本公开提供的基于Redis的流量控制方法、装置、电子设备及存储介质。
[0039] Redis一直是分布式系统或者微服务容器系统中重要的组成部分,很多系统都在利用Redis的内存高吞吐特性来做全局流量控制(简称限流)等核心业务功能,限流一般包含针对请求调用的QPS(Queries Per Second,每秒查询速率,也就是每秒请求速率)、调用次数限制,在高并发场景下,尤其是针对QPS有效的流控措施对保障系统平台的稳定运行起到了至关重要的作用。
[0040] 图1示出了服务请求处理的主流程示意图,如图1所示,进入PaaS平台的外部请求首先经过路由网关(API Gateway),路由网关内部的限流模块依赖Redis进行全局集中式的流速计算,当流量低于流量QPS限制时,路由网关会将请求向后转发给业务服务进行处理;当流量超过流量QPS限制时,路由网关会将请求返回,拒绝处理。
[0041] 目前,路由网关内的限流模块使用令牌桶算法进行流量控制,令牌桶算法是目前较为常用的流控措施,是对漏桶算法的改进,令牌桶算法能够在限制调用的平均速率的同时还允许一定程度的突发调用。图2示出了令牌桶算法的流程示意图,如图2所示,利用令牌桶算法限流的主要思想就是在令牌桶算法中,存在一个桶,用来存放固定数量的令牌。算法中存在一种机制,以一定的速率往桶中放令牌。每次请求调用需要先获取令牌,只有拿到令牌,才有机会继续执行,否则直接拒绝。放令牌这个动作是持续不断的进行,如果桶中令牌数达到上限,就丢弃令牌或者等待,所以就存在这种情况,桶中一直有大量的可用令牌,这时进来的请求就可以直接拿到令牌执行,比如设置QPS为100,那么限流器初始化完成一秒后,桶中就已经有100个令牌了,这时服务还没完全启动好,等启动完成对外提供服务时,该限流器可以抵挡瞬时的100个请求。所以,只有桶中没有令牌时,请求才会进行等待或者拒绝,相当于以一定的速率执行。
[0042] 然而,基于Redis实现令牌桶算法时,由于大型系统的高并发大流量特性,单机版Redis无法支持业务需求,都会使用集群版多分片的Redis,在此基础上,在单一用户接口的超高并发流量场景下,容易导致单分片计算资源耗尽的问题,造成Redis分片CPU热点问题,从而使得整个Redis不可用。
[0043] 针对上述问题,本公开提供了一种基于Redis的流量控制方法,通过在用户的流量限值大于预设流量阈值的情况下,根据目标接口的请求计数器的计数值和Redis的集群分片数确定分片索引,进而从分片索引对应的Redis分片中获取相关参数进行令牌桶限流计算,由于用于计算分片索引的计数值是变化的,从而计算得到的分片索引也是变化的,使得同一用户标识及同一接口标识下的请求计算被均衡分配到Redis中的各个分片上,实现了各分片CPU的负载均衡,从而有效避免了单分片计算资源耗尽的问题,保证了Redis的可用性。在本公开的方案中,并不需要真的建立一个放入令牌的线程来做这个放入令牌的工作,而是使用和上面类似的算法,在请求到来的时候,根据上次剩余的令牌数和上次请求之后流逝的时间,计算当前桶内是否还有完整的一张令牌,如果没有令牌,则拒绝请求,否则放行请求。
[0044] 图3示出了根据本公开一示例性实施例的基于Redis的流量控制方法的流程图,该方法可以由基于Redis的流量控制装置执行,其中该装置可以采用软件和/或硬件实现,一般可集成在电子设备中,所述电子设备中可以部署PaaS平台,所述PaaS平台包括服务注册中心、路由网关等多个组成部分,本公开实施例的基于Redis的流量控制方法具体可以应用于所述路由网关中,更具体地,可以由所述路由网关内部的限流模块执行,所述限流模块依赖Redis进行全局集中式的流速计算。
[0045] 如图3所示,该基于Redis的流量控制方法可以包括以下步骤:
[0046] 步骤101,根据接收的业务请求,确定所述业务请求对应的用户标识和接口标识。
[0047] 实际应用中,当用户需要在PaaS平台上调用业务接口时,用户需要先在平台上做关联,即在用户下创建应用APP,用户对应唯一的用户标识,且应用APP对应唯一的应用标识,从而使得用户标识与应用标识进行关联,通过创建的应用APP绑定需要调用的业务接口,使得应用标识和接口标识关联,从而实现了应用标识、用户标识和接口标识之间的关联。能够理解的是,本公开实施例的用户指的是具有开发能力进行应用开发的个人或企业。
[0048] 本公开实施例中,业务请求中携带应用标识(即应用ID),根据业务请求中携带的应用标识,查询预先建立的应用标识、用户标识和接口标识之间的关联关系,可以确定与应用标识对应的用户标识和接口标识。
[0049] 另外,业务请求可以是统一资源定位符(Uniform Resource Locator,URL),URL到来时携带需要调用的服务对应的服务接口地址,根据该服务接口地址可以确定对应的目标接口,进而获取该目标接口的接口标识。因此,本公开实施例中,也可以根据URL确定对应的接口标识,根据业务请求中携带的应用标识确定对应的用户标识。
[0050] 能够理解的是,实际应用中,用户对业务接口调用管理平台PaaS发起的业务请求都会统一经过平台的路由网关,由路由网关根据提前配置好的服务接口与服务实例的路由映射关系,将业务请求转发到后端的服务实例上,完成业务流量的分配。其中,在分配之前,路由网关的限流模块需要依据预设的流量控制策略进行限流计算,在计算结果为允许放行该业务请求时,路由网关才将业务请求向后转发,否则,路由网关丢弃该业务请求。
[0051] 步骤102,根据所述用户标识,确定所述用户标识对应的目标用户的流量限值。
[0052] 其中,流量限值是PaaS平台为用户设置的最大流量,用户下的各个服务接口允许通过的最大流量均不得超过该流量限值。
[0053] 本公开实施例中,不同用户在PaaS平台上注册应用APP时,PaaS平台为各个用户设置对应的流量限值,使得用户需要调用的各个服务接口允许通过的最大流量均不得超过对应的流量限值,并建立用户的用户标识与流量限值之间的对应关系表并存储在本地。路由网关确定了用户标识之后,可以根据该用户标识,查询预先建立的对应关系表,确定与用户标识对应的流量限值,即为与用户标识对应的目标用户的流量限值。
[0054] 步骤103,在所述流量限值大于预设流量阈值的情况下,获取与所述接口标识对应的目标接口的请求计数器的计数值。
[0055] 其中,预设流量阈值可以根据实际需求或者实验测试结果预先设定,本公开对预设流量阈值的取值不作限制。
[0056] 本公开实施例中,确定了用户标识对应的目标用户的流量限值之后,可以将确定的流量限值与预设流量阈值进行比较,如果流量限值大于预设流量阈值,则获取与接口标识对应的目标接口的请求计数器的计数值。
[0057] 其中,本公开实施例中,为PaaS平台上的每个业务接口都创建一个对应的请求计数器(counter),请求计数器用于统计调用对应业务接口的业务请求的数量,可以在每次接收到需要调用某个业务接口的请求时,将对应业务接口的请求计数器累加1,或者,也可以在将接收的业务请求向后转发至对应的业务接口后,将对应的业务接口的请求计数器累加1,或者还可以在利用请求计数器的计数值进行相关计算结束后,将请求计数器的计数值累加1,本公开对请求计数器的计数值变更时机不作限制。
[0058] 步骤104,根据所述计数值和缓存服务中间件的集群分片数,确定分片索引。
[0059] 其中,缓存服务中间件的集群分片数,即缓存服务中间件包含的Redis分片的个数,缓存服务中间件通常包含偶数个的Redis分片,构成一个集群,比如,缓存服务中间件包含8个Redis分片,则集群分片数为8。
[0060] 本公开实施例中,获取了接口标识对应的目标接口的请求计数器的计数值之后,可以根据计数值和缓存服务中间件的集群分片数,计算得到分片索引。
[0061] 示例性地,可以将获取的计数值作为被除数,将缓存服务中间件的集群分片数作为除数,计算计数值除以集群分片数的余数,将得到的余数作为分片索引。
[0062] 步骤105,从与所述分片索引对应的第一Redis分片中获取剩余令牌数和请求执行时间进行令牌桶限流计算,并获取返回结果。
[0063] 本公开实施例中,可以为缓存服务中间件中的各个Redis分片设置对应的索引号,比如,缓存服务中间件中包含8个Redis分片,则这8个Redis分片可以依次设置索引号为0~7,从而,根据计数值和缓存服务中间件的集群分片数计算得到分片索引之后,可以将得到的分片索引与缓存服务中间件中各Redis分片的索引号进行比对,确定与分片索引对应的第一Redis分片,并从第一Redis分片中获取剩余令牌数和请求执行时间进行令牌桶限流计算。
[0064] 示例性地,从Redis分片中获取剩余令牌数和请求执行时间,以及进行令牌桶限流计算,可以通过开源的Redis Lua脚本进行实现。其中,Redis Lua脚本如下:
[0065] local tokens_key=KEYS[1]‑‑redis中key的格式为request_rate_limiter.{业务key}.tokens
[0066] local timestamp_key=KEYS[2]‑‑redis中key的格式为request_rate_limiter.{业务key}.timestamp‑‑这两个key是固定的,一个是token(令牌),一个是时间戳[0067] local rate=tonumber(ARGV[1])‑‑令牌桶填充速率,执行脚本时需要传入参数ratelocal capacity=tonumber(ARGV[2])‑‑令牌桶总容量,执行脚本时需要传入参数capacity
[0068] local now=tonumber(ARGV[3])‑‑当前时间,单位是秒
[0069] local requested=tonumber(ARGV[4])‑‑写死的,值是1,每次收到一个请求触发运行一次脚本
[0070] local fill_time=capacity/rate‑‑满负荷下消耗完令牌需要的时间,单位是秒[0071] local ttl=math.floor(fill_time*2)‑‑Redis分片中存储的剩余令牌数和请求执行时间的有效期,超过这个过期时间ttl,清除Redis分片中的剩余令牌数和请求执行时间
[0072] local last_tokens=tonumber(redis.call("get",tokens_key))
[0073] if last_tokens==nil then
[0074] last_tokens=capacity
[0075] end
[0076] ‑‑执行redis get命令获取Redis分片中的剩余令牌数,如果为空,代表当前时间没有消耗过令牌,可以认为令牌数=令牌桶容量
[0077] local last_refreshed=tonumber(redis.call("get",timestamp_key))[0078] if last_refreshed==nil then
[0079] last_refreshed=0
[0080] end
[0081] ‑‑执行redis get命令获取最后刷新时间,也就是最后一个请求执行时间(即Redis分片中的请求执行时间)
[0082] local delta=math.max(0,now‑last_refreshed)
[0083] local filled_tokens=math.min(capacity,last_tokens+(delta*rate))‑‑filled_tokens取(令牌桶总容量,总的可用令牌数)的小值,即为执行到这一步剩余的可用令牌数量,其中,总的可用令牌数为(剩余令牌数+最后一次请求到现在应该创建的令牌)[0084] local allowed=filled_tokens>=requested‑‑这一步是关键,判断是否获取到令牌
[0085] local new_tokens=filled_tokens
[0086] local allowed_num=0
[0087] if allowed then
[0088] new_tokens=filled_tokens‑requested‑‑如果获取到令牌,则redis缓存中的令牌就扣除相应数量
[0089] allowed_num=1
[0090] end
[0091] redis.call("setex",tokens_key,ttl,new_tokens)‑‑设置新的剩余令牌数[0092] redis.call("setex",timestamp_key,ttl,now)‑‑设置当前时间为新的请求执行时间
[0093] return{allowed_num,new_tokens}‑‑脚本返回结果allowed_num=1代表放行[0094] 在执行上述脚本时,需要传入六个参数,具体如下:
[0095] (1)tokens_key:获取指定业务的令牌数的key,格式为request_rate_limiter.{业务key}.tokens;
[0096] (2)timestamp_key:获取指定业务的最后一个请求时间的key,格式为request_rate_limiter.{业务key}.timestamp;
[0097] (3)rate:令牌桶的填充速率;
[0098] (4)capacity:令牌桶容量;
[0099] (5)now:当前时间,一般通过执行get命令从Redis中获取全局统一的时间;
[0100] (6)requested:请求放行的个数,每次一个请求,值为1。
[0101] 示例性地,本公开实施例中,可以将确定的分片索引作为业务key传入上述Redis Lua脚本中进行令牌桶限流计算。
[0102] 示例性地,本公开实施例中,可以将确定的用户标识、接口标识和分片索引进行组合为“用户标识‑接口标识‑分片索引”的形式,并作为业务key传入上述Redis Lua脚本中进行令牌桶限流计算。
[0103] 步骤106,在根据所述返回结果确定从令牌桶中获取到令牌的情况下,将所述业务请求转发给所述目标接口下的服务实例进行执行。
[0104] 本公开实施例中,可以获取令牌桶限流计算的返回结果,并根据返回结果确定是放弃业务请求,还是向后转发业务请求,并在根据返回结果确定从令牌桶中获取到令牌的情况下,将业务请求转发给目标接口下的服务实例进行执行,在根据返回结果确定未获取到令牌的情况下,将业务请求进行丢弃,拒绝转发业务请求。
[0105] 示例性地,从上述Redis Lua脚本可以看出,最后会返回allowed_num作为返回结果,当allowed_num=1时,代表从令牌桶中获取到令牌,放行请求。因此本公开实施例中,可以获取allowed_num作为返回结果,并根据allowed_num的值,确定是否转发业务请求或者拒绝业务请求,如果获取的allowed_num=1,则确定从令牌桶中获取到令牌,放行业务请求,将业务请求向后转发给目标接口下的可用服务实例进行执行。
[0106] 本公开实施例的基于Redis的流量控制方法,通过根据接收的业务请求,确定业务请求对应的用户标识和接口标识,并根据用户标识,确定用户标识对应的目标用户的流量限值,并在流量限值大于预设流量阈值的情况下,获取与接口标识对应的目标接口的请求计数器的计数值,以及根据计数值和缓存服务中间件的集群分片数,确定分片索引,进而从与分片索引对应的第一Redis分片中获取剩余令牌数和请求执行时间进行令牌桶限流计算,并获取返回结果,在根据返回结果确定从令牌桶中获取到令牌的情况下,将业务请求转发给目标接口下的服务实例进行执行。采用本公开的方案,通过在用户的流量限值大于预设流量阈值的情况下,根据目标接口的请求计数器的计数值和Redis的集群分片数确定分片索引,进而从分片索引对应的Redis分片中获取相关参数进行令牌桶限流计算,由于用于计算分片索引的计数值是变化的,从而计算得到的分片索引也是变化的,使得同一用户标识及同一接口标识下的请求计算被均衡分配到Redis中的各个分片上,实现了各分片CPU的负载均衡,从而有效避免了单分片计算资源耗尽的问题,保证了Redis的可用性。
[0107] 在本公开的一种可选实施方式中,所述方法还包括:将所述请求计数器的计数值累加1。
[0108] 示例性地,可以在计算得到分片索引之后,将接口标识对应的目标接口的请求计数器的计数值累加1。
[0109] 示例性地,可以在向后转发业务请求给接口标识对应的目标接口之后,将接口标识对应的目标接口的请求计数器的计数值累加1。
[0110] 在本公开实施例中,通过将请求计数器的计数值累加1,实现了利用请求计数器来记录本次请求,也为后续再次计算分片索引,以得到与本次不同的分片索引提供了数据支撑。
[0111] 如前文所述,在进行令牌桶限流计算时,还需要传入令牌桶的填充速率和令牌桶容量两个参数,为了保证限流计算的准确性,在本公开的一种可选实施方式中,还可以对缓存服务中间件对应的令牌桶填充速率和令牌桶容量进行分配,将缓存服务中间件对应的令牌桶填充速率和令牌桶容量均匀分配到各个Redis分片上,在进行令牌桶限流计算时,传入的令牌桶的填充速率和令牌桶容量不再是整个Redis对应的令牌桶填充速率和令牌桶容量,而是对应Redis分片所分配得到的分片令牌桶填充速率和分片令牌桶容量,在进行分配时,可以按照Redis包含的Redis分片的数量(即集群分片数)进行分配,各Redis分片对应的分片令牌桶容量和分片令牌桶填充速率与Redis包含的集群分片数成反比。从而,本公开实施例中,在进行令牌桶限流计算时,所需的与第一Redis分片对应的分片令牌桶容量和分片令牌桶填充速率,与集群分片数成反比。
[0112] 由于集群版多分片的Redis的各个Redis分片之间信息是不共享的,任一Redis分片均不知道其他Redis分片获取令牌的情况,为了保证限流计算的准确性,避免CPU热点问题,本公开实施例中,将令牌桶的填充速率和令牌桶容量按照集群分片数进行分配后,将第一Redis分片对应的分片令牌桶容量和分片令牌桶填充速率作为传入参数用于令牌桶限流计算,能够保证限流计算的准确性。
[0113] 在本公开的一种可选实施方式中,所述分片令牌桶容量可以通过如下公式(1)计算得到,所述分片令牌桶填充速率可以通过如下公式(2)计算得到:
[0114] rate’=rate/slices                           (1)
[0115] capacity’=capacity/slices                        (2)
[0116] 其中,所述rate’表示所述分片令牌桶填充速率,capacity’表示所述令牌桶容量,所述rate表示所述缓存服务中间件对应的令牌桶填充速率,所述capacity表示所述缓存服务中间件对应的令牌桶总容量,所述slices表示所述缓存服务中间件的集群分片数。
[0117] 在本公开的一种可选实施方式中,如图4所示,在前述实施例的基础上,步骤104可以包括以下子步骤:
[0118] 步骤201,根据所述计数值确定第一运算参数。
[0119] 本公开实施例中,可以将计数值作为第一运算参数用于计算分片索引,也可以通过对计数值进行处理来确定第一运算参数。
[0120] 在本公开的一种可选实施方式中,可以将计数值表示为二进制形式,并将二进制表示后的计数值确定为第一运算参数。
[0121] 在本公开的一种可选实施方式中,在计数值大于集群分片数的情况下,可以获取计数值除以所述集群分片数的余数,并将所得的余数确定为第一运算参数;在计数值小于或等于集群分片数的情况下,可以将计数值确定为第一运算参数。或者,还可以将余数表示为二进制的形式,并将二进制表示后的余数确定为第一运算参数。
[0122] 在本公开实施例中,通过在计数值大于集群分片数时,计算计数值除以集群分片数的余数作为第一运算参数,用于后续的与运算来确定分片索引,能够降低与运算的处理复杂度,避免了将集群分片数的二进制形式补齐为与计数值的二进制形式位数一致的操作,简化了处理流程。
[0123] 步骤202,根据所述缓存服务中间件的集群分片数确定第二运算参数。
[0124] 示例性地,可以将缓存服务中间件的集群分片数减去1,将得到的数值确定为第二运算参数,即第二运算参数为(集群分片数‑1)。或者,还可以将集群分片数减去1之后再进行二进制表示,将二进制表示后的数据确定为第二运算参数。
[0125] 步骤203,对所述第一运算参数和所述第二运算参数进行与运算,并获取运算结果。
[0126] 步骤204,将所述运算结果确定为所述分片索引。
[0127] 本公开实施例中,确定了第一运算参数和第二运算参数之后,可以对第一运算参数和第二运算参数进行与运算,并获取运算结果,进而将得到的运算结果确定为分片索引。
[0128] 示例性地,对于二进制表示的第一运算参数和第二运算参数,可以对第一运算参数和第二运算参数进行与运算,得到一个二进制表示的与运算结果,再将与运算结果转换为十进制形式,得到运算结果。或者,如果Redis的各个Redis分片对应的索引号是二进制形式表示的,则无需将二进制形式的运算结果转换为十进制。另外,对于非二进制形式表示的第一运算参数和第二运算参数,可以先将第一运算参数和第二运算参数转换为二进制形式表示之后再进行与运算,并获取运算结果。
[0129] 本公开实施例的基于Redis的流量控制方法,通过根据计数值确定第一运算参数,以及根据缓存服务中间件的集群分片数确定第二运算参数,再对第一运算参数和第二运算参数进行与运算,并获取运算结果,进而将运算结果确定为分片索引,由此,为后续利用分片索引来确定对应的Redis分片进行相关数据的获取提供了数据支持。
[0130] 在本公开的一种可选实施方式中,在获取的与用户标识对应的流量限值小于等于预设流量阈值的情况下,可以根据所述用户标识和所述接口标识确定对应的第二Redis分片,进而从所述第二Redis分片中获取剩余令牌数和请求执行时间进行令牌桶限流计算,并获取返回结果。
[0131] 示例性地,可以将用户标识和接口标识进行组合作为业务key传入Redis Lua脚本中,通过执行脚本来获取对应的第二Redis分片中的相关数据进行令牌桶限流计算,并获取返回结果。其中,业务key可以表示为“用户标识‑接口标识”的形式,Redis根据自身预设的哈希算法,将业务key的计算负载到对应的某个Redis分片(即第二Redis分片)上,从该Redis分片中获取剩余令牌数和请求执行时间进行令牌桶的计算。
[0132] 在本公开实施例中,通过在流量限值小于等于预设流量阈值的情况下,根据用户标识和接口标识确定对应的第二Redis分片,进而从第二Redis分片中获取剩余令牌数和请求执行时间进行令牌桶限流计算,并获取返回结果,由此,实现了在流量限值小于等于预设流量阈值时根据用户标识和接口标识来确定对应的Redis分片,能够针对不同用户下调用的不同接口进行限流,有利于保证不同用户下不同接口限流的独立性和准确性。
[0133] 采用本公开的方案,可以保证在单一用户接口高并发场景下的Redis分片CPU均衡负载,避免CPU热点问题产生。实验测试结果表明,Redis使用8分片(单分片3核4G)集群版实例时,可以有效支撑到8W QPS的限流场景,每个Redis分片的CPU利用率可以均衡使用50%左右。
[0134] 本公开示例性实施例还提供了一种基于Redis的流量控制装置。图5示出了根据本公开示例性实施例的基于Redis的流量控制装置的示意性框图,如图5所示,该基于Redis的流量控制装置50包括:第一确定模块501、第二确定模块502、第一获取模块503、第三确定模块504、第二获取模块505和发送模块506。
[0135] 其中,第一确定模块501,用于根据接收的业务请求,确定所述业务请求对应的用户标识和接口标识;
[0136] 第二确定模块502,用于根据所述用户标识,确定所述用户标识对应的目标用户的流量限值;
[0137] 第一获取模块503,用于在所述流量限值大于预设流量阈值的情况下,获取与所述接口标识对应的目标接口的请求计数器的计数值;
[0138] 第三确定模块504,用于根据所述计数值和缓存服务中间件的集群分片数,确定分片索引;
[0139] 第二获取模块505,用于从与所述分片索引对应的第一Redis分片中获取剩余令牌数和请求执行时间进行令牌桶限流计算,并获取返回结果;
[0140] 发送模块506,用于在根据所述返回结果确定从令牌桶中获取到令牌的情况下,将所述业务请求转发给所述目标接口下的服务实例进行执行。
[0141] 可选地,所述基于Redis的流量控制装置50还包括:
[0142] 计数模块,用于将所述请求计数器的计数值累加1。
[0143] 可选地,进行令牌桶限流计算时所需的与所述第一Redis分片对应的分片令牌桶容量和分片令牌桶填充速率,与所述集群分片数成反比。
[0144] 可选地,所述分片令牌桶容量为:
[0145] rate’=rate/slices;
[0146] 所述分片令牌桶填充速率为:
[0147] capacity’=capacity/slices;
[0148] 其中,所述rate’表示所述分片令牌桶填充速率,capacity’表示所述令牌桶容量,所述rate表示所述缓存服务中间件对应的令牌桶填充速率,所述capacity表示所述缓存服务中间件对应的令牌桶总容量,所述slices表示所述缓存服务中间件的集群分片数。
[0149] 可选地,所述第三确定模块504包括:
[0150] 第一确定单元,用于根据所述计数值确定第一运算参数;
[0151] 第二确定单元,用于根据所述缓存服务中间件的集群分片数确定第二运算参数;
[0152] 处理单元,用于对所述第一运算参数和所述第二运算参数进行与运算,并获取运算结果;
[0153] 第三确定单元,用于将所述运算结果确定为所述分片索引。
[0154] 可选地,所述第一确定单元,还用于:
[0155] 在所述计数值大于所述集群分片数的情况下,获取所述计数值除以所述集群分片数的余数;
[0156] 将所述余数确定为所述第一运算参数。
[0157] 可选地,所述基于Redis的流量控制装置50还包括:
[0158] 第四确定模块,用于在所述流量限值小于等于所述预设流量阈值的情况下,根据所述用户标识和所述接口标识确定对应的第二Redis分片;
[0159] 所述第二获取模块505,还用于:
[0160] 从所述第二Redis分片中获取剩余令牌数和请求执行时间进行令牌桶限流计算,并获取返回结果。
[0161] 本公开实施例所提供的基于Redis的流量控制装置,可执行本公开实施例所提供的任意可应用于PaaS中的路由网关的基于Redis的流量控制方法,具备执行方法相应的功能模块和有益效果。本公开装置实施例中未详尽描述的内容可以参考本公开任意方法实施例中的描述。
[0162] 本公开示例性实施例还提供一种电子设备,包括:至少一个处理器;以及与至少一个处理器通信连接的存储器。所述存储器存储有能够被所述至少一个处理器执行的计算机程序,所述计算机程序在被所述至少一个处理器执行时用于使所述电子设备执行根据本公开实施例的基于Redis的流量控制方法。
[0163] 本公开示例性实施例还提供一种存储有计算机程序的非瞬时计算机可读存储介质,其中,所述计算机程序在被计算机的处理器执行时用于使所述计算机执行根据本公开实施例的基于Redis的流量控制方法。
[0164] 本公开示例性实施例还提供一种计算机程序产品,包括计算机程序,其中,所述计算机程序在被计算机的处理器执行时用于使所述计算机执行根据本公开实施例的基于Redis的流量控制方法。
[0165] 参考图6,现将描述可以作为本公开的服务器或客户端的电子设备1100的结构框图,其是可以应用于本公开的各方面的硬件设备的示例。电子设备旨在表示各种形式的数字电子的计算机设备,诸如,膝上型计算机、台式计算机、工作台、个人数字助理、服务器、刀片式服务器、大型计算机、和其它适合的计算机。电子设备还可以表示各种形式的移动装置,诸如,个人数字处理、蜂窝电话、智能电话、可穿戴设备和其它类似的计算装置。本文所示的部件、它们的连接和关系、以及它们的功能仅仅作为示例,并且不意在限制本文中描述的和/或者要求的本公开的实现。
[0166] 如图6所示,电子设备1100包括计算单元1101,其可以根据存储在只读存储器(ROM)1102中的计算机程序或者从存储单元1108加载到随机访问存储器(RAM)1103中的计算机程序,来执行各种适当的动作和处理。在RAM1103中,还可存储设备1100操作所需的各种程序和数据。计算单元1101、ROM 1102以及RAM 1103通过总线1104彼此相连。输入/输出(I/O)接口1105也连接至总线1104。
[0167] 电子设备1100中的多个部件连接至I/O接口1105,包括:输入单元1106、输出单元1107、存储单元1108以及通信单元1109。输入单元1106可以是能向电子设备1100输入信息的任何类型的设备,输入单元1106可以接收输入的数字或字符信息,以及产生与电子设备的用户设置和/或功能控制有关的键信号输入。输出单元1107可以是能呈现信息的任何类型的设备,并且可以包括但不限于显示器、扬声器、视频/音频输出终端、振动器和/或打印机。存储单元1108可以包括但不限于磁盘、光盘。通信单元1109允许电子设备1100通过诸如因特网的计算机网络和/或各种电信网络与其他设备交换信息/数据,并且可以包括但不限于调制解调器、网卡、红外通信设备、无线通信收发机和/或芯片组,例如蓝牙TM设备、WiFi设备、WiMax设备、蜂窝通信设备和/或类似物。
[0168] 计算单元1101可以是各种具有处理和计算能力的通用和/或专用处理组件。计算单元1101的一些示例包括但不限于中央处理单元(CPU)、图形处理单元(GPU)、各种专用的人工智能(AI)计算芯片、各种运行机器学习模型算法的计算单元、数字信号处理器(DSP)、以及任何适当的处理器、控制器、微控制器等。计算单元1101执行上文所描述的各个方法和处理。例如,在一些实施例中,基于Redis的流量控制方法可被实现为计算机软件程序,其被有形地包含于机器可读介质,例如存储单元1108。在一些实施例中,计算机程序的部分或者全部可以经由ROM 1102和/或通信单元1109而被载入和/或安装到电子设备1100上。在一些实施例中,计算单元1101可以通过其他任何适当的方式(例如,借助于固件)而被配置为执行基于Redis的流量控制方法。
[0169] 用于实施本公开的方法的程序代码可以采用一个或多个编程语言的任何组合来编写。这些程序代码可以提供给通用计算机、专用计算机或其他可编程数据处理装置的处理器或控制器,使得程序代码当由处理器或控制器执行时使流程图和/或框图中所规定的功能/操作被实施。程序代码可以完全在机器上执行、部分地在机器上执行,作为独立软件包部分地在机器上执行且部分地在远程机器上执行或完全在远程机器或服务器上执行。
[0170] 在本公开的上下文中,机器可读介质可以是有形的介质,其可以包含或存储以供指令执行系统、装置或设备使用或与指令执行系统、装置或设备结合地使用的程序。机器可读介质可以是机器可读信号介质或机器可读储存介质。机器可读介质可以包括但不限于电子的、磁性的、光学的、电磁的、红外的、或半导体系统、装置或设备,或者上述内容的任何合适组合。机器可读存储介质的更具体示例会包括基于一个或多个线的电气连接、便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦除可编程只读存储器(EPROM或快闪存储器)、光纤、便捷式紧凑盘只读存储器(CD‑ROM)、光学储存设备、磁储存设备、或上述内容的任何合适组合。
[0171] 如本公开使用的,术语“机器可读介质”和“计算机可读介质”指的是用于将机器指令和/或数据提供给可编程处理器的任何计算机程序产品、设备、和/或装置(例如,磁盘、光盘、存储器、可编程逻辑装置(PLD)),包括,接收作为机器可读信号的机器指令的机器可读介质。术语“机器可读信号”指的是用于将机器指令和/或数据提供给可编程处理器的任何信号。
[0172] 为了提供与用户的交互,可以在计算机上实施此处描述的系统和技术,该计算机具有:用于向用户显示信息的显示装置(例如,CRT(阴极射线管)或者LCD(液晶显示器)监视器);以及键盘和指向装置(例如,鼠标或者轨迹球),用户可以通过该键盘和该指向装置来将输入提供给计算机。其它种类的装置还可以用于提供与用户的交互;例如,提供给用户的反馈可以是任何形式的传感反馈(例如,视觉反馈、听觉反馈、或者触觉反馈);并且可以用任何形式(包括声输入、语音输入或者、触觉输入)来接收来自用户的输入。
[0173] 可以将此处描述的系统和技术实施在包括后台部件的计算系统(例如,作为数据服务器)、或者包括中间件部件的计算系统(例如,应用服务器)、或者包括前端部件的计算系统(例如,具有图形用户界面或者网络浏览器的用户计算机,用户可以通过该图形用户界面或者该网络浏览器来与此处描述的系统和技术的实施方式交互)、或者包括这种后台部件、中间件部件、或者前端部件的任何组合的计算系统中。可以通过任何形式或者介质的数字数据通信(例如,通信网络)来将系统的部件相互连接。通信网络的示例包括:局域网(LAN)、广域网(WAN)和互联网。
[0174] 计算机系统可以包括客户端和服务器。客户端和服务器一般远离彼此并且通常通过通信网络进行交互。通过在相应的计算机上运行并且彼此具有客户端‑服务器关系的计算机程序来产生客户端和服务器的关系。