实现限流的方案与思路

限流的目的是通过对并发访问或请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务、或排队或等待、降级等处理

实现限流的方案与思路

思路:漏桶算法、令牌桶算法、计数器算法

计数器算法:

在一定时间内只允许一定量的访问,在限定时间内超过规定量的访问后触发限流规则,在重新计时之前无法对服务起发起请求,超过限定时间后计数器清零,重新进行计时。

此方法有个致命的问题,当用户处在计数器清零的临界点时突然恶意大量发送请求会导致请求超过限流的速率,从而导致服务器崩溃风险,如下图

可使用滑动窗口的方法来尽量避免计数器算法的临界点的问题

漏桶算法:

不管流量有多大,系统只以恒定的速率处理请求,当流量大小超过漏桶的容量时,之后的请求会触发限流策略,甚至当水流入速度过大时会直接溢出,触发限流策略。类似消息队列,不管生产者的生产速率,系统的处理能力只取决于消费者的消费速度。漏桶算法只能限制数据的平均传输速率,而对于很多应用场景来说,除了要求能够限制数据的平均传输速率外,还要求允许某种程度的突发传输。此时令牌桶算法更为合适。

令牌桶算法:

是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,请求处理完后需要回收令牌,当桶里没有令牌可取时,则拒绝服务。这个比较常用,可以适应突然的大流量,最大承载量等于令牌桶中令牌的数量。

如果要让自己的系统不被打垮,用令牌桶。如果保证被别人的系统不被打垮,用漏桶算法。