常见的限流算法?

发布于

一、固定窗口

把时间分成固定窗口,窗口内计数,超过阈值限流。 - 优点:简单。 - 缺点:窗口边界可能突刺(如窗口末尾和下一个窗口开头各来一半,合起来超限)。

二、滑动窗口

把窗口分成多个小格子,随时间滑动,统计格子总数。 - 解决固定窗口的边界问题。 - 实现稍复杂。

三、漏桶算法

请求进桶,桶以固定速率流出,满了就拒绝。 - 输出速率恒定,平滑流量。 - 不能应对突发流量。

四、令牌桶算法

桶里以固定速率放令牌,请求取令牌,没令牌就拒绝。 - 允许突发流量(桶里有令牌时可瞬间取走)。 - 最常用。Sentinel、Guava RateLimiter 都基于此。

五、分布式限流

  • Redis + Lua 实现令牌桶。
  • Sentinel 集群限流。
  • 网关层限流(Nginx、Gateway)。