四种常用限流算法对比

date
Feb 9, 2022
slug
network-four-rate-limit-algorithms
status
Published
tags
系统和网络
summary
漏桶、令牌桶、固定窗口、滑动窗口限流
type
Post

Leaky Bucket 漏桶

漏桶可理解为是一个限定容量的请求队列。
想象有一个桶,有水(指请求或数据)从上面流进来,水从桶下面的一个孔流出来。水流进桶的速度可以是随机的,但是水流出桶的速度是恒定的。 当水流进桶的速度较慢,桶不会被填满,请求就可以被处理。 当水流进桶的速度过快时,桶会逐渐被填满,当水超过桶的容量就会溢出,即被丢弃。
notion image
notion image
结果
 

Token Bucket 令牌桶

在令牌桶算法中,系统会以一个固定的速率向桶中添加令牌。
当有请求(或数据包)到来时,会从桶中删除一定数量的令牌。如果桶中有足够的令牌,请求就可以立即处理; 如果桶中没有足够的令牌,请求就会被阻塞或丢弃,具体行为取决于具体的实现。 桶有容量限制,如果添加令牌时桶已满,新的令牌就会被丢弃。
 
notion image
结果
 

Fixed Window 固定窗口

在一个固定的时间窗口内,只允许一定数量的请求。
如果在这个时间窗口内的请求已经达到了限制,那么新的请求就会被拒绝,过了当前时间窗口后,会进入下一个时间窗口,并重置窗口内的请求数量,重新计算。
notion image
结果
 

Sliding Window 滑动窗口

在固定窗口限流算法中,如果大量请求在一个时间窗口的边界附近到达,可能会造成瞬时的流量突增。 滑动窗口随着时间的推移,动态统计请求量,避免了在窗口边界附近的流量突增。
结果
 
还有一种方式,不需要记录具体每个请求的时间点,而通过计算滑动窗口与固定窗口之间时间的偏移,估算出滑动窗口中请求量,这个方式不太准确,但节省了请求时间点的存储成本。
notion image
图中所示,已知设窗口大小为 1 小时即 60 分钟,每个窗口内可处理 100 请求,当前时间为 1:15。
在 [12:00–1:00) 的整个绿色窗口中一共有 84 个请求,在 [1:00 to 1:15) 的黄色窗口中,15 分钟内已经处理了 36 个请求,如何计算当前窗口剩余容量?
通过计算滑动窗口与前一窗口重叠部分占比,来估算前一窗口中被占用的容量,(60分钟-15分钟)/60分钟 表示滑动窗口减去黄色当前窗口后,与绿色窗口的重叠,占绿色窗口整体的百分比,也就估算出重叠部分的请求量在总共 84 个请求的占比,得出 63 个请求,再加上当前窗口的 36 请求,一共是 99 请求,那么当前滑动窗口的剩余容量就是 100 - 99 = 1 个请求容量。
结果
 
 
参考:
 

© 菜皮 2020 - 2024