为什么要限流
资源是有限的,我们的系统的处理能力也是有限的,对于那些已经超出系统处理能力的请求我们应该尽可能早的识别出来并让其等待或拒绝这些请求。
如果当大流量进入系统的时候不进行限流,那么将超出系统的负载,这种情况会导致服务异常、宕机等情况的出现。
常见的限流算法
计数器算法
比如我们规定,对于A接口来说,我们1分钟的访问次数不能超过100个。那么我们可以设置一个计数器counter,每当一个请求过来的时候,counter就加1,如果counter的值大于100并且该请求与第一个请求的间隔时间还在1分钟之内,那么说明请求数过多。
如果该请求与第一个请求的间隔时间大于1分钟,且counter的值还在限流范围内,那么就重置 counter。
缺点就是临界问题。在单位时间的最后1s发送最大的数量,在下一个单位时间的最开始1s发送最大数量,会突破临界值。
滑动窗口算法
一个时间窗口就是一分钟。然后我们将时间窗口进行划分格子。计算每个窗格的数量,滑动窗口会丢弃第一个窗格,选择最新的窗格,同时确保每一个窗口的请求数量都在规定范围中。
漏桶算法
限制出水的速度
令牌桶算法
令牌桶限制的是平均流入速率(允许突发请求,只要有令牌就可以处理,支持一次拿3个令牌,4个令牌…),并允许一定程度突发流量,所以也是非常常用的限流算法。