漏桶算法详解

1,437 阅读2分钟

限流主要有以下几种算法:

  • 固定窗口计数法
  • 滑动窗口算法
  • 漏洞算法
  • 令牌桶算法

本篇介绍漏桶算法,具体的漏桶算法概念如下:

漏桶算法跟令牌桶比较类似,但实际上是两种策略。想了解令牌桶算法的可以看之前的文章。 下面我们看一下维基百科的图片:

如图所示,我们可以看到,整个算法其实十分简单。首先,我们有一个固定容量的桶,有水流进来,也有水流出去。对于流进来的水来说,我们无法预计一共有多少水会流进来,也无法预计水流的速度。但是对于流出去的水来说,这个桶可以固定水流出的速率。而且,当桶满了之后,多余的水将会溢出。当使用了漏桶算法,我们可以保证接口会以一个常速速率来处理请求

其实漏桶算法主要就是控制以下几个参数:

    // 桶的容量
    public int capacity = 10;
    // 当前水量
    public int water = 0;
    //水流速度/s
    public int rate = 4;
    // 最后一次加水时间
    public long lastTime = System.currentTimeMillis();

代码具体逻辑如下:

public class LeakyDemo {
        public long timeStamp = System.currentTimeMillis(); // 当前时间
        public int capacity; // 桶的容量
        public int rate; // 水漏出的速度
        public int water; // 当前水量(当前累积请求数)

        public boolean acquire() {
            long now = System.currentTimeMillis();
            water = max(0, water - (now - timeStamp) * rate); // 先执行漏水,计算剩余水量
            timeStamp = now;
            if ((water + 1) < capacity) {
                // 尝试加水,并且水还未满
                water += 1;
                return true;
            } else {
                // 水满,拒绝加水
                return false;
        }
    }
}

以上就是最简单的漏洞算法实现啦,漏桶算法和令牌桶算法不同的是, 漏桶算法是一个匀速的执行,令牌桶支持突发以及预热,具体的需求看自己的需求吧。同时漏桶算法需要做溢出处理,而令牌桶不需要。

我等采石之人,当心怀大教堂之愿景! 欢迎关注我的公众号!!搬砖小金