常见分布式算法之(二)——限流算法

在分布式系统高并发场景下,用于控制流量大小,防止由于流量过大导致服务器宕机。常用的限流算法如下:

一、滚动窗口

又称计算器限流法,包括两种参数,即窗口时间大小(windows_sieze)和限流次数(count),假设windows_size=5秒,count=10,即每个窗口时间5秒内,最大的访问次数不超过10,如下图

 

 

  • 每个窗口开始时,计数器清零,每收到一次访问请求,计数器+1。
  • 当一个窗口内,请求次数大于限流次数时(10)时开始限流。

二、滑动窗口

如滚动窗口例子,当第4秒到第5秒之间(窗口交替时),如果突然出现高并发时,可能会导致响应次数超过10,比如第4秒突然出现9次访问,第5秒也出现了9次访问,那么这两秒之内就出现了18次,超过预先设想值(5秒内10次)。为避免上述情况,可以使用滑动窗口进行改进,如下图:


滑动窗口包括两个重要参数,即窗口大小(
window_size)和滑动步长(slide_step),当window_size == slide_step时,即滑动窗口等同于滚动窗口。 

三、令牌桶限流

  • 令牌桶限流包括两个参数:令牌生成速率(replenishRate)、桶大小(burstCapacity),replenishRate用于指定客户端请求的平均访问次数,burstCapactiy用于指定访问突发峰值。
  • 由于令牌桶有固定的大小,当请求速度小于令牌生成速度时,令牌桶会被填满。
  • 令牌桶内剩余令牌用于处理突发流量,这也是令牌桶最重要的特性。

四、漏桶限流

  和令牌桶限流算法一样,漏桶算法内部也同样维护一个容器,这个容器会以恒定速度出水,不管上面的水流速度有多快,漏桶水滴的流出速度始终保持不变。实际上消息中间件就是使用了漏桶限流的思想,不管生产者的请求有多大,消息的处理能力取决于消费者。

五、回顾总结

  • 漏桶算法与令牌桶算法的主要区别在于:漏桶算法能够强行限制数据的传输速率,而令牌桶算法能够在限制平均传输速率的同时还允许某种程度的突发传输。
  • 漏桶算法不能够有效地使用网络资源,因为漏桶的漏出速率是固定的,所以即使网络中没有发生拥塞,漏桶算法也不能使数据流速率达到端口的速率,而令牌桶算法则能够满足这些具有突发特性的流量。
posted @ 2021-07-06 12:13  Jaco32  阅读(503)  评论(0)    收藏  举报