详细解释
令牌桶算法(Token Bucket) 是大模型 API 底层执行 速率限制 的标准实现。理解它的工作原理,能帮你明白”我明明 1 分钟前触发了 429,为什么等了 10 秒又能调几个请求了”。
三要素
- 桶容量(Bucket Size):最多能存多少令牌,等于你的 RPM/TPM 上限;
- 补充速率(Refill Rate):匀速回补(RPM=60 → 每秒补 1 个),不是每分钟清零的固定窗口;
- 消耗规则:每个请求/每个 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 限流几乎都用令牌桶,因为用户偶尔来几个快速请求是合理的。