限流算法汇总

计数器算法:

  原理:在指定时间周期内累加访问次数,达到设定的阈值时,触发限流策略。下一个时间周期进行访问时,访问次数清零。

  实现:此算法无论是在单机还是分布式环境下实现都非常简单,使用redis的原子自增性,再结合key的过期时间,即可轻松实现。

  缺点:临界问题,在两个周期的临界点处分别达到接近阈值的请求数量,在各自周期内未超过阈值,但两次高峰期直接的时间间隔又小于过期周期,同时两次高峰请求量之和大于阈值。

滑动时间窗口算法:

  前提:为解决计数器算法的临界值问题,在TCP网络通信协议中,采用滑动时间窗口算法类解决网络拥堵问题。

  原理:将计数器算法中的实际周期切分成多个小的时间窗口,分别在小的时间窗口中记录访问次数,然后根据时间将窗口往前滑动并删除过期的小窗口。最终只需要统计滑动时间窗口范围内的小时间窗口的总请求次数即可。

漏桶限流算法:

  原理:维持一个漏桶,有恒定的流出速度,不管水流流入的速度有多快,漏斗出水的速度始终保持不变,类似于消息中间件,不管消息的生产者请求量有多大,消息的处理能力取决于消费者。

    漏桶的容量=漏桶流出的速度*可接受等待时长,这个容量范围内的请求可以排队等待系统的处理,超过容量的请求,才会被抛弃

  各类情况说明:

    1. 请求速度大于漏桶流出的速度,请求量大于当前服务所能处理的最大极限值时,触发限流策略

    2. 请求速度小于等于漏桶流出的速度,服务处理能力大于等于请求量,正常执行。

  缺点:

    系统在短时间内有突发大流量时,漏桶算法处理不了。

令牌桶限流算法:

  原理:增加一个固定大小的容器,也就是令牌桶,系统以恒定的速率向桶内放入令牌。如果有客户端请求,先需要从令牌桶拿一个令牌,拿到令牌,才有资格访问系统,这时令牌桶中减少一个令牌。令牌桶满的时候再向其中生产令牌就会被抛弃。

  各类情况说明:

    1. 请求速度大于令牌生成速度:令牌桶中的令牌会被取完,后续再来的请求由于拿不到令牌会被限流。

    2. 请求速度等于令牌的生成速度。此时系统处于平稳的状态。

    3. 请求速度小于令牌的生成速度。此时系统的访问量远远低于系统的并发能力,请求可以正常处理。

  于漏桶算法区别:由于有一个桶的存在,可以处理短时间大流量的场景。

 

posted @ 2023-03-01 13:39  夜雨声入眠  阅读(18)  评论(0编辑  收藏  举报