令牌桶算法

Token Bucket Algorithm

令牌桶算法是 API 限流最常用的实现方式:按恒定速率向桶中补充令牌,请求需要消耗对应数量的令牌才允许通过,支持合理的流量突发。

详细解释

令牌桶算法(Token Bucket) 是大模型 API 底层执行 速率限制 的标准实现。理解它的工作原理,能帮你明白”我明明 1 分钟前触发了 429,为什么等了 10 秒又能调几个请求了”。

三要素

  1. 桶容量(Bucket Size):最多能存多少令牌,等于你的 RPM/TPM 上限;
  2. 补充速率(Refill Rate):匀速回补(RPM=60 → 每秒补 1 个),不是每分钟清零的固定窗口;
  3. 消耗规则:每个请求/每个 Token 从桶里取走对应数量的令牌,取不到就 429。

和”每分钟清零”的固定窗口相比,令牌桶更平滑——它允许短时间突发(你可以在某一秒用完桶里所有令牌),但长期平均速率严格受控。

举个例子

假设 RPM=60:

  • 桶大小 60,每秒补 1 个;
  • 00:00 你在 1 秒内发完 60 个请求,桶空了 → 第 61 个请求立刻 429;
  • 00:01 桶里只补了 1 个 → 你这秒能发 1 个;
  • 00:10 桶里补了 10 个 → 能发 10 个;
  • 01:00 你一直没发,桶回满到 60。

唯元智创(Weimeta)在聚合网关层也部署了分布式令牌桶,多个节点共用 Redis 做桶状态同步,让你即使水平扩展到多台机器,也不会出现”每台都单独算、总和超限”的问题。

常见问题

令牌桶和漏桶有什么区别?
漏桶(Leaky Bucket)输出速率是恒定的——突发流量必须排队等候;令牌桶允许一定突发,用完桶里的再排队。API 限流几乎都用令牌桶,因为用户偶尔来几个快速请求是合理的。