rate limiter?token bucket vs leaky bucket?实现一个rate limiter?token bucket vs leaky bucket?
限制请求速率,防止过载、保证公平或满足上游配额。常见策略:固定窗口、滑动窗口、token bucket、leaky bucket。实现时需考虑并发、分布式下多实例的协同(如用 Redis 做共享计数)。
Token bucket:桶里放「令牌」,以固定速率补充;请求消耗若干令牌,无令牌则拒绝或等待。允许突发(桶满时一段时间可高吞吐),适合「平均速率限制、允许短时突发」的场景。Leaky bucket:请求进桶,以固定速率「漏出」被处理;超出桶容量则拒绝或排队。平滑输出、不允许多余突发,适合「输出速率严格恒定」的场景。二者可互相近似(如 leaky 的「漏率」对应 token 的「补充率」),侧重点不同。
Token bucket:记录 last_time、tokens;每次请求时按时间差补令牌、扣减;需加锁或原子操作。Leaky bucket:记录 last_time、水位;按漏率更新水位再判断是否接受。分布式时用 Redis 的计数器 + 时间窗口或 Lua 脚本保证原子性。
| 返回模块 | 返回总览 |