常见的限流算法

目录

限流算法是什么?

限流算法是一种用于控制网络流量或系统资源使用的算法。它的目的是限制网络流量或系统资源的使用,以防止系统被过度负载,从而提高系统的性能和可靠性。

常见的限流算法有哪些?

常见的限流算法有以下几种:

  • 漏桶算法
  • 令牌桶算法
  • 固定窗口限流算法
  • 滑动窗口算法

漏桶算法的基本思想是:

  • 一个固定容量的桶,桶的底部有一个洞,可以向桶中注入水。
  • 桶的顶部有一个出水口,出水口的水会按照一定的速率滴出。
  • 当桶中的水超过桶的容量时,多余的水会溢出。

在这里向桶内注水就请求进入,出水口滴出就相当于请求处理。 无论请求进入的速度如何,处理的速度始终保持不变。 当进入的请求超过桶的容量时,多余的请求会被丢弃。

漏桶总是以恒定的速率处理请求,当面对突发流量时,漏桶不能很好的处理,因为漏桶的出口处的速率是固定的,当请求过多时,漏桶会出现溢出的情况。

当后端处理能力有限时,漏桶算法可以很好的处理请求。 但是当后端处理能力提升时,漏桶就不能动态的调整。

令牌桶算法的基本思想是:

  • 以一个恒定的速率向桶中注入令牌。
  • 当请求进入时,需要先从桶中获取一个令牌,如果桶中没有令牌,则请求会被拒绝。
  • 当桶中的令牌数量超过桶的容量时,不再注入令牌。

令牌桶相比于漏桶算法可以更好的处理突发流量。因为只要桶中有足够的令牌,请求就可以被处理。即使请求的速度超过了令牌的注入速度,只要桶中有足够的令牌,请求就可以被处理。

固定窗口限流算法的基本思想是:

  • 单位时间段当做一个窗口,窗口的大小是固定的。
  • 当请求进入时,需要判断当前时间所在的窗口内的计数器是否超过了限流的阈值。
  • 如果超过了限流的阈值,则请求会被拒绝。

固定窗口会遇到的问题是,如果面对突发流量,如果在单位时间的前半部分请求已经达到了限流的阈值,那么在单位时间的后半部分请求也会被拒绝。

而且,这种算法会遇到一个临界的问题,假设限流阀值为5个请求,单位时间窗口是1s,如果我们在单位时间内的前0.8-1s和1-1.2s,分别并发5个请求。虽然都没有超过阀值,但是如果算0.8-1.2s,则并发数高达10,已经超过单位时间1s不超过5阀值的定义啦。

为了解决这个问题,我们可以使用滑动窗口限流算法。

滑动窗口算法的基本思想是:

  • 将时间划分为多个窗口,每个窗口有一个计数器。
  • 当请求进入时,需要判断当前时间所在的窗口内的计数器是否超过了限流的阈值。
  • 如果超过了限流的阈值,则请求会被拒绝。

滑动窗口将时间划分为多个窗口,每个窗口有一个计数器。 当滑动窗口的格子周期划分的越多,那么滑动窗口的滚动就越平滑,限流的统计就会越精确。