漏桶Leaky bucket

按固定速率消减积压,按突发规则处理新增请求。

核心约束
积压随时间衰减,请求到来时增加。
适用问题
请求限速与突发控制。
边界与取舍
不同实现的延迟、拒绝和突发语义需要单独解释。

常见操作#

k 为独立限流键数量;以按时间衰减 excess 的 nginx 请求限流实现为例。

操作时间复杂度条件与说明
更新单个桶的欠账O(1)O(1)固定宽度时间算术,按 elapsed × rate 衰减,再加入本次请求。
查找限流键O(log⁡k)O(\log k)nginx 1.26.3 使用红黑树;长键比较、锁竞争另计。
延迟 / 拒绝请求由队列和定时器策略决定整形器以等待平滑输出;监管器也可直接拒绝超限请求。

时间与空间#

时间复杂度
桶算术 O(1)O(1),键索引和等待另计
辅助空间
O(k)O(k) 桶状态,加上被延迟请求的状态

“漏桶”有排队整形和计量等不同用法。nginx 的 burst、delay、nodelay 会改变超额请求的处理,不意味着始终匀速发送。

工程中的应用#

1 个案例 · 附源码
基础原理参考资料

RFC 3290 · Token and leaky buckets区分令牌桶计量和漏桶整形的语义。

nginx · limit_req module漏桶、burst、延迟与拒绝选项。

nginx 1.26.3 · limit_req implementation红黑树定位、excess 衰减和请求延迟。

7 个概念