Token Bucket Algorithm
字数 1196 2025-12-03 11:09:47

Token Bucket Algorithm

第一步:基本概念与核心比喻
令牌桶算法是一种网络流量整形或速率限制的常用算法。它的核心思想非常形象:想象有一个桶,这个桶的容量是固定的(比如能装10个令牌)。系统会以恒定的速率(例如每秒2个)向这个桶里放入令牌。当令牌桶装满时,新生成的令牌会被丢弃。

第二步:数据处理(消费令牌)的规则
当网络数据包、API请求或任何需要被“限速”的单元到达时,它必须从桶中获取(“消费”)一个令牌才能被允许通过或处理。消费规则如下:

  1. 如果桶中有至少一个令牌,则取出一个令牌,请求被立即放行。
  2. 如果桶是空的,没有令牌可用,那么这个请求必须等待(被缓存/排队),直到桶中累积了新的令牌;或者更常见的做法是,该请求被直接拒绝(返回“429 Too Many Requests”或类似错误)。

第三步:算法的关键参数与特性
该算法由两个核心参数定义:

  1. 桶容量:桶最多能容纳的令牌数量。这个参数决定了在流量突发时,系统能瞬间处理的最大请求量。例如,桶容量为10,即使当前令牌生成速率很低,系统也能一瞬间处理10个积压的请求(“突发流量”)。
  2. 令牌填充速率:单位时间内向桶中添加的令牌数量。这个参数决定了系统的长期平均处理速率。例如,速率是每秒2个,那么长期来看,系统平均每秒最多处理2个请求。

这种机制使得令牌桶算法具有一个非常重要的特性:它允许一定程度的流量突发(只要桶里有足够的令牌),同时又能将长期平均速率限制在预定值。

第四步:工作流程示例
假设一个API限流规则为:桶容量=5,填充速率=1个/秒。

  • 初始状态:桶是满的(5个令牌)。
  • 瞬间到来5个请求:每个请求消耗1个令牌,全部被立即处理。桶变空。
  • 第6个请求紧接着到来:桶为空,请求被拒绝或等待。
  • 之后每秒:桶会重新积累1个令牌。如果请求以每秒1个的速度到达,则每个都能被处理。如果连续2秒没有请求,桶会积累到2个令牌(但不会超过容量5),之后到来的2个请求可以连续被处理。

第五步:主要应用场景

  1. API速率限制:保护后端服务免受过载请求的冲击,确保公平使用。例如,公共API限制每个用户每分钟最多60次调用。
  2. 网络流量整形:在网络设备上,控制数据包发送的速率,使流量输出更加平滑,避免网络拥塞。
  3. 服务质量:在网络中为不同优先级的流量分配不同的桶参数,保证高优先级流量的带宽。

第六步:与相关算法(漏桶算法)的对比
另一个常用算法是“漏桶算法”,它有一个固定容量的桶,但输出(漏水)速率是恒定的。两者的主要区别在于:

  • 令牌桶:允许突发流量(只要桶里有令牌),限制的是平均输入速率
  • 漏桶:强制输出流量以一个恒定的、平滑的速率进行,无论输入流量多么突发。

因此,令牌桶更适用于需要应对合理突发、同时控制平均速率的场景;而漏桶则更适用于产生绝对平滑输出流的场景,如视频播放。

Token Bucket Algorithm 第一步:基本概念与核心比喻 令牌桶算法是一种网络流量整形或速率限制的常用算法。它的核心思想非常形象:想象有一个桶,这个桶的容量是固定的(比如能装10个令牌)。系统会以恒定的速率(例如每秒2个)向这个桶里放入令牌。当令牌桶装满时,新生成的令牌会被丢弃。 第二步:数据处理(消费令牌)的规则 当网络数据包、API请求或任何需要被“限速”的单元到达时,它必须从桶中获取(“消费”)一个令牌才能被允许通过或处理。消费规则如下: 如果桶中有至少一个令牌,则取出一个令牌,请求被立即放行。 如果桶是空的,没有令牌可用,那么这个请求必须等待(被缓存/排队),直到桶中累积了新的令牌;或者更常见的做法是,该请求被直接拒绝(返回“429 Too Many Requests”或类似错误)。 第三步:算法的关键参数与特性 该算法由两个核心参数定义: 桶容量 :桶最多能容纳的令牌数量。这个参数决定了在流量突发时,系统能瞬间处理的最大请求量。例如,桶容量为10,即使当前令牌生成速率很低,系统也能一瞬间处理10个积压的请求(“突发流量”)。 令牌填充速率 :单位时间内向桶中添加的令牌数量。这个参数决定了系统的长期平均处理速率。例如,速率是每秒2个,那么长期来看,系统平均每秒最多处理2个请求。 这种机制使得令牌桶算法具有一个非常重要的特性: 它允许一定程度的流量突发 (只要桶里有足够的令牌),同时又能将长期平均速率限制在预定值。 第四步:工作流程示例 假设一个API限流规则为:桶容量=5,填充速率=1个/秒。 初始状态:桶是满的(5个令牌)。 瞬间到来5个请求:每个请求消耗1个令牌,全部被立即处理。桶变空。 第6个请求紧接着到来:桶为空,请求被拒绝或等待。 之后每秒:桶会重新积累1个令牌。如果请求以每秒1个的速度到达,则每个都能被处理。如果连续2秒没有请求,桶会积累到2个令牌(但不会超过容量5),之后到来的2个请求可以连续被处理。 第五步:主要应用场景 API速率限制 :保护后端服务免受过载请求的冲击,确保公平使用。例如,公共API限制每个用户每分钟最多60次调用。 网络流量整形 :在网络设备上,控制数据包发送的速率,使流量输出更加平滑,避免网络拥塞。 服务质量 :在网络中为不同优先级的流量分配不同的桶参数,保证高优先级流量的带宽。 第六步:与相关算法(漏桶算法)的对比 另一个常用算法是“漏桶算法”,它有一个固定容量的桶,但输出(漏水)速率是恒定的。两者的主要区别在于: 令牌桶 :允许突发流量(只要桶里有令牌),限制的是 平均输入速率 。 漏桶 :强制输出流量以一个 恒定的、平滑的速率 进行,无论输入流量多么突发。 因此,令牌桶更适用于需要应对合理突发、同时控制平均速率的场景;而漏桶则更适用于产生绝对平滑输出流的场景,如视频播放。