常用限流算法
简单时间窗口
- 算法逻辑:设置周期时间内的最大并发量
- 问题:在周期尾端进去阈值并发后,进入下一周期时,又进入阈值并发量,则会出现瞬时并发量是阈值的2倍。
滑动时间窗口(优化)
-
算法逻辑:设置周期时间内的最大并发量,并且把周期在平均分成更细小的时间区域,每个小区域都会记录对应的并发量,当时间推移了小区域时间单位,上次尾端的单位被淘汰,头部新增单位。
-
问题:在周期尾端进去阈值并发后,进入下一周期时,又进入阈值并发量,则会出现瞬时并发量是阈值的2倍。
漏桶算法
- 算法逻辑:把请求比作是水,请求进来了就把请求先放进桶里,但是不处理,并以限定的速度出水,出水就相当于处理请求(水出来时才处理请求)。当水来得过猛而出水不够快时就会导致水直接溢出,即拒绝服务。
漏桶算法可以很好的控制流量的访问速度,一旦超过该速度就拒绝服务。
令牌桶算法
- 算法逻辑:系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌(拿的到令牌就能立刻处理请求),当桶里没有令牌可取时,则拒绝服务。
- 漏桶算法与令牌桶算法的区别在于,漏桶算法能够强行限制数据的传输速率,令牌桶算法能够在限制数据的平均传输速率的同时还允许某种程度的突发传输。
- 需要注意的是,在某些情况下,漏桶算法不能够有效地使用网络资源,因为漏桶的漏出速率是固定的,所以即使网络中没有发生拥塞,漏桶算法也不能使某一个单独的数据流达到端口速率。因此,漏桶算法对于存在突发特性的流量来说缺乏效率。而令牌桶算法则能够满足这些具有突发特性的流量。通常,漏桶算法与令牌桶算法结合起来为网络流量提供更高效的控制。