漏桶算法详解

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

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

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

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

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

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

    // 桶的容量
    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;  }  } } 

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

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值