令牌桶和漏桶

点击阅读更多查看文章内容

令牌桶

1. 令牌桶算法的定义

令牌桶(Token Bucket)是一种流量控制算法,用于限制请求的速率,避免系统因流量突增而崩溃。它的核心思想是:

系统维护一个“令牌桶”,按照固定的速率向桶中添加令牌,当请求到达时,需要消耗桶中的令牌才能被处理。如果桶中没有令牌,请求会被丢弃或限流。

2. 令牌桶算法的工作流程

  • 令牌按照固定速率 r(如每秒 10 个)加入桶中。
  • 桶最多可以容纳b 个令牌,如果桶满了,新来的令牌就会被丢弃。
  • 处理请求时,每个请求需要消耗 1 个令牌。
  • 如果桶中有足够的令牌,请求就被放行(即正常处理)。
  • 如果桶中没有足够的令牌,请求会被拒绝(限流)或排队等待。

3. 适用场景

  • API 限流(如限制用户访问频率)
  • 流量控制(如保护数据库、Redis、Kafka 等后端服务)
  • 带宽管理(如 QoS 处理)

总结

  • 令牌桶允许短暂的突发流量,比漏桶更灵活。

  • 速率可控,适用于 API 限流、服务保护等场景。

  • 实现简单,性能高,广泛用于分布式系统。


漏桶

1. 漏桶算法的定义

漏桶(Leaky Bucket)是一种流量整形(Traffic Shaping)和速率限制(Rate Limiting)算法,主要用于平滑流量,防止突发请求对系统造成冲击。

核心思想:请求进入一个“漏桶”,桶中的请求以固定速率流出,如果桶满了,新请求将被丢弃。

2. 漏桶算法的工作流程

  1. 请求进入桶中,如果桶未满,数据进入队列等待处理。
  2. 以固定速率处理请求,不管流量有多大,处理速率始终不变(如每秒处理 5 个请求)。
  3. 如果桶满了,新请求会被丢弃,防止系统过载。
  4. 保证流量平滑,避免瞬时高并发压垮系统。

3. 适用场景

  • 网络流量控制:避免突发流量导致带宽拥塞。
  • API 调用限流:控制 API 每秒的调用量,防止服务过载。
  • 消息队列限流:保证消费者按固定速率消费消息,避免系统崩溃。

总结

  • 漏桶算法平滑流量,即使流量突增,也会以固定速率处理请求,防止系统崩溃。

  • 不允许突发流量,严格控制请求流出速率,适用于流量整形、网络流量控制等场景。


令牌桶 vs 漏桶

令牌桶和漏桶都是流量控制(Rate Limiting)算法,主要用于限制请求速率,防止流量过载

对比项 令牌桶(Token Bucket) 漏桶(Leaky Bucket)
核心思想 令牌按照固定速率生成,只有拿到令牌的请求才能通过 请求进入桶后按固定速率流出,超出桶容量的请求被丢弃
流量控制 限制请求速率,但允许突发流量 严格控制请求流出速率,不允许突发流量
速率特点 允许短时间突发,但平均速率受控 速率恒定,保证稳定流量输出
流量超出处理 桶中无令牌时,新请求被限流 桶满时,新请求被丢弃
适用场景 API 限流、带宽管理、流量控制 流量整形、带宽控制、网络流量管理
典型应用 限制 QPS(请求数)、防止突发流量冲击后端 控制请求流量,防止系统瞬间超载

✅ 如果希望允许短时间的流量突发:用令牌桶
✅ 如果希望严格控制请求流出速率,使流量平稳:用漏桶

作者

ShiHaonan

发布于

2025-03-03

更新于

2025-03-13

许可协议

评论