这是一个非常形象且重要的流量整形和速率限制算法。它主要用于控制数据发送到网络的速率,平滑网络上的突发流量。
核心思想
想象一个底部有一个小洞的桶:
水(请求/数据包) 以任意速率流入桶中。
如果水流入太快,桶会装满,多余的水会溢出(被丢弃/拒绝)。
桶底部的洞以一个恒定的速率漏水(处理请求/发送数据包)。
这个模型的核心在于:无论水流(请求)涌入的速度多快,水流出的速度始终是恒定的。
算法工作原理
在计算机科学中,这个比喻被抽象为以下几个组件:
桶:一个具有固定容量的队列或缓冲区。这个容量代表了系统能容忍的突发流量大小。
流入:来自外部的请求或数据包到达系统。
漏水:系统以固定的速率处理请求或发送数据包。
溢出:当桶满了之后,新到达的请求会被丢弃、拒绝或等待(取决于具体实现),这被称为“溢出”。
算法步骤(伪代码)
初始化:
设置桶的容量 capacity(例如,100个请求)。
设置漏水速率 leak_rate(例如,10个请求/秒)。
当前桶中的水量 water = 0。
上次漏水的时间 last_leak_time = 当前时间。
当一个新请求到达时:
a. 计算漏水量:先计算自上次处理以来,按照固定速率应该漏掉了多少水。
leaked_amount = (current_time – last_leak_time) * leak_rate
b. 更新水位:water = max(0, water – leaked_amount) (水位不能为负数)。
c. 更新上次漏水时间:last_leak_time = current_time
d. 判断桶是否已满:
- 如果 water < capacity:
- 请求被放入桶中(接受该请求)。
- water += 1
- 否则(water >= capacity):
- 请求被拒绝(溢出)。
系统有一个独立的进程或线程,以 leak_rate 的速率从桶的底部取出请求并进行处理。