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