限流算法

一、什么是限流:

    限制流量请求的频率(每秒处理多少个请求)。一般来说,当请求流量超过系统的瓶颈,则丢弃掉多余的请求流量,保证系统的可用性。

二、解决的问题:

    高并发情况下,保证系统的可用性,不会被击垮。

三、目前主流的两种限流算法:

    1、漏桶限流算法;

    2、令牌桶限流算法。

四、漏桶限流算法:

        

    不论流量流入的情况如何,流量流出按照一定的频率。如果流入过大的流量,超过桶的大小,则丢弃掉多余的流量。

        优点:保证的流量流入频率,原理简单。

        缺点:无法应对突发的大流量。因为流出的是固定频率,其他流量只是放在桶中,并没有流出。

五、令牌桶限流算法:

        

    令牌桶算法是按照恒定速率往桶中放入令牌,每当一个请求进入的时候需要消耗一个或多个令牌。当令牌数为0的时候,请求会被阻塞或者抛弃。当生产速度高于消费速度,桶满了就不会再增加令牌了。

    优点:保证的流量流入频率,同时可以应对突然的大流量(比如当桶中的令牌比较多的时候,就可以同时给很多请求发出令牌,从而保证突然大流量的处理)。相对漏桶算法更高级。

    缺点:算法相对复杂。

六、总结:

        漏桶保证流量流出的频率。后续服务只需要支持最大请求量:漏桶流出频率。

        令牌桶只是保证令牌的产生频率。后续服务只需要支持最大请求量:桶最大值的流出频率。

            (1)当令牌消费速度远远高于产生速度时(桶中令牌基本处于空的状态),漏桶算法效果基本一样,保证流量流出的频率;

            (2)当令牌消费速度小于产生速度时(桶中令牌会变多直至填满),这时就可以应对突发的大流量请求,但是后续的服务要能支撑起桶大小请求量的极端请求情况。


七、使用场景:

         漏桶算法、令牌桶算法,其实无所谓哪个更好,要看适用的场景。

        当需要处理突然的大流量的时候,令牌桶算法更适用;

        当只需要保证系统的单位时间流量、或者更注重系统的稳定性的时候,漏桶算法更适用。


猜你喜欢

转载自blog.csdn.net/luoliang2012/article/details/80422954