3、常见限流算法回顾:令牌桶、漏桶、滑动窗口、计数器算法的原理与适用场景
在构建模型 API 限流系统之前,必须深入理解四种经典限流算法的核心机制。每种算法在突发处理能力、内存开销、实现复杂度上各有取舍,直接决定了业务优先级策略的落地方式。本节从原理出发,逐一拆解其数学模型与适用边界。
3.1 计数器算法(Counter Algorithm)
计数器是最朴素的限流实现,在固定时间窗口内维护一个原子计数器,请求到达时递增计数,超过阈值则拒绝。
- 原理:将时间划分为固定长度窗口(如 1 秒),每个窗口内计数器从 0 开始累加,达到上限后丢弃后续请求,窗口结束时重置。
- 临界突变问题:窗口切换瞬间可能出现两倍流量峰值。例如窗口 00:00-00:01 内请求 100 次,00:01-00:02 内又请求 100 次,若两次请求集中在 00:01 边界两侧,实际 1 秒内可能处理 200 次请求。
- 适用场景:对突发容忍度低、实现简单、不需要精确平滑流量的内部监控或简单 API 限流。
关键指标:内存占用 O(1),时间复杂度 O(1),但窗口边界流量尖刺可达阈值的 2 倍。
3.2 滑动窗口算法(Sliding Window Log / Sliding Window Counter)
滑动窗口通过记录每个请求的时间戳或使用子窗口聚合,解决了计数器算法的边界突变问题。
- 原理:维护一个按时间排序的请求时间戳列表,每次请求时移除窗口范围之外的时间戳,再判断当前窗口内请求数是否超过阈值。
- 优化变体:滑动窗口计数器(Sliding Window Counter)将窗口细分为多个小格子(如 1 秒窗口拆成 10 个 100ms 格子),通过加权估算当前窗口总量,降低内存占用。
- 适用场景:需要精确控制窗口内流量、能接受 O(n) 时间戳存储(或 O(子窗口数) 内存)的场景,如用户级别限流、秒杀接口。
| 算法 | 内存开销 | 边界精度 | 实现复杂度 |
|---|---|---|---|
| 计数器 | O(1) | 低(存在临界突变) | 极低 |
| 滑动窗口日志 | O(n)(n 为窗口内请求数) | 高 | 中 |
| 滑动窗口计数器 | O(子窗口数) | 中高(近似估算) | 中 |
3.3 漏桶算法(Leaky Bucket)
漏桶将请求视为水滴,以恒定速率从桶底漏出,桶满则溢出丢弃。它强制输出流量完全平滑,不允许任何突发。
- 原理:桶容量(最大排队请求数)+ 漏水速率(恒定处理速率)。请求进入时若桶未满则排队,否则丢弃;处理线程以固定速率从桶中取出请求。
- 特性:输出流量绝对均匀,但无法应对突发流量——即使瞬间有大量请求,也只能以恒定速率处理,多余请求被丢弃或排队等待。
- 适用场景:对流量整形要求严格的场景,如数据库写入限流、下游服务保护、硬件设备速率匹配。
工程提示:漏桶通常使用队列实现,需注意队列长度与内存的平衡。在分布式环境中,漏桶的中心化队列可能成为瓶颈。
3.4 令牌桶算法(Token Bucket)
令牌桶是目前业界最广泛使用的限流算法,在允许一定突发的同时保证长期平均速率。它是本教程后续实现业务优先级限流的核心基础。
- 原理:系统以恒定速率向桶中放入令牌,桶有最大容量。请求到达时从桶中获取令牌,有令牌则通过,无令牌则拒绝或等待。
- 突发能力:桶中积累的令牌允许短时间内的突发流量(最大突发量 = 桶容量)。例如桶容量 100,速率 10 个/秒,空闲 10 秒后桶满,可瞬间处理 100 个请求。
- 适用场景:需要允许突发、同时控制平均速率的场景,如 Web API 限流、微服务网关、模型推理接口。
注意:令牌桶的突发能力可能对下游造成压力。在模型 API 场景中,需结合业务优先级为不同等级分配独立的令牌桶,避免高优先级突发挤占所有资源。
3.5 算法对比总结
| 算法 | 突发支持 | 输出平滑度 | 内存开销 | 实现复杂度 | 典型场景 |
|---|---|---|---|---|---|
| 计数器 | 不支持(边界尖刺) | 低 | O(1) | 极低 | 简单监控、非关键限流 |
| 滑动窗口 | 不支持(窗口内严格计数) | 中高 | O(子窗口数) 或 O(n) | 中 | 用户级别限流、秒杀 |
| 漏桶 | 不支持 | 最高(绝对平滑) | O(1)(队列实现) | 中 | 数据库写入、硬件速率匹配 |
| 令牌桶 | 支持(桶容量控制) | 高(长期平滑) | O(1) | 中 | Web API、微服务网关、模型推理 |
3.6 业务优先级限流中的算法选择
在模型 API 限流场景中,不同业务等级对延迟和突发的要求差异显著:
- 高优先级(VIP/付费用户):需要允许突发请求(如批量推理),同时保证长期速率不超限。令牌桶天然支持突发,适合为每个等级分配独立令牌桶。
- 中优先级(普通用户):允许小幅度突发,但需严格限制平均速率。令牌桶 + 较小桶容量可满足需求。
- 低优先级(免费/后台任务):不需要突发,可接受排队等待。漏桶或令牌桶 + 极小桶容量均可。