CN113098793A - 分布式服务系统限流方法及分布式服务系统 - Google Patents
分布式服务系统限流方法及分布式服务系统 Download PDFInfo
- Publication number
- CN113098793A CN113098793A CN202110417484.XA CN202110417484A CN113098793A CN 113098793 A CN113098793 A CN 113098793A CN 202110417484 A CN202110417484 A CN 202110417484A CN 113098793 A CN113098793 A CN 113098793A
- Authority
- CN
- China
- Prior art keywords
- tokens
- token
- service system
- fetching
- time
- 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.)
- Granted
Links
Images
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/215—Flow control; Congestion control using token-bucket
Landscapes
- Engineering & Computer Science (AREA)
- Computer Networks & Wireless Communication (AREA)
- Signal Processing (AREA)
- Data Exchanges In Wide-Area Networks (AREA)
Abstract
本发明公开了一种分布式服务系统限流方法,对于所述分布式服务系统所提供的任一服务,系统中每个节点的每个服务请求均需消费一个由该服务相应的令牌桶所生成的令牌才可以得到处理;系统中的每个节点从所述令牌桶中预取多个令牌存储于本地,并在前次预取令牌消费完后再次从所述令牌桶中预取多个令牌存储于本地,各节点的服务请求只能消费本地的预取令牌。本发明还公开了一种分布式服务系统。本发明在传统令牌桶算法的基础上,针对分布式服务系统的集群分布式特点,通过为各节点引入令牌预取机制,有效降低了大量服务请求对令牌桶进行访问所导致的巨量网络消耗,从而可以极低的网络资源消耗和时延为代价,实现高效的分布式服务系统服务限流。
Description
技术领域
本发明涉及一种服务的限流方法,尤其涉及一种分布式服务系统限流方法。
背景技术
服务调用限流对于构建高可用的微服务非常重要。限流技术最早出现在网络设备上,是为了解决突发网络流量引起的网络拥塞问题。与通常的网络限流不同,微服务调用限流是一种更高层次、更细粒度的限流方法,限制对象是接口的请求调用。随着微服务网关概念的日益清晰,微服务调用限流技术逐渐得到应用。目前的大多数限流算法和实现都是单机版的,没有考虑集群模式下的分布式限流。即使个别支持集群模式,具体的实现往往会给服务调用路径增加一定的延迟,以达到集群的限流。
发明内容
本发明所要解决的技术问题在于克服现有技术不足,提供一种分布式服务系统限流方法,可以极低的网络资源消耗和时延为代价,实现高效的分布式服务系统服务限流。
本发明具体采用以下技术方案解决上述技术问题:
一种分布式服务系统限流方法,对于所述分布式服务系统所提供的任一服务,系统中每个节点的每个服务请求均需消费一个由该服务相应的令牌桶所生成的令牌才可以得到处理;系统中的每个节点从所述令牌桶中预取多个令牌存储于本地,并在前次预取令牌消费完后再次从所述令牌桶中预取多个令牌存储于本地,各节点的服务请求只能消费本地的预取令牌。
优选地,节点在每次预取令牌后按照以下方法动态调整下次的期望预取令牌数目:
如果本次的实际预取令牌数目低于本次的期望预取令牌数目的预设比例,则降低下次的期望预取令牌数目;如果本次的实际预取令牌数目大于等于本次的期望预取令牌数目的预设比例但小于本次的期望预取令牌数目,则保持下次的期望预取令牌数目不变;如果本次的实际预取令牌数目等于本次的期望预取令牌数目,则将下次的期望预取令牌数目提高至一个不大于maxNum的数目;maxNum为单个节点每次预取令牌的最大数量,所述预设比例的取值范围为(0,1)。
进一步优选地,单个节点每次预取令牌的最大数量maxNum按照下式动态计算:
其中,QPS为所述分布式服务系统每秒可以处理的服务请求数,ins tan cesNum为所述分布式服务系统中的节点数量,Math.floor()为向下取整函数,M为每个时间单位内预取令牌的最小次数。
进一步优选地,所述预设比例的取值为1/2。
进一步优选地,如果本次的实际预取令牌数目等于本次的期望预取令牌数目,则将下次的期望预取令牌数目提高为本次的实际预取令牌数目的二倍与maxNum之间的较小值。
优选地,每个节点预取某一服务对应令牌的频率不高于产生一个所述令牌的时间间隔。
优选地,所述令牌桶在每次处理请求之前实时计算出要填充的令牌数目并按照所计算数目进行令牌填充。
进一步优选地,令牌桶每次要填充的令牌数目tokens按照以下公式计算:
式中,Match.min()为取最小值函数,Math.floor()为向下取整函数,currentMs为当前时间,lastMs为上一次填充令牌的时间,QPS为所述分布式服务系统每秒可以处理的服务请求数,maxPermits为令牌桶的最大容量。
基于同一发明构思还可以得到以下技术方案:
一种分布式服务系统,使用如上任一技术方案所述限流方法。
相比现有技术,本发明技术方案具有以下有益效果:
本发明在传统令牌桶算法的基础上,针对分布式服务系统的集群分布式特点,通过为各节点引入令牌预取机制,有效降低了大量服务请求对令牌桶进行访问所导致的巨量网络消耗,从而可以极低的网络资源消耗和时延为代价,实现高效的分布式服务系统服务限流。
附图说明
图1为实施例中的分布式服务系统架构;
图2a、图2b分别为令牌桶主动实时生成令牌的间隔策略和贪婪策略的原理示意图;
图3为实施例中单个节点服务请求的处理流程;
图4为令牌预取数量动态计算的一个伪代码算法实例;
图5为实施例中的分布式服务系统实现服务限流的原理示意图。
具体实施方式
为了实现分布式服务系统的服务调用限流,本发明的解决思路是在传统令牌桶算法的基础上,针对分布式服务系统的集群分布式特点,通过为各节点引入令牌预取机制,有效降低大量服务请求对令牌桶进行访问所导致的巨量网络消耗,从而可以极低的网络资源消耗和时延为代价,实现高效的分布式服务系统服务限流。
具体而言,本发明所提出的技术方案具体如下:
一种分布式服务系统限流方法,对于所述分布式服务系统所提供的任一服务,系统中每个节点的每个服务请求均需消费一个由该服务相应的令牌桶所生成的令牌才可以得到处理;系统中的每个节点从所述令牌桶中预取多个令牌存储于本地,并在前次预取令牌消费完后再次从所述令牌桶中预取多个令牌存储于本地,各节点的服务请求只能消费本地的预取令牌。
优选地,节点在每次预取令牌后按照以下方法动态调整下次的期望预取令牌数目:
如果本次的实际预取令牌数目低于本次的期望预取令牌数目的预设比例,则降低下次的期望预取令牌数目;如果本次的实际预取令牌数目大于等于本次的期望预取令牌数目的预设比例但小于本次的期望预取令牌数目,则保持下次的期望预取令牌数目不变;如果本次的实际预取令牌数目等于本次的期望预取令牌数目,则将下次的期望预取令牌数目提高至一个不大于maxNum的数目;maxNum为单个节点每次预取令牌的最大数量,所述预设比例的取值范围为(0,1)。
进一步优选地,单个节点每次预取令牌的最大数量maxNum按照下式动态计算:
其中,QPS为所述分布式服务系统每秒可以处理的服务请求数,ins tan cesNum为所述分布式服务系统中的节点数量,Math.floor()为向下取整函数,M为每个时间单位内预取令牌的最小次数。
进一步优选地,所述预设比例的取值为1/2。
进一步优选地,如果本次的实际预取令牌数目等于本次的期望预取令牌数目,则将下次的期望预取令牌数目提高为本次的实际预取令牌数目的二倍与maxNum之间的较小值。
优选地,每个节点预取某一服务对应令牌的频率不高于产生一个所述令牌的时间间隔。
优选地,所述令牌桶在每次处理请求之前实时计算出要填充的令牌数目并按照所计算数目进行令牌填充。
进一步优选地,令牌桶每次要填充的令牌数目tokens按照以下公式计算:
式中,Match.min()为取最小值函数,Math.floor()为向下取整函数,currentMs为当前时间,lastMs为上一次填充令牌的时间,QPS为所述分布式服务系统每秒可以处理的服务请求数,maxPermits为令牌桶的最大容量。
为了便于公众理解,下面通过一个具体实施例并结合附图来对本发明的技术方案进行详细说明:
本实施例分布式服务系统的基本架构如图1所示。当外部请求到达时,请求首先到达接口平台接入层,经过参数校验、服务鉴权、服务路由等前置逻辑后,进入服务限流逻辑,在服务限流逻辑中获取限流的令牌,如果获取到通行令牌,则请求通过服务路由分发给对应服务的某个实例去处理。
在服务调用场景下,专门针对每个服务设置令牌生成器实时生成令牌的方式增加了复杂性和准确性的问题,会导致在系统比较空闲,调用量比较小的情况下令牌生成器也要不停息的进行令牌生成。并且在具体实现时,由于操作系统的分时机制以及用户进程或者进程内部的线程会被操作系统调度而短时间暂停执行,基本很难实现真正的实时。即便能够实现理想情况下的实时加入令牌,由于使用不同的令牌桶控制不同的服务的调用流量,有的服务的调用量较少,如果要针对每个服务都实现实时地向各服务的令牌桶加入令牌,这将存在巨大的计算资源浪费,性价比不高。因此本实施例选择令牌桶算法作为分布式服务限流的基础算法,并选择延迟生成令牌的令牌生成策略。
令牌桶的实现一般有两种不同的方式。一种方式是主动实时生成令牌放入到令牌桶中,处理请求时从令牌桶中获取并消费令牌,主动实时生成令牌又可分为间隔策略和贪婪策略,间隔策略是每隔一段时间,一次性的填充所有令牌,贪婪策略则尽可能以更小的时间间隔每次添加对接时间间隔的令牌,最理想的情况是以固定的速率每次添加一个令牌。间隔策略如图2a所示,每隔一分钟填充5个令牌。贪婪策略如图2b所示,尽可能贪婪的填充令牌,会将一分钟划分成5个更小的时间单元,每隔12秒填充1个令牌。第二种方式是本实施例所采用的延迟生成令牌的方式,每次处理请求之前实时的计算出要填充的令牌数目并进行填充,然后从中消费令牌允许请求被放通。
在本实施例中,某一服务所对应的令牌桶在每次处理请求之前实时计算出要填充的令牌数目并按照所计算数目进行令牌填充,要填充的令牌数目tokens具体按照以下公式计算:
式中,Match.min()为取最小值函数,Math.floor()为向下取整函数,currentMs为当前时间,lastMs为上一次填充令牌的时间,QPS为所述分布式服务系统每秒可以处理的服务请求数,maxPermits为令牌桶的最大容量。
当令牌消费者需要获取令牌时,根据从上次令牌生成时刻到当前时刻过去的时间段,采用上述公式进行计算令牌数量,能够按需使用计算资源。当然延迟计算会带来一定的计算延迟,在实际中由于计算公式比较简单,计算延迟可以忽略。
如果完全采用现有令牌桶的算法,每个服务请求到达时,均去令牌桶中获取令牌,这一方面会让每个请求增加令牌桶访问来回的网络消耗,另一方面也给令牌桶带来1比1的具体调用量。虽然令牌桶可通过集群部署的方式进行扩容,但对于高流量服务还是会造成个别令牌桶成为热点的问题。为解决这一问题,本发明引入了令牌预取机制,即系统中的每个节点从令牌桶中预取多个令牌存储于本地,并在前次预取令牌消费完后再次从所述令牌桶中预取多个令牌存储于本地,各节点的服务请求只能消费本地的预取令牌。这样就可有效避免令牌桶成为热点的问题。如图3所示,当服务请求到达某一节点时,该节点先查询本地的预取令牌配额,如果本地还有预取令牌,则消费本地的预取令牌进行服务调用;否则,节点从服务所对应的令牌桶中预取多个令牌存储于本地。这样,通过每次从令牌桶中申请多个令牌,预先将部分令牌拿到本地,然后本地的该服务下次请求时直接消费,则大大减少了令牌桶的调用量。
采用令牌预取机制,每个节点每次预取的数量怎么确定是首先需要考虑的问题。假设某个服务的整体限流用所述分布式服务系统每秒可以处理的服务请求数QPS来表征,则每个节点预取的数量应该是由多个节点平分;又假设预先限定了每个时间单位内预取令牌的最小次数,则单个节点每次预取令牌的最大数量maxNum按照下式动态计算:
其中,QPS为所述分布式服务系统每秒可以处理的服务请求数,ins tan cesNum为所述分布式服务系统中的节点数量,Math.floor()为向下取整函数,M为每个时间单位内预取令牌的最小次数。
在微服务网关支持节点动态伸缩的情况下,可以借助开源的分布式协调部件,比如ZooKeeper、Eureka、Nacos等,来实现简单易用的节点管理功能,在保证实现轻量化的同时,实时可靠地获取系统中的当前节点数量ins tan cesNum。
本实施例中,各节点根据服务配置的QPS限制以及预取令牌的最大数量限制maxNum,在每次预取令牌后按照以下方法动态调整下次的期望预取令牌数目:如果本次的实际预取令牌数目低于本次的期望预取令牌数目的预设比例,则降低下次的期望预取令牌数目;如果本次的实际预取令牌数目大于等于本次的期望预取令牌数目的预设比例但小于本次的期望预取令牌数目,则保持下次的期望预取令牌数目不变;如果本次的实际预取令牌数目等于本次的期望预取令牌数目,则将下次的期望预取令牌数目提高至一个不大于maxNum的数目;maxNum为单个节点每次预取令牌的最大数量,所述预设比例的取值范围为(0,1)。
例如,可使用如图4所示的令牌预取数量动态计算算法:如果本次实际预取令牌数目小于提交申请的预取令牌数目的二分之一,则将下次提交申请的预取令牌数目缩小到本次申请令牌数的二分之一;如果大于等于提交申请的预取令牌数目的二分之一并且小于提交申请的预取令牌数目,则保持下次提交申请的预取令牌数目不变;如果等于提交申请的预取令牌数目,则将下次提交申请的预取令牌数目增加到本次提交申请的预取令牌数目的二倍与maxNum之间的较小值。
除了以上所讨论的令牌预取数量问题,也需要考虑预取频次的问题。在请求流量高峰期,经常会出现令牌数被很快消耗,在消耗完令牌的时刻到下一个产生令牌的时刻存在一定的时间间隔,如果在该时间间隔内高频次的请求中心存储,会对中心存储产生过量的请求,从而造成中心存储迅速过载。为解决这一问题,本实施例中设定每个节点预取某一服务对应令牌的频率不高于产生一个所述令牌的时间间隔。
如图5所示,当服务调用请求到达网关进行限流时,首先根据请求携带的元数据获取请求对应的服务名称等信息,然后根据服务名称从本地预取令牌管理器获取通行使用的令牌。本地令牌管理器会优先从本地查找可用令牌,当本地可用令牌数目为零时,则本地令牌管理器会尝试从远端令牌生成器(令牌桶,这里假设是Redis实现)申请某个数目的令牌数目。申请令牌的数目根据对应的动态调整算法获得。从远端获取到令牌后,会存放到当前网关节点内部,供令牌获取请求使用。
Claims (9)
1.一种分布式服务系统限流方法,对于所述分布式服务系统所提供的任一服务,系统中每个节点的每个服务请求均需消费一个由该服务相应的令牌桶所生成的令牌才可以得到处理;其特征在于,系统中的每个节点从所述令牌桶中预取多个令牌存储于本地,并在前次预取令牌消费完后再次从所述令牌桶中预取多个令牌存储于本地,各节点的服务请求只能消费本地的预取令牌。
2.如权利要求1所述分布式服务系统限流方法,其特征在于,节点在每次预取令牌后按照以下方法动态调整下次的期望预取令牌数目:
如果本次的实际预取令牌数目低于本次的期望预取令牌数目的预设比例,则降低下次的期望预取令牌数目;如果本次的实际预取令牌数目大于等于本次的期望预取令牌数目的预设比例但小于本次的期望预取令牌数目,则保持下次的期望预取令牌数目不变;如果本次的实际预取令牌数目等于本次的期望预取令牌数目,则将下次的期望预取令牌数目提高至一个不大于maxNum的数目;maxNum为单个节点每次预取令牌的最大数量,所述预设比例的取值范围为(0,1)。
4.如权利要求2所述分布式服务系统限流方法,其特征在于,所述预设比例的取值为1/2。
5.如权利要求2所述分布式服务系统限流方法,其特征在于,如果本次的实际预取令牌数目等于本次的期望预取令牌数目,则将下次的期望预取令牌数目提高为本次的实际预取令牌数目的二倍与maxNum之间的较小值。
6.如权利要求1所述分布式服务系统限流方法,其特征在于,每个节点预取某一服务对应令牌的频率不高于产生一个所述令牌的时间间隔。
7.如权利要求1~6任一项所述分布式服务系统限流方法,其特征在于,所述令牌桶在每次处理请求之前实时计算出要填充的令牌数目并按照所计算数目进行令牌填充。
9.一种分布式服务系统,其特征在于,使用如权利要求1~8任一项所述限流方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110417484.XA CN113098793B (zh) | 2021-04-19 | 2021-04-19 | 分布式服务系统限流方法及分布式服务系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110417484.XA CN113098793B (zh) | 2021-04-19 | 2021-04-19 | 分布式服务系统限流方法及分布式服务系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113098793A true CN113098793A (zh) | 2021-07-09 |
CN113098793B CN113098793B (zh) | 2021-12-14 |
Family
ID=76679008
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110417484.XA Active CN113098793B (zh) | 2021-04-19 | 2021-04-19 | 分布式服务系统限流方法及分布式服务系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113098793B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115242722A (zh) * | 2022-06-14 | 2022-10-25 | 中盈优创资讯科技有限公司 | 一种基于api网关的高级流控实现方法 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102014075A (zh) * | 2010-12-21 | 2011-04-13 | 杭州华三通信技术有限公司 | 流量监管方法和装置 |
CN109194584A (zh) * | 2018-08-13 | 2019-01-11 | 中国平安人寿保险股份有限公司 | 一种流量监控方法、装置、计算机设备及存储介质 |
CN110995611A (zh) * | 2019-12-20 | 2020-04-10 | 创盛视联数码科技(北京)有限公司 | 一种用于针对高并发请求分布式限流方法 |
CN112350953A (zh) * | 2019-08-07 | 2021-02-09 | 亿度慧达教育科技(北京)有限公司 | 流量限制方法及其装置、电子设备和计算机可读存储介质 |
WO2021042136A2 (en) * | 2020-03-02 | 2021-03-04 | Zeku, Inc. | Mini-token bucket for uplink transmission |
-
2021
- 2021-04-19 CN CN202110417484.XA patent/CN113098793B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102014075A (zh) * | 2010-12-21 | 2011-04-13 | 杭州华三通信技术有限公司 | 流量监管方法和装置 |
CN109194584A (zh) * | 2018-08-13 | 2019-01-11 | 中国平安人寿保险股份有限公司 | 一种流量监控方法、装置、计算机设备及存储介质 |
CN112350953A (zh) * | 2019-08-07 | 2021-02-09 | 亿度慧达教育科技(北京)有限公司 | 流量限制方法及其装置、电子设备和计算机可读存储介质 |
CN110995611A (zh) * | 2019-12-20 | 2020-04-10 | 创盛视联数码科技(北京)有限公司 | 一种用于针对高并发请求分布式限流方法 |
WO2021042136A2 (en) * | 2020-03-02 | 2021-03-04 | Zeku, Inc. | Mini-token bucket for uplink transmission |
Non-Patent Citations (1)
Title |
---|
小卒曹阿瞒: "服务高可用:流控和熔断机制", 《HTTPS://BLOG.CSDN.NET/QQ_28119741/ARTICLE/DETAILS/103948489》 * |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115242722A (zh) * | 2022-06-14 | 2022-10-25 | 中盈优创资讯科技有限公司 | 一种基于api网关的高级流控实现方法 |
CN115242722B (zh) * | 2022-06-14 | 2024-04-16 | 中盈优创资讯科技有限公司 | 一种基于api网关的高级流控实现方法 |
Also Published As
Publication number | Publication date |
---|---|
CN113098793B (zh) | 2021-12-14 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11601512B2 (en) | System and method for throttling service requests having non-uniform workloads | |
Olston et al. | Best-effort cache synchronization with source cooperation | |
US9419904B2 (en) | System and method for throttling service requests using work-based tokens | |
Jeffay et al. | A rate-based execution abstraction for multimedia computing | |
WO2016119412A1 (zh) | 一种云平台上的资源伸缩方法和一种云平台 | |
US7613848B2 (en) | Dynamic stabilization for a stream processing system | |
CN112714029B (zh) | 一种内容分发网络带宽调度的方法、装置及设备 | |
CN110545246A (zh) | 一种基于令牌桶的限流方法和装置 | |
CN106293868A (zh) | 一种云计算环境中虚拟机扩缩容方法及扩缩容系统 | |
CN105159775A (zh) | 基于负载均衡器的云计算数据中心的管理系统和管理方法 | |
CN106464733B (zh) | 一种调整云计算中虚拟资源的方法及装置 | |
CN102917077A (zh) | 云计算系统中的资源分配方法 | |
CN104239150B (zh) | 一种硬件资源调整的方法及装置 | |
CN107204858B (zh) | 一种移动终端流量提醒方法及装置 | |
CN113098793B (zh) | 分布式服务系统限流方法及分布式服务系统 | |
CN114915593B (zh) | 基于Redis的流量控制方法、装置、电子设备及存储介质 | |
WO2002082286A3 (en) | Apparatus and method for efficiently sharing memory bandwidth in a network processor | |
CN109413502A (zh) | 多线程弹幕消息分发方法、装置、设备及存储介质 | |
CN104184765B (zh) | 一种请求控制方法及客户端装置和服务器端装置 | |
US11616725B1 (en) | Hierarchical token buckets | |
CN110838989A (zh) | 一种用于基于令牌进行网络限流的方法和装置 | |
CN112156453B (zh) | 实例自适应调整方法、装置、计算机可读存储介质及设备 | |
CN101833479A (zh) | 多网络环境下基于强化学习的mpi消息调度方法 | |
TWI766387B (zh) | 一種具延遲感知負載平衡的反向代理方法和存儲裝置 | |
CN108307206A (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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
CP01 | Change in the name or title of a patent holder | ||
CP01 | Change in the name or title of a patent holder |
Address after: 210000 Longmian Avenue 568, High-tech Park, Jiangning District, Nanjing City, Jiangsu Province Patentee after: Xiaoshi Technology (Jiangsu) Co.,Ltd. Address before: 210000 Longmian Avenue 568, High-tech Park, Jiangning District, Nanjing City, Jiangsu Province Patentee before: NANJING ZHENSHI INTELLIGENT TECHNOLOGY Co.,Ltd. |