Guava限流工具RateLimiter使用

公司最近在推一個限流工具接入,提供的功能有單機限流、集羣限流等。想了解一下限流的原理和設計,看了一下wiki裏面有提到用了guava的ratelimiter工具,查了一些資料瞭解了一下java

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

漏斗算法: 往漏斗裏面放請求,個人理解漏斗就是一個變量或者集合。在以固定的速率去消費這些請求,若是請求超過了漏斗的容量,就溢出,即被限流api

令牌桶算法: 以必定的速度向一個桶(一個變量或者其餘設計)放令牌(變量加1)。請求來了,去桶裏獲取令牌,若是獲取到,就執行。沒有獲取到,阻塞,看源碼,應該是sleep了一段時間maven

寫了一個demo, 很簡單工具

guava maven依賴ui

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

RateLimiter.javagoogle

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 apispa

後面還須要查資料,看下源碼設計

1. 怎麼放令牌的code

2. 怎麼取令牌的

3. sleep的時間怎麼計算的

相關文章
相關標籤/搜索