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 场景中,需结合业务优先级为不同等级分配独立的令牌桶,避免高优先级突发挤占所有资源。
四种限流算法核心机制对比 计数器 固定窗口 + 计数器 窗口结束重置 边界存在尖刺 内存 O(1) 实现最简单 滑动窗口 子窗口聚合 / 时间戳列表 边界精度高 内存 O(子窗口数) 无临界突变 实现中等 漏桶 恒定速率漏水 桶满则溢出 输出绝对平滑 不支持突发 实现中等 令牌桶 恒定速率生成令牌 桶容量控制突发 支持突发流量 长期平均可控 实现中等 算法选择决策要点 1. 需要绝对平滑输出流量 → 漏桶(但牺牲突发能力) 2. 需要允许突发 + 控制平均速率 → 令牌桶(最通用) 3. 需要精确窗口控制、避免边界尖刺 → 滑动窗口 4. 实现简单、对边界精度不敏感 → 计数器(适合内部监控) 5. 模型 API 限流推荐:令牌桶 + 业务优先级权重分配

3.5 算法对比总结

算法 突发支持 输出平滑度 内存开销 实现复杂度 典型场景
计数器 不支持(边界尖刺) 低 O(1) 极低 简单监控、非关键限流
滑动窗口 不支持(窗口内严格计数) 中高 O(子窗口数) 或 O(n) 中 用户级别限流、秒杀
漏桶 不支持 最高(绝对平滑) O(1)(队列实现) 中 数据库写入、硬件速率匹配
令牌桶 支持(桶容量控制) 高(长期平滑) O(1) 中 Web API、微服务网关、模型推理

3.6 业务优先级限流中的算法选择

在模型 API 限流场景中,不同业务等级对延迟和突发的要求差异显著:

  • 高优先级(VIP/付费用户):需要允许突发请求(如批量推理),同时保证长期速率不超限。令牌桶天然支持突发,适合为每个等级分配独立令牌桶。
  • 中优先级(普通用户):允许小幅度突发,但需严格限制平均速率。令牌桶 + 较小桶容量可满足需求。
  • 低优先级(免费/后台任务):不需要突发,可接受排队等待。漏桶或令牌桶 + 极小桶容量均可。