令牌桶

作者: baby_honour | 来源:发表于2018-11-23 09:07 被阅读16次

对于很多应用场景来说,除了要求能够限制数据的平均传输速率外,还要求允许某种程度的突发传输。这时候漏桶算法可能就不合适了,令牌桶算法更为适合。令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。

设置 Rate = 2 :每秒放入令牌的个数
桶的大小:100

public class TokenDemo {

  //qps:每秒钟处理完请求的次数;tps:每秒钟处理完的事务次数
  //代表qps是10;
  RateLimiter rateLimiter = RateLimiter.create(10);

  public void doSomething(){
      if (rateLimiter.tryAcquire()){//rateLimiter.acquire()
          //尝试获得令牌.为true则获取令牌成功
          System.out.println("正常处理");
      }else{
          System.out.println("处理失败");
      }

  }

  public static void main(String args[]) throws IOException{
      /*
      * CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量,此值是线程将要等待的操作数(线程的数量)。
      * 当某个线程为了想要执行这些操作而等待时, 它要使用 await()方法。
      * 此方法让线程进入休眠直到操作完成。
      * 当某个操作结束,它使用countDown() 方法来减少CountDownLatch类的内部计数器,计数器的值就会减1。
      * 当计数器到达0时,它表示所有的线程已经完成了任务,这个类会唤醒全部使用await() 方法休眠的线程们恢复执行任务。
      *
      * */
      CountDownLatch latch = new CountDownLatch(1);
      Random random = new Random(10);
      TokenDemo tokenDemo = new TokenDemo();
      for (int i=0;i<20;i++){
          new Thread(()->{
              try {
                  latch.await();
                  Thread.sleep(random.nextInt(1000));
                  tokenDemo.doSomething();
              }catch (InterruptedException e){
                  e.printStackTrace();
              }

          }).start();
      }
      latch.countDown();
      System.in.read();
  }

}

结果:

正常处理
正常处理
正常处理
正常处理
正常处理
处理失败
正常处理
处理失败
处理失败
处理失败
正常处理
处理失败
正常处理
处理失败
正常处理
正常处理
正常处理
正常处理
处理失败
处理失败

漏桶:漏桶算法能强行限制数据的传输速率。

请求先进入到漏桶里,漏桶以一定的速度出水。当水请求过大会直接溢出,可以看出漏桶算法能强行限制数据的传输速率。进入端无需考虑出水端的速率,就像mq消息队列一样,provider只需要将消息传入队列中,而不需要关心Consumer是否接收到了消息。
对于溢出的水,就是被过滤的数据,可以直接被丢弃,也可以通过某种方式暂时保存,如加入队列之中,像线程池里对溢出数据的4种处理机制一样

相关文章

  • Nginx 限流配置(转)

    限流算法: 1. 令牌桶算法 算法思想是: 令牌以固定速率产生,并缓存到令牌桶中;令牌桶放满时,多余的令牌被丢弃;...

  • Nginx限流配置(转载)

    1、限流算法 令牌桶算法 算法思想是:a、令牌以固定速率产生,并缓存到令牌桶中;b、令牌桶放满时,多余的令牌被丢弃...

  • nginx限流算法

    1 限流算法 1.令牌桶 算法思想:*令牌以固定速率产生,并缓存到令牌桶中;*令牌桶放满时,多余的令牌被丢弃;*请...

  • 流控的那些事儿

    令牌桶算法令牌桶控制基于令牌桶是否存在令牌可以发送流量,每一个令牌是一个字节。当请求过来会消耗桶内中的令牌。另一边...

  • 令牌桶算法

    1、桶中每秒放入r个令牌 2、桶中最多能放入b个令牌,当令牌到达时令牌桶已经满了,令牌将被丢弃或放入缓存中 3、当...

  • 漏桶算法与令牌桶算法的区别

    令牌桶算法是通过控制令牌生成的速度进行限流,漏桶算法是控制请求从桶中流出的速度进行限流。简单理解为:令牌桶控制进,...

  • 【5分钟背八股】令牌桶限流算法是什么?

    令牌桶算法,是增加一个大小固定的容器,也就是令牌桶,系统以恒定的速率向令牌桶中放入令牌,如果有客户端来请求,先需要...

  • 令牌桶

    对于很多应用场景来说,除了要求能够限制数据的平均传输速率外,还要求允许某种程度的突发传输。这时候漏桶算法可能就不合...

  • Redisson限流器(RateLimiter)

    尝试获取令牌lua脚本解析 令牌桶配置(每分钟产生一个令牌) 令牌桶占用情况 分值:当时的时间 元素:随机数+申请...

  • 基础架构 | 限流算法

    限流算法 令牌桶算法 漏桶算法

网友评论

      本文标题:令牌桶

      本文链接:https://www.haomeiwen.com/subject/khpdqqtx.html