限流主要有以下几种算法:
- 固定窗口计数法
- 滑动窗口算法
- 漏洞算法
- 令牌桶算法
本篇介绍漏桶算法,具体的漏桶算法概念如下:
漏桶算法跟令牌桶比较类似,但实际上是两种策略。想了解令牌桶算法的可以看之前的文章。
下面我们看一下维基百科的图片:
如图所示,我们可以看到,整个算法其实十分简单。首先,我们有一个固定容量的桶,有水流进来,也有水流出去。对于流进来的水来说,我们无法预计一共有多少水会流进来,也无法预计水流的速度。但是对于流出去的水来说,这个桶可以固定水流出的速率。而且,当桶满了之后,多余的水将会溢出。当使用了漏桶算法,我们可以保证接口会以一个常速速率来处理请求
其实漏桶算法主要就是控制以下几个参数:
// 桶的容量
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;
}
}
}
以上就是最简单的漏洞算法实现啦,漏桶算法和令牌桶算法不同的是, 漏桶算法是一个匀速的执行,令牌桶支持突发以及预热,具体的需求看自己的需求吧。同时漏桶算法需要做溢出处理,而令牌桶不需要。
我等采石之人,当心怀大教堂之愿景!
欢迎关注我的公众号!!搬砖小金