漏桶算法

漏桶算法 是最为简单的限流算法,原理类似一个容积一定的木桶,有水源向该木桶加入水,但是流入的数量不确定,任意时刻的流入速率也是随机;而木桶底部有一个固定大小的洞,以恒定的速率向外漏水;这样,桶中流出水的速率恒定,而当桶满了的时候,水会自然地溢出。

其中:桶中的水类比网络请求;流入的水代表新到达的请求,而流出的水代表被系统处理的请求。
可以看到:新到达的请求量以及频率是不确定的,而整个桶却能保持一定的最大容量,并且以恒定的速率处理请求(漏出水);当桶满时,即系统满负载时,新到达的请求被自然丢弃,这样即可确保系统能够始终以恒定的速率处理请求。

实际实现中,漏桶可以使用一个恒定容量的队列实现,系统以恒定的速率从队列中取出一定数量的请求进行处理;而当队满时,新到达的请求被丢弃。

优点:

  • (强制)保证稳定的流量控制,适用于流量稳定,没有或较少突发流量的场景
  • 易于理解,实现简单

缺点:

  • 速度相对稳定,缺乏弹性
  • 由于保持稳定的处理速率,导致无法应对突发流量(例如秒杀活动)

令牌桶算法

实际的网络应用中,常常存在着突发流量,此时 漏桶算法 便无法适应这种情况,令牌桶算法 能够在保持流量的平均传输速率时,也能允许一定的突发流量。

令牌桶算法 中,存在一个以大小一定的 令牌桶 ,用于存储一定数量的令牌,所有的数据都需要消耗令牌来放行;
而系统中有一个不断产生令牌的源,它向令牌桶中以恒定速率放入令牌。

而每一个数据包到达时,都要消耗与其大小相当数量的令牌;
如果桶中无令牌或令牌数量不足,则丢弃(或缓存)该数据包,否则将其放行(或处理)。

漏桶算法 不同,令牌桶算法 除了能够限制数据的平均传输速率外,还允许一定程度的突发传输。在突发流量的情况下爱,只要令牌桶中还存在足够的令牌,那么就允许不断传输数据,直到达到门限为止(取决于实际的配置)。

优点:

  • 保证稳定的平均传输速率,同时允许一定程度的突发流量
    缺点:
  • 内存消耗较大,例如对每一个用户都进行限制,就需要单独使用一个令牌桶,消耗大量资源
  • 无法保证任一时刻速率的平滑性

固定窗口计数器算法