zoukankan      html  css  js  c++  java
  • Guava限流工具RateLimiter使用

    公司最近在推一个限流工具接入,提供的功能有单机限流、集群限流等。想了解一下限流的原理和设计,看了一下wiki里面有提到用了guava的ratelimiter工具,查了一些资料了解了一下

    主要的限流算法有: 漏斗算法和令牌桶算法

    漏斗算法: 往漏斗里面放请求,我的理解漏斗就是一个变量或者集合。在以固定的速率去消费这些请求,如果请求超过了漏斗的容量,就溢出,即被限流

    令牌桶算法: 以一定的速度向一个桶(一个变量或者其他设计)放令牌(变量加1)。请求来了,去桶里获取令牌,如果获取到,就执行。没有获取到,阻塞,看源码,应该是sleep了一段时间

    写了一个demo, 很简单

    guava maven依赖

    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>27.0-jre</version>
    </dependency>

    RateLimiter.java

    import com.google.common.util.concurrent.RateLimiter;
    
    /**
     * @Author: <guanxianseng@163.com>
     * @Description:
     * @Date: Created in : 2018/11/4 3:02 PM
     **/
    public class RateLimiterDemo {
        public static void main(String[] args) {
            testWithRateLimiter();
        }
    
    
        public static void testWithRateLimiter() {
            RateLimiter limiter = RateLimiter.create(1.0); // 每秒不超过1个任务被提交
            for (int i = 0; i < 1000; i++) {
                double timeWaited = limiter.acquire(); // 请求RateLimiter, 超过permits会被阻塞
                System.out.println("time waited: " + timeWaited);
            }
        }
    
    }

    备注: 这里被限流的请求可能会一直被hold住,如果想立刻返回可以使用tryAcquire()这个guava api

    后面还需要查资料,看下源码

    1. 怎么放令牌的

    2. 怎么取令牌的

    3. sleep的时间怎么计算的

  • 相关阅读:
    Hello,Cnblogs,I'm Kxia
    运维
    CRT 操作数据库乱码
    STM32 各引脚功能
    遍历结果集
    更换税控服务器主板后,重新申请注册码
    修改远程桌面端口号
    nginx 设置开机启动
    windows 日志清理批处理 设置到计划任务就可以每天清理日志了
    按关键字查找文件
  • 原文地址:https://www.cnblogs.com/luckygxf/p/9904658.html
Copyright © 2011-2022 走看看