2017-06-02 3 views
0

私は酔っぱらいシステムで遊んでいて、Guava RateLimiterを見つけました。私がどのように調整するのかは、過度の要求(.acquire(...)メソッド)をキューイングするか、それらを破棄すること(tryAcquire(...)メソッド)のどちらかであることがわかります。Guava RateLimiter Bursting

前記制限待ち行列に達した後、または要求を破棄した後にのみ、指定された量まで要求を許可するオプションが存在すると考える。例えば

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"); 
    } 
} 

これは、その後、5回のビープ音をプリントアウトし、次の5を省略し、再度

を5を印刷し、私はこれを考えて一つだけが持っている便利な機能だろうAMまたは私はポイントを逃していますか?

テストコードの礼儀: Throttling method calls using Guava RateLimiter class

答えて

1

これは、その後、5回のビープ音をプリントアウトし、次の5を省略して、固定サイズのキューが実際にすることはありません追加5再び

を印刷しますこのように動作します。あなたが入力を供給している

は、 はこれだけ最初の10回のビープ音、 を償却します5の入力キューを追加し、それがそのように、他のすべてのビープ音を飛ばし始めます毎秒10の一定の割合でビープ音を発する:

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

この(これらの最初の要素は離れて)生RateLimiterが既に何をするかと変わらない:

RateLimiterまただろうRにキューを追加
1 
3 
5 
7 
9 
11 
13 
15 
17 
19 

非同期タスクの受け入れを開始するようにしてください。これは実際には自然のようには聞こえません。RateLimiterというように、それはおそらく悪い設計になります。

+0

固定サイズのキューを追加したくありません。私はそれが期間Y以内に最初のXの量の要求を受け入れるようにしたいだけです。そして、(既存の機能性に応じて)次のメッセージを省略またはキューに入れます。間隔が一旦Xを受け入れたら、もう一度やり直してください。 希望ですか? – Rhed