限流算法是一种用于控制系统资源利用率的技术,通常用于保护系统免受过度使用或滥用。它的主要目标是确保资源公平分配,防止某些请求或用户对系统造成过度负荷,导致性能下降或系统崩溃。
常见的限流算法有:令牌桶算法、漏桶算法、窗口计数算法
1.令牌桶算法:
令牌桶算法的核心思想是维护一个令牌桶,其中包含一定数量的令牌,并且以一定速率进行生成。生成速率可以根据系统的带宽或处理能力来配置,通常以每秒生成多少令牌为单位。每个令牌代表一个请求的许可。 当请求者需要发送请求时,它必须从令牌桶中获取一个令牌。如果桶中有可用的令牌,请求者可以获取令牌,发送请求,并且令牌数减少一个;如果桶中没有可用的令牌,请求者需要等待,或者请求被拒绝。
令牌桶算法通常用于以下场景:
(1)限制网络请求的速率,以防止过度负荷服务器。
(2)限制客户端对API的请求速率,以确保合理使用API资源。
(3)调度系统中限制任务的并发执行速率。
(4)限制数据传输速率,以避免带宽滥用。
2. 漏桶算法
漏桶算法是一种用于流量控制和速率限制的算法。这个算法的概念类似于一个有固定容量的漏桶,水以固定速率流入,当水超过桶的容量时,多余的水将溢出。在计算机网络和通信领域,漏桶算法通常用于限制发送到目标的请求速率,以确保网络流量的平稳传输。
漏桶算法的注意点如下:
(1)漏桶桶容量: 漏桶的容量是一个固定值,表示桶可以容纳的最大水量。这个容量可以视为请求队列的大小。
(2)水流入速率: 水以固定速率流入漏桶,称为水流入速率。水流入速率决定了每个时间单位内桶中会积累多少水。
(3)水的积累: 当请求到达时,系统会尝试将水滴放入漏桶。如果桶还有剩余容量,水滴将被放入桶中。如果桶已满,多余的水滴将被丢弃,即溢出。
(4)水的漏出: 水以固定速率从桶中漏出,称为水的漏出速率。这意味着桶中的水会以恒定速率减少。
(5)速率限制: 如果请求到达的速率超过了漏桶的水流入速率,桶将在短时间内积累太多的水,导致溢出。这会导致请求被丢弃或延迟处理
虽然漏桶算法可以有效的控制流量,但是无法灵活配置接收速率,导致无法处理突发大流量。
3.窗口计数算法
窗口计数法是一种用于流量控制和速率限制的算法。它类似于令牌桶算法和漏桶算法,但具有一定的窗口和滑动机制,用于平滑控制请求速率。
窗口计数法的核心思想是将一段时间分成多个窗口,每个窗口有固定的时间间隔,例如1秒,每个窗口内限制请求的数量。当请求到达时,算法会检查当前窗口内的请求数是否已经达到了限制,如果达到了限制,则请求被延迟或丢弃。如果请求未达到限制,它将被允许通过,并计入当前窗口的计数。
例如我们允许每分钟访问接口1000次,则初始化一个count = 0,每有一个请求就给count加一,如果到达1000,后续的请求就直接丢弃。到了下一分钟,我们就直接把count归零。
虽然窗口计数算法实现起来较为简单,但是会带来一个问题,如果请求是在两个窗口的临界点,在当前时间的01:59发送1000个请求,到了02:00再发送1000个请求,这样对于系统而言实际上是1s内请求了2000次,会有瞬间压垮服务的风险。