151 votes

Limitation des appels de méthode aux demandes M en N secondes

J'ai besoin d'un composant / classe qui limite l'exécution de certaines méthodes à un maximum de M appels en N secondes (ou ms ou nanos, peu importe).

En d'autres termes, je dois m'assurer que ma méthode n'est pas exécutée plus de M fois dans une fenêtre glissante de N secondes.

Si vous ne connaissez pas la classe existante, n'hésitez pas à publier vos solutions / idées sur la manière de la mettre en œuvre.

91voto

Michael Borgwardt Points 181658

J'utilisais un tampon en anneau d'horodatages de taille fixe M. Chaque fois que la méthode est appelée, vous vérifiez l'entrée la plus ancienne et, si elle est inférieure à N secondes, vous exécutez et ajoutez une autre entrée, sinon vous dormez. pour le décalage horaire.

87voto

schnatterer Points 730

Ce qui a fonctionné hors de la boîte pour moi était Google Guava RateLimiter .

 // Allow one request per second
private RateLimiter throttle = RateLimiter.create(1.0);

private void someMethod() {
    throttle.acquire();
    // Do something
}
 

30voto

erickson Points 127945

En termes concrets, vous devriez être en mesure de mettre en œuvre des ce avec un DelayQueue. Initialiser la file d'attente avec M Delayed des cas avec leur délai initialement fixé à zéro. Que les demandes de la méthode venir dans, take d'un jeton, ce qui provoque la méthode de bloquer jusqu'à ce que la limitation de condition a été remplie. Lorsqu'un jeton a été prise, add un nouveau jeton à la file d'attente avec un retard d' N.

21voto

Kevin Points 19613

Lire sur le Token bucket algorithme. Fondamentalement, vous avez un seau avec des jetons. Chaque fois que vous exécutez la méthode, vous prenez un jeton. Si il n'y a pas plus de jetons, vous pouvez bloquer jusqu'à ce que vous en obtenir un. Pendant ce temps, il ya certaines acteur externe qui réapprovisionne les jetons à un intervalle fixe.

Je ne suis pas au courant d'une bibliothèque pour ce faire (ou quelque chose de similaire). Vous pouvez écrire ce logique dans votre code ou de l'utilisation AspectJ pour ajouter le comportement.

3voto

Eugene Yokota Points 43213

Bien que ce ne soit pas ce que vous avez demandé, ThreadPoolExecutor , conçu pour limiter à M demandes simultanées au lieu de M demandes en N secondes, pourrait également être utile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X