令牌桶和漏桶

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

令牌桶

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

许可协议

评论