分布式服务系统限流方法及分布式服务系统转让专利
申请号 : CN202110417484.X
文献号 : CN113098793B
文献日 : 2021-12-14
发明人 : 杨帆 , 张树行
申请人 : 南京甄视智能科技有限公司
摘要 :
权利要求 :
1.一种分布式服务系统限流方法,对于所述分布式服务系统所提供的任一服务,系统中每个节点的每个服务请求均需消费一个由该服务相应的令牌桶所生成的令牌才可以得到处理;其特征在于,系统中的每个节点从所述令牌桶中预取多个令牌存储于本地,并在前次预取令牌消费完后再次从所述令牌桶中预取多个令牌存储于本地,各节点的服务请求只能消费本地的预取令牌;节点在每次预取令牌后按照以下方法动态调整下次的期望预取令牌数目:
如果本次的实际预取令牌数目低于本次的期望预取令牌数目的预设比例,则降低下次的期望预取令牌数目;如果本次的实际预取令牌数目大于等于本次的期望预取令牌数目的预设比例但小于本次的期望预取令牌数目,则保持下次的期望预取令牌数目不变;如果本次的实际预取令牌数目等于本次的期望预取令牌数目,则将下次的期望预取令牌数目提高至一个不大于maxNum的数目;maxNum为单个节点每次预取令牌的最大数量,所述预设比例的取值范围为(0,1)。
2.如权利要求1所述分布式服务系统限流方法,其特征在于,单个节点每次预取令牌的最大数量maxNum按照下式动态计算:其中,QPS为所述分布式服务系统每秒可以处理的服务请求数,instancesNum为所述分布式服务系统中的节点数量,Math.floor()为向下取整函数,M为每个时间单位内预取令牌的最小次数。
3.如权利要求1所述分布式服务系统限流方法,其特征在于,所述预设比例的取值为1/
2。
4.如权利要求1所述分布式服务系统限流方法,其特征在于,如果本次的实际预取令牌数目等于本次的期望预取令牌数目,则将下次的期望预取令牌数目提高为本次的实际预取令牌数目的二倍与maxNum之间的较小值。
5.如权利要求1所述分布式服务系统限流方法,其特征在于,每个节点预取某一服务对应令牌的频率不高于产生一个所述令牌的时间间隔。
6.如权利要求1~5任一项所述分布式服务系统限流方法,其特征在于,所述令牌桶在每次处理请求之前实时计算出要填充的令牌数目并按照所计算数目进行令牌填充。
7.如权利要求6所述分布式服务系统限流方法,其特征在于,令牌桶每次要填充的令牌数目tokens按照以下公式计算:式中,Match.min()为取最小值函数,Math.floor()为向下取整函数,currentMs为当前时间,lastMs为上一次填充令牌的时间,QPS为所述分布式服务系统每秒可以处理的服务请求数,maxPermits为令牌桶的最大容量。
8.一种分布式服务系统,其特征在于,使用如权利要求1~7任一项所述限流方法。
说明书 :
分布式服务系统限流方法及分布式服务系统
技术领域
背景技术
流是一种更高层次、更细粒度的限流方法,限制对象是接口的请求调用。随着微服务网关概
念的日益清晰,微服务调用限流技术逐渐得到应用。目前的大多数限流算法和实现都是单
机版的,没有考虑集群模式下的分布式限流。即使个别支持集群模式,具体的实现往往会给
服务调用路径增加一定的延迟,以达到集群的限流。
发明内容
得到处理;系统中的每个节点从所述令牌桶中预取多个令牌存储于本地,并在前次预取令
牌消费完后再次从所述令牌桶中预取多个令牌存储于本地,各节点的服务请求只能消费本
地的预取令牌。
目的预设比例但小于本次的期望预取令牌数目,则保持下次的期望预取令牌数目不变;如
果本次的实际预取令牌数目等于本次的期望预取令牌数目,则将下次的期望预取令牌数目
提高至一个不大于maxNum的数目;maxNum为单个节点每次预取令牌的最大数量,所述预设
比例的取值范围为(0,1)。
预取令牌的最小次数。
值。
服务请求数,maxPermits为令牌桶的最大容量。
网络消耗,从而可以极低的网络资源消耗和时延为代价,实现高效的分布式服务系统服务
限流。
附图说明
具体实施方式
效降低大量服务请求对令牌桶进行访问所导致的巨量网络消耗,从而可以极低的网络资源
消耗和时延为代价,实现高效的分布式服务系统服务限流。
得到处理;系统中的每个节点从所述令牌桶中预取多个令牌存储于本地,并在前次预取令
牌消费完后再次从所述令牌桶中预取多个令牌存储于本地,各节点的服务请求只能消费本
地的预取令牌。
目的预设比例但小于本次的期望预取令牌数目,则保持下次的期望预取令牌数目不变;如
果本次的实际预取令牌数目等于本次的期望预取令牌数目,则将下次的期望预取令牌数目
提高至一个不大于maxNum的数目;maxNum为单个节点每次预取令牌的最大数量,所述预设
比例的取值范围为(0,1)。
预取令牌的最小次数。
值。
服务请求数,maxPermits为令牌桶的最大容量。
在服务限流逻辑中获取限流的令牌,如果获取到通行令牌,则请求通过服务路由分发给对
应服务的某个实例去处理。
要不停息的进行令牌生成。并且在具体实现时,由于操作系统的分时机制以及用户进程或
者进程内部的线程会被操作系统调度而短时间暂停执行,基本很难实现真正的实时。即便
能够实现理想情况下的实时加入令牌,由于使用不同的令牌桶控制不同的服务的调用流
量,有的服务的调用量较少,如果要针对每个服务都实现实时地向各服务的令牌桶加入令
牌,这将存在巨大的计算资源浪费,性价比不高。因此本实施例选择令牌桶算法作为分布式
服务限流的基础算法,并选择延迟生成令牌的令牌生成策略。
婪策略,间隔策略是每隔一段时间,一次性的填充所有令牌,贪婪策略则尽可能以更小的时
间间隔每次添加对接时间间隔的令牌,最理想的情况是以固定的速率每次添加一个令牌。
间隔策略如图2a所示,每隔一分钟填充5个令牌。贪婪策略如图2b所示,尽可能贪婪的填充
令牌,会将一分钟划分成5个更小的时间单元,每隔12秒填充1个令牌。第二种方式是本实施
例所采用的延迟生成令牌的方式,每次处理请求之前实时的计算出要填充的令牌数目并进
行填充,然后从中消费令牌允许请求被放通。
计算:
服务请求数,maxPermits为令牌桶的最大容量。
计算延迟,在实际中由于计算公式比较简单,计算延迟可以忽略。
具体调用量。虽然令牌桶可通过集群部署的方式进行扩容,但对于高流量服务还是会造成
个别令牌桶成为热点的问题。为解决这一问题,本发明引入了令牌预取机制,即系统中的每
个节点从令牌桶中预取多个令牌存储于本地,并在前次预取令牌消费完后再次从所述令牌
桶中预取多个令牌存储于本地,各节点的服务请求只能消费本地的预取令牌。这样就可有
效避免令牌桶成为热点的问题。如图3所示,当服务请求到达某一节点时,该节点先查询本
地的预取令牌配额,如果本地还有预取令牌,则消费本地的预取令牌进行服务调用;否则,
节点从服务所对应的令牌桶中预取多个令牌存储于本地。这样,通过每次从令牌桶中申请
多个令牌,预先将部分令牌拿到本地,然后本地的该服务下次请求时直接消费,则大大减少
了令牌桶的调用量。
则每个节点预取的数量应该是由多个节点平分;又假设预先限定了每个时间单位内预取令
牌的最小次数,则单个节点每次预取令牌的最大数量maxNum按照下式动态计算:
预取令牌的最小次数。
时,实时可靠地获取系统中的当前节点数量ins tan cesNum。
实际预取令牌数目低于本次的期望预取令牌数目的预设比例,则降低下次的期望预取令牌
数目;如果本次的实际预取令牌数目大于等于本次的期望预取令牌数目的预设比例但小于
本次的期望预取令牌数目,则保持下次的期望预取令牌数目不变;如果本次的实际预取令
牌数目等于本次的期望预取令牌数目,则将下次的期望预取令牌数目提高至一个不大于
maxNum的数目;maxNum为单个节点每次预取令牌的最大数量,所述预设比例的取值范围为
(0,1)。
次申请令牌数的二分之一;如果大于等于提交申请的预取令牌数目的二分之一并且小于提
交申请的预取令牌数目,则保持下次提交申请的预取令牌数目不变;如果等于提交申请的
预取令牌数目,则将下次提交申请的预取令牌数目增加到本次提交申请的预取令牌数目的
二倍与maxNum之间的较小值。
在一定的时间间隔,如果在该时间间隔内高频次的请求中心存储,会对中心存储产生过量
的请求,从而造成中心存储迅速过载。为解决这一问题,本实施例中设定每个节点预取某一
服务对应令牌的频率不高于产生一个所述令牌的时间间隔。
令牌。本地令牌管理器会优先从本地查找可用令牌,当本地可用令牌数目为零时,则本地令
牌管理器会尝试从远端令牌生成器(令牌桶,这里假设是Redis实现)申请某个数目的令牌
数目。申请令牌的数目根据对应的动态调整算法获得。从远端获取到令牌后,会存放到当前
网关节点内部,供令牌获取请求使用。