• 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的时间怎么计算的

  • 相关阅读:
    MVC是什么?
    Slice Header中的field_pic_flag的含义?
    Slice header 中的frame_num的含义?
    上下文管理器 contextlib
    mixin模式特点
    Flask中路由原理
    使用Docker搭建Django,Nginx,R,Python部署环境
    使用Docker+Jenkins自动构建部署
    Jenkins 关闭和重启
    使用pipenv管理python项目
  • 原文地址:https://www.cnblogs.com/luckygxf/p/9904658.html
Copyright © 2020-2023  润新知