固定窗口算法
计数器算法是使用计数器在周期内累加访问次数,当达到设定的限流值时,触发限流策略。下一个
周期开始时,进行清零,重新计数。
如下图所示,每个三秒的时间区间内,限定访问次数150次,超过此请求次数则丢弃请求:
这个算法通常用于QPS限流和统计总访问量,对于秒级以上的时间周期来说,会存在一个非常严重
的问题,那就是临界问题。
假设3s内服务器的负载能力为150,因此一个周期的访问量限制在150,然而在第一个周期的最
后1秒和下一个周期的开始1秒时间段内,分别涌入100的访问量,虽然没有超过每个周期的限制
量,但是整体上2秒内已达到200的访问量,已远远超过服务器的负载能力,由此可见,计数器算
法方式限流对于周期比较长的限流,存在很大的弊端。
滑动窗口算法
滑动窗口算法是将固定窗口时间周期分为N个小周期,分别记录每个小周期内访问次数,并且根据时间滑动删除过期的小周期。
如下图,假设时间周期为3s,将3s再分为3个小周期,每个周期限制访问数为50次,则可以解决固定窗口的临界问题。
我再来回顾一下刚才的固定窗口算法,我们可以发现,固定窗口算法其实就是滑动窗口算法。只是它没有对时间窗口做进一步地划分,所以只有1格。
由此可见,当滑动窗口的格子划分的越多,那么滑动窗口的滚动就越平滑,限流的统计就会越精确。
漏桶算法
漏桶算法是访问请求到达时直接放入漏桶,如当前容量已达到上限(限流值),则进行丢弃(触发
限流策略)。漏桶以固定的速率进行释放访问请求(即请求通过),直到漏桶为空。
令牌桶算法
令牌桶算法是程序以r(r=时间周期/限流值)的速度向令牌桶中增加令牌,直到令牌桶满,请求到
达时向令牌桶请求令牌,如获取到令牌则通过请求,否则触发限流策略