限流(一)限流算法
在高并发系统中,我们常常提到的几个词汇“缓存”,“限流”,“降级”等。本文涉及到的是其中“限流”的部分,顾名思义,限流是一种限制流量的手段(我们可以粗粒度地理解为,限制请求的数量或者速度)。
在限流特技中,常见的限流算法有两种:
1)令牌桶算法;
2)漏桶算法;
当然,我们也可以粗暴地采用计数器的方式来进行限流。
一、令牌桶算法
如图所示:
1、桶里每秒钟会产生十个令牌,当然令牌总数不能超过桶的最大容量。
1)令牌产生的速度是均匀的,也就是说系统能够接收的请求是均匀的,比如每秒钟接收10个请求。
2)令牌桶表示请求的容纳范围,比如0 - 100个请求。
2、发起一个请求,如果桶里面有足够的令牌,那么该请求就能够被处理(同时删除桶里面的一个令牌),否则被丢弃或者缓存。
1)令牌产生的速度是均匀的,所以接收的请求是均匀的,但是被处理的请求却不一定均匀。比如,令牌桶里面有60个令牌,当前这秒钟有60个请求进来,这时候就会瞬间要处理60个请求。而不是每秒10个请求,所以令牌桶算法是允许瞬间爆发的请求数量的。
2)也就是说,只要令牌桶里面有足够的令牌,那么请求都能够被处理,令牌桶算法只是限制了请求的接收而不是请求的处理。
二、漏桶算法
如图:
1、任意数量的请求被发起,进入容器里面,当然依然不能超过容器的最大值(比如:100个请求);
1)这里表示,接收请求除了容器最大值,是没有速度限制的。
2、而容器里面的请求则是按照固定的速度均匀的被处理(比如每秒处理10个请求);
三、令牌桶和漏桶算法的区别
1、最重要的点在于,令牌桶限制的是流入(接收请求)漏桶限制的是流出(处理请求)。
2、由于漏桶限制的是流出,所以相对令牌桶来说平滑了流入的速率。
3、令牌桶算法允许瞬间爆发,而漏桶算法处理请求的速度永远是一致的。
4、两种算法只是实现方案不同,如果参数相同的话,最终限流效果是一样的。
四、计数器限流
除了以上两种限速的算法,其实还可以简单地采用计数器来限数。
只要请求数量达到最大值,那么就丢弃或者缓存。
计数器限流的方式比较粗暴,因为它不限制流入速度,也不限制流出速度。所以只要未达到最大值它就会接收并处理请求,因此,如果并发情况下,它可能导致系统一定时间段内维持在峰值上,影响响应速度。不过这种处理方式比较简单,只需要控制总请求数量或者单位时间的请求数量即可。
参考:
http://jinnianshilongnian.iteye.com/blog/2305117