计数器限流算法(固定窗口)
在单位时间内,通过维护一个计数器来限制特定时间间隔内的请求数量,具体实现在一段时间内(例如 我们要求3秒内的请求不要超过150),对请求进行计数,并将计数的结果与设置的最大请求数进行比较,如果超过了设置的最大值则进行限流处理,时间间隔结束,计数器清零,重新开始计数
这种方式存在临界问题即:如果第2到3秒内产生了150次请求,而第3到4秒内产生了150次请求,那么其实在第2秒到第4秒这两秒内,就已经发生了300次请求了,远远大于我们要求的3秒内的请求不要超过150次这个限制
优点:实现简单,直观易懂,设置明确的阈值,易于理解和配置。
缺点:存在窗口切换时的突增问题,即在时间窗口的临界点附近,如果请求数突然增加,可能会导致短时间内大量请求通过限流检查,从而对系统造成压力。
滑动窗口算法
定义:滑动窗口限流算法本质上也是一种计数器,但它通过对时间窗口的滑动来管理请求的计数,从而实现对请求速率的限制。与固定窗口算法相比,滑动窗口算法将时间窗口分为多个小周期,每个小周期都有自己的计数器。随着时间的滑动,过期的小周期数据被删除,这样可以更精确地控制流量。
把3秒钟划分成3个小的窗口,每一个小窗口限制请求不能超过50个
比如我们设置,3秒内不能超过150个请求,那么这个窗口就可以容纳3个小窗,并且随着时间推移,往前滑动。每次请求过来后,都要统计滑动窗口内所有小窗的请求总量。
优点:能够更精确地控制流量,尤其是在处理短时间内突发的高请求量时,通过动态调整时间窗口的起始点和结束点,可以有效地平滑流量波动,避免系统因瞬间高负载而崩溃。
缺点:实现相对复杂,需要维护多个时间窗口的计数器,并且需要处理时间窗口的滑动逻辑。
漏桶限流算法
作用
- 控制数据注入网络的速度
- 平滑网络上的突发流量
这种限流方式的核心思想是:不管上游水的流速有多块,漏桶的水滴流出的速度始终保持不变(只控制消费速度,不控制生产速度),当这个水桶未满的时候水滴可以留在桶中排队等待消费,当水桶满了的时候可以采用策略,例如丢弃
优点:能够提供一个稳定的流量输出,有效避免突发流量对系统的冲击,保证所有请求都按照相同的速率被处理,从而保证公平性。
缺点:漏出速率是固定的,无法应对需要突发传输的场景。在网络未发生拥塞时,漏桶算法可能无法充分利用网络资源。
令牌桶限流算法
令牌桶限流算法使用一个固定容量的桶来存放令牌,这些令牌以恒定的速率添加到桶里。当请求需要发送到网络时,会消耗掉桶里面令牌,如果桶中有足够的令牌,请求将被允许发送;否则,请求可能需要等待或被丢弃。
优点:可以处理突发流量的问题。只要桶中有足够的令牌,就可以以峰值速率发送流量。通过调整令牌桶的容量和令牌生成速率,可以灵活地控制流量的平滑程度和突发程度。
缺点:实现相对复杂,需要维护令牌桶的状态和令牌生成逻辑。