2017-06-02 2 views
0

J'ai joué avec un système d'étranglement et je suis tombé sur le Guava RateLimiter. De ce que je peux dire les deux principales façons dont il gère la limitation sont soit en mettant en file d'attente les demandes de recouvrement (les méthodes .acquire (...)) ou en les rejetant (les méthodes tryAcquire (...)Goyave RateLimiter Bursting

J'étais penser qu'il y aurait une option qui autoriserait les demandes jusqu'à la quantité spécifiée et seulement après avoir atteint ladite file d'attente limite ou les demandes d'abandon.

Par exemple:

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

Ce serait alors imprimer cinq bips, omettre les cinq prochaines puis imprimer cinq fois

Suis-je le seul à penser que ce serait une caractéristique très pratique, d'avoir ou Ai-je manqué le point?

courtoisie Code d'essai de: Throttling method calls using Guava RateLimiter class

Répondre

1

Ce serait alors imprimer cinq bips, omettre les cinq prochaines puis imprimer cinq fois

Ajout d'une file d'attente de taille fixe ne sera pas vraiment faire ça marche de cette façon.

Vous fournissez l'entrée émet un signal sonore à un taux fixe de 10 par seconde, afin d'ajouter une file d'attente d'entrée de 5 va juste amortir un 10 initial émet un bip, puis il va commencer à sauter tous les bip, comme ça:

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

et ce (à part les premiers éléments) ne diffère pas de ce qu'un RateLimiter cru fera déjà:

1 
3 
5 
7 
9 
11 
13 
15 
17 
19 

en outre l'ajout d'une file d'attente à la RateLimiter serait r Il lui faut commencer à accepter des tâches asynchrones, ce qui ne ressemble pas vraiment à une responsabilité naturelle, donc il va probablement faire un mauvais design.

+0

Je ne veux pas ajouter une file d'attente de taille fixe. Je veux juste qu'il accepte le premier nombre de demandes dans la période de temps Y. Ensuite, omettez ou mettez en file d'attente les prochains messages entrants (selon la fonctionnalité déjà existante). Une fois l'intervalle coché, acceptez à nouveau X et répétez. Espérons que cela a du sens? – Rhed