公司最近在推一個限流工具接入,提供的功能有單機限流、集羣限流等。想了解一下限流的原理和設計,看了一下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的時間怎麼計算的