什么是限流?
限流是保护系统的一种手段,可以控制系统的流量输入或输出的速度,即限制系统一定时间内的流量数量,限制输入流量较为常见。
为什么需要限流?
因为每个系统一定时间内的流量处理能力都是有限的,当流量超出系统的处理能力的时候,系统就会出现问题,甚至崩溃。所以,我们需要把有超流量风险的系统或接口进行限速。
限流的应用场景有哪些?
1、瞬时业务流量(双11、秒杀)
2、恶意流量(DNS攻击,伪造大量请求对服务器进行攻击)
3、业务需要(例如阿里云、腾讯云等厂家提供的流量限速服务)
常见的4种限流算法
计数器算法
把时间端固定切割成若干模块,然后限制每个时间段内的数量,达到限流。例如,当一个系统的每1分钟处理请求的能力为100的时候,把时间段以每1分钟为一个时间段,然后每增加一个请求则统计请求数+1,当现1分钟的请求数达到100的时候,则不再接受新的请求。然后下一个1分钟开始的时候对重置统计请求数。但是这种算法基本被淘汰了,已经很少由公司使用这种算法,因为容易出现矛尖等情况(举例:当处于1分59秒的时候,并发了100流量,然后2分整的时候重置统计数,2分01又并发了100请求,这样就会出现3秒内出现200个请求的情况,而系统的安全极限是100,这样就会出现性能安全等问题)。
滑动区间算法
滑动区间算法是对计数器算法的一种升级,于计数器最大的差别就是,时间段并不像计数器算法那样固定时间段,而是滑动时间段。例如,当一个系统的每1分钟处理请求的能力为100的时候,每有1个请求的时候,统计之于当前时间的过去1分钟内的请求数,若果这个统计数达到100的时候,则拒绝新的请求。这种情况避免了计数器的矛尖风险,但是每次要统计过去的时间段内的请求数,对系统的性能负担比较大,慎用。
漏桶算法
漏桶算法是现在比较流行的限流算法之一。
顾名思义,假设流量是水管灌注的流水,而我们的限流器是水桶,流水的速度是不固定,有时候很少很慢并发低,有时候很大速度很猛并发高。而漏桶算法最大的特点就是不限制串入的流量,但是限制消费的流量,可基于消息队列进行实现。(白话举例,流水灌注水桶,水桶底部打洞作漏斗使用,限制底部的出水速度,而系统只需处理底部的流出流量)对于溢出水桶流量(限制数)则进行拒绝或不处理。
令牌桶算法
令牌桶算法也是现在比较流行的限流算法之一。
令牌桶算法是系统以稳定的速度向令牌桶发放令牌,每个打向系统的请求,都需要先取得令牌,系统只接受带有令牌的请求。没有抢到令牌的请求则进行拒绝处理,保证系统的流量输入速度在我们系统处理能力范围内。可使用谷歌的Guava包进行实现。
分享完毕,有时间再补图吧。