在分布式系统高并发场景下,用于控制流量大小,防止由于流量过大导致服务器宕机。常用的限流算法如下:
一、滚动窗口
又称计算器限流法,包括两种参数,即窗口时间大小(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用于指定访问突发峰值。由于令牌桶有固定的大小,当请求速度小于令牌生成速度时,令牌桶会被填满。令牌桶内剩余令牌用于处理突发流量,这也是令牌桶最重要的特性。
四、漏桶限流
和令牌桶限流算法一样,漏桶算法内部也同样维护一个容器,这个容器会以恒定速度出水,不管上面的水流速度有多快,漏桶水滴的流出速度始终保持不变。实际上消息中间件就是使用了漏桶限流的思想,不管生产者的请求有多大,消息的处理能力取决于消费者。
五、回顾总结