令牌桶和漏桶
点击阅读更多查看文章内容
令牌桶
1. 令牌桶算法的定义
令牌桶(Token Bucket)是一种流量控制算法,用于限制请求的速率,避免系统因流量突增而崩溃。它的核心思想是:
系统维护一个“令牌桶”,按照固定的速率向桶中添加令牌,当请求到达时,需要消耗桶中的令牌才能被处理。如果桶中没有令牌,请求会被丢弃或限流。
2. 令牌桶算法的工作流程
- 令牌按照固定速率 r(如每秒 10 个)加入桶中。
- 桶最多可以容纳b 个令牌,如果桶满了,新来的令牌就会被丢弃。
- 处理请求时,每个请求需要消耗 1 个令牌。
- 如果桶中有足够的令牌,请求就被放行(即正常处理)。
- 如果桶中没有足够的令牌,请求会被拒绝(限流)或排队等待。
3. 适用场景
- API 限流(如限制用户访问频率)
- 流量控制(如保护数据库、Redis、Kafka 等后端服务)
- 带宽管理(如 QoS 处理)
总结
令牌桶允许短暂的突发流量,比漏桶更灵活。
速率可控,适用于 API 限流、服务保护等场景。
实现简单,性能高,广泛用于分布式系统。
漏桶
1. 漏桶算法的定义
漏桶(Leaky Bucket)是一种流量整形(Traffic Shaping)和速率限制(Rate Limiting)算法,主要用于平滑流量,防止突发请求对系统造成冲击。
核心思想:请求进入一个“漏桶”,桶中的请求以固定速率流出,如果桶满了,新请求将被丢弃。
2. 漏桶算法的工作流程
- 请求进入桶中,如果桶未满,数据进入队列等待处理。
- 以固定速率处理请求,不管流量有多大,处理速率始终不变(如每秒处理 5 个请求)。
- 如果桶满了,新请求会被丢弃,防止系统过载。
- 保证流量平滑,避免瞬时高并发压垮系统。
3. 适用场景
- 网络流量控制:避免突发流量导致带宽拥塞。
- API 调用限流:控制 API 每秒的调用量,防止服务过载。
- 消息队列限流:保证消费者按固定速率消费消息,避免系统崩溃。
总结
漏桶算法平滑流量,即使流量突增,也会以固定速率处理请求,防止系统崩溃。
不允许突发流量,严格控制请求流出速率,适用于流量整形、网络流量控制等场景。
令牌桶 vs 漏桶
令牌桶和漏桶都是流量控制(Rate Limiting)算法,主要用于限制请求速率,防止流量过载
| 对比项 | 令牌桶(Token Bucket) | 漏桶(Leaky Bucket) |
|---|---|---|
| 核心思想 | 令牌按照固定速率生成,只有拿到令牌的请求才能通过 | 请求进入桶后按固定速率流出,超出桶容量的请求被丢弃 |
| 流量控制 | 限制请求速率,但允许突发流量 | 严格控制请求流出速率,不允许突发流量 |
| 速率特点 | 允许短时间突发,但平均速率受控 | 速率恒定,保证稳定流量输出 |
| 流量超出处理 | 桶中无令牌时,新请求被限流 | 桶满时,新请求被丢弃 |
| 适用场景 | API 限流、带宽管理、流量控制 | 流量整形、带宽控制、网络流量管理 |
| 典型应用 | 限制 QPS(请求数)、防止突发流量冲击后端 | 控制请求流量,防止系统瞬间超载 |
✅ 如果希望允许短时间的流量突发:用令牌桶
✅ 如果希望严格控制请求流出速率,使流量平稳:用漏桶

