经典限流算法

前述

限流算法是一种用于控制流量或请求访问频率的技术,广泛应用于各种场景,以确保系统的稳定性和可用性。

现代互联网很多业务场景,比如秒杀、下单、查询商品详情。这些只是一些限流算法应用的示例,实际上,几乎任何需要控制流量或请求速率的应用都可以从限流算法中受益。选择适当的限流算法取决于具体的需求和系统架构。常见的限流算法包括令牌桶算法、漏桶算法、计数器算法等。

算法详解

计数器算法

计数器算法是一种基于计数器的限流方法。它通过维护一个计数器来记录请求的数量,并与预设的阈值进行比较。

  • 当计数器超过阈值时,就会触发限流操作。可以根据需要选择计数器的精度(例如每秒、每分钟等)以及阈值的设置。

缺点:

临界问题:例如在临界两把突发的高峰,无法进行限制。

image-20230718155501005

滑动窗口算法

滑动窗口,又称rolling window。滑动窗口算法维护一个固定大小的时间窗口,通常使用队列或数组来记录请求的时间戳。

  • 请求进入窗口时,旧的时间戳会被移出,从而保持窗口内的请求数量在限制范围内。
  • 滑动窗口解决了计数器算法的临界值问题。

image-20230913151109884

缺点:

  • 不适用于长时间限流:滑动窗口算法通常用于实时或较短时间的限流,例如每秒或每分钟的请求限制。
  • 不考虑请求的权重或优先级:滑动窗口算法通常将所有请求视为相等,无法根据请求的权重或优先级进行不同的处理。
  • 对于突发流量的适应性有限:滑动窗口算法主要用于平滑流量,但对于突发流量的适应性有限。

漏桶算法

漏桶算法也是一种基于容器的限流算法,它维护一个固定容量的桶,其中请求按照固定速率流入。

  • 如果桶已满,新的请求将被拒绝或排队等待。
  • 请求从桶中以固定速率流出,确保流量控制在规定速率内。

image-20230718155431819

缺点:

  • 不适用于突发流量:漏桶算法的主要目的是通过固定速率来平滑流量,因此不适合处理突发流量。
  • 不提供灵活性:漏桶算法的速率是固定的,这意味着它无法根据系统负载或其他因素进行动态调整。
  • 无法应对不同优先级的请求:漏桶算法将所有请求平等对待,无法区分不同请求的优先级。
  • 可能浪费带宽:如果流量的速率明显低于漏桶的容量,它会强制要求每个请求等待一个固定的时间而浪费带宽。

令牌桶算法

令牌桶算法是一种基于令牌的限流算法,它维护一个固定容量的令牌桶,其中每个令牌表示一个请求的许可。

  • 令牌以固定速率被添加到令牌桶中。当请求到达时,必须从令牌桶中获取令牌才能执行请求。
  • 如果令牌桶为空,请求将被拒绝或排队等待令牌可用。
image-20230913151510820

总结

image-20230804104831834