2017-06-02 82 views
0

我一直玩弄一個打擊系統,並偶然發現了番石榴RateLimiter。從我可以告訴它處理節流的兩種主要方式是通過排隊請求(.acquire(...)方法)或通過丟棄它們(tryAcquire(...)方法)番石榴RateLimiter爆裂

我是認爲會有一個選項允許請求達到指定的數量,並且只有在達到所述限制隊列或放棄請求之後。

例如:

public static void main(String[] args) 
{ 
    try 
    { 
     RateLimiter limiter = RateLimiter.create(5.0); 
     //fictive call not saying it should be implemented this way 
     limiter.allowBursts(true); 
     for(int i = 0; i < 20; i++) 
     { 
      Thread.sleep(100); 
      performOperation(limiter); 
     } 
    } 
    catch(InterruptedException e) 
    { 
     e.printStackTrace(); 
    } 
} 

private static void performOperation(RateLimiter limiter) 
{ 
    if(limiter.tryAcquire()) 
    { 
     System.out.println(Instant.now() + ": Beep"); 
    } 
} 

這將然後打印出五聲蜂鳴聲,忽略未來五年,然後重新再打印五

我是唯一一個認爲這將是一個有用的功能,有或我錯過了這一點嗎?測試代碼禮貌的

Throttling method calls using Guava RateLimiter class

回答

1

這將然後打印出五聲蜂鳴聲,忽略未來五年,然後重新再打印五

添加一個固定大小的隊列不會真正使它以這種方式工作。

您提供輸入發出蜂鳴聲以10每秒固定的速率, 因此添加的5輸入隊列將只是緩衝的初始10所發出蜂鳴聲, 然後它將開始跳過所有其他蜂鳴聲,像:

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
12 
14 
16 
18 
20 

和這個(除了那些第一元素)是無論從什麼原料RateLimiter將已經做不同:

1 
3 
5 
7 
9 
11 
13 
15 
17 
19 

此外增加一個隊列到RateLimiter將ř意味着它開始接受異步任務,這聽起來不像是一種自然的責任,所以它可能會造成糟糕的設計。

+0

我們不想爲它添加固定大小的隊列。我只希望它在時間段Y內接受第一個X請求。然後忽略或排隊下一個包含的消息(根據已有的功能)。一旦間隔結束,再次接受X並重復。 希望它是有道理的? – Rhed