文档章节

guava RateLimiter 实现原理

暗中观察
 暗中观察
发布于 07/04 20:21
字数 253
阅读 9
收藏 0

RateLimiter 是guava 用于限流的工具类,是限制每秒能有多少个请求放行的意思

原理大致是这样的:计算出多少us 内可以放行多少请求

为了提升效率,它是会计算下一次要执行的时间点,如果到了这个时间点才执行,否则会进行sleep 等待

  public double acquire(int permits) {
    long microsToWait = reserve(permits);
    stopwatch.sleepMicrosUninterruptibly(microsToWait);
    return 1.0 * microsToWait / SECONDS.toMicros(1L);
  }
sleep 等待逻辑在stopwatch.sleepMicrosUninterruptibly(microsToWait);

 public static void sleepUninterruptibly(long sleepFor, TimeUnit unit) {
    boolean interrupted = false;
    try {
      long remainingNanos = unit.toNanos(sleepFor);
      long end = System.nanoTime() + remainingNanos;
      while (true) {
        try {
          // TimeUnit.sleep() treats negative timeouts just like zero.
          NANOSECONDS.sleep(remainingNanos);
          return;
        } catch (InterruptedException e) {
          interrupted = true;
          remainingNanos = end - System.nanoTime();
        }
      }
    } finally {
      if (interrupted) {
        Thread.currentThread().interrupt();
      }
    }

 

© 著作权归作者所有

暗中观察

暗中观察

粉丝 7
博文 128
码字总数 45846
作品 0
惠州
私信 提问
【Guava】使用Guava的RateLimiter做限流

一、常见的限流算法 目前常用的限流算法有两个:漏桶算法和令牌桶算法。 1.漏桶算法 漏桶算法的原理比较简单,请求进入到漏桶中,漏桶以一定的速率漏水。当请求过多时,水直接溢出。可以看出...

大海201506
2018/09/19
164
0
限流分析(Guava RateLimter)

一般系统为了防止服务被调用的QPS超出其承载能力,防止大流量压垮服务器造成雪崩后果,设计时往往会加入限流的逻辑。通过限流,当请求超出系统的服务能力时,系统可以采取拒绝服务/排队等待/...

robin-yao
2016/11/19
2.1K
1
Guava RateLimiter限流源码解析和实例应用

在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流 缓存的目的是提升系统访问速度和增大系统处理容量 降级是当服务出现问题或者影响到核心流程时,需要暂时屏蔽掉,待高峰或者问题...

算法之名
05/26
175
0
聊聊Guava的RateLimiter

序 本文主要研究一下Guava的RateLimiter RateLimiter guava-26.0-jre-sources.jar!/com/google/common/util/concurrent/RateLimiter.java 这里主要看acquire以及tryAcquire方法 acquire主要依......

go4it
2018/08/31
77
0
接口限流算法:漏桶算法和令牌桶算法

漏桶算法 漏桶可以看作是一个带有常量服务时间的单服务器队列,如果漏桶(包缓存)溢出,那么数据包会被丢弃。这一点和线程池原理是很相似的。 把请求比作是水,水来了都先放进桶里,并以限定...

铁骨铮铮
05/23
155
0

没有更多内容

加载失败,请刷新页面

加载更多

java数据类型

基本类型: 整型:Byte,short,int,long 浮点型:float,double 字符型:char 布尔型:boolean 引用类型: 类类型: 接口类型: 数组类型: Byte 1字节 八位 -128 -------- 127 short 2字节...

audience_1
16分钟前
2
0
太全了|万字详解Docker架构原理、功能及使用

一、简介 1、了解Docker的前生LXC LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C++中的NameSpa...

Java技术剑
17分钟前
1
0
Wifiphisher —— 非常非常非常流氓的 WIFI 网络钓鱼框架

编者注:这是一个非常流氓的 WIFI 网络钓鱼工具,甚至可能是非法的工具(取决于你的使用场景)。在没有事先获得许可的情况下使用 Wifiphisher 攻击基础网络设施将被视为非法活动。使用时请遵...

红薯
47分钟前
36
1
MongoDB 4 on CentOS 7安装指南

本教程为CentOS x86_64 7.x操作系统下,MongoDB Community x86_64 4.2(GA)安装指南。 安装方式一:yum repo在线安装 [此方式较为简单,官方推荐] Step1:新建MongDB社区版Yum镜像源。 # vim ...

王焱君
48分钟前
2
0
go-micro 入门教程1.搭建 go-micro环境

微服务的本质是让专业的人做专业的事情,做出更好的东西。 golang具备高并发,静态编译等特性,在性能、安全等方面具备非常大的优势。go-micro是基于golang的微服务编程框架,go-micro操作简单...

非正式解决方案
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部