Cet article étudie principalement Ratelimit - le contenu pertinent de l'utilisation de la goyave pour effectuer une restriction de flux d'interface, comme suit.
1. Description du problème
Un jour, M. A a soudainement constaté que le nombre de demandes d'interface était soudainement passé à 10 fois la précédente. Peu de temps après, l'interface était presque inutilisable et a déclenché une réaction en chaîne qui a provoqué l'effondrement de l'ensemble du système. Comment gérer cette situation? La vie nous donne la réponse: par exemple, les commutateurs à l'ancienne sont équipés de fusibles. Une fois que quelqu'un utilise un équipement super puissant, le fusible sera soufflé pour protéger chaque appareil contre le fait de brûler par un fort courant. De même, notre interface doit également être installée avec un "fusible" pour empêcher la paralysie du système causée par une pression excessive sur le système par des demandes imprévues. Lorsque le trafic est trop important, des mécanismes tels que le rejet ou le drainage peuvent être adoptés.
2. Algorithmes limitant couramment utilisés
Il existe deux algorithmes limitants de courant couramment utilisés: l'algorithme de godet qui fuit et l'algorithme de godet de jeton.
L'idée de l'algorithme de seau qui fuit est très simple. Veuillez d'abord entrer dans le seau qui fuit. Le seau qui fuit sortira à une certaine vitesse. Lorsque la demande d'eau est trop grande, elle débordera directement. On peut voir que l'algorithme de godet qui fuit peut limiter de force le taux de transmission des données.
Figure 1 Diagramme schématique de l'algorithme de godet divulgué
Pour de nombreux scénarios d'application, en plus de pouvoir limiter le taux de transmission moyen des données, il est également nécessaire pour permettre un certain degré de transmission de rafale. À l'heure actuelle, l'algorithme de godet divulgué peut ne pas convenir et l'algorithme de godet de jeton est plus approprié. Comme le montre la figure 2, le principe de l'algorithme de godet de jeton est que le système mettra un jeton dans le seau à une vitesse constante. Si la demande doit être traitée, il est nécessaire d'obtenir d'abord un jeton à partir du seau. Lorsqu'il n'y a pas de jeton dans le seau, le service sera refusé.
Figure 2 Diagramme schématique de l'algorithme de seau de jeton
3. Ratelimiter dans la classe d'outils limite actuelle
La boîte à outils open source de Google fournit la classe Ratelimiter, qui est basée sur "l'algorithme de godet de jeton" et est très pratique à utiliser. Pour l'utilisation spécifique de cette interface de classe, veuillez vous référer à la pratique d'utilisation du Ratelimiter.
Ratelimiter utilisant la démo
Package Ratelimite; import com.google.common.util.concurrent.rateliter; classe publique RatelimiterDemo {public static void main (String [] args) {TestNorateliter (); testWithrateliter ();} public static Void testNorArneliter () {long start = System.currenttimemillis; i <10; i ++) {System.out.println ("Call Exécuter .." + i);} long fin = System.currentTimeMillis (); System.out.println (end - start);} public static Void testwithrateliter () {long start = System.currenttimeLis (); que 10 tâches par seconde sont soumises pour (int i = 0; i <10; i ++) {limiter.acquire (); // demande Ratelimiter, dépasser les permis seront bloqués System.out.println ("Call Exécuter .." + i);} long fin = System.currenttimemillis (); system.out.println (fin - start);}} Quatre Guava Connurrence: EcoutableFuture et Ratelimiter Exemple
concept
Écoute-écoutable, comme son nom l'indique, est un avenir qui peut être écouté, c'est une amélioration prolongée de l'avenir indigène de Java. Nous savons que Future représente une tâche de calcul asynchrone, et les résultats de calcul peuvent être obtenus lorsque la tâche est terminée. Si nous voulons obtenir les résultats et les afficher à l'utilisateur une fois le calcul terminé ou faire d'autres calculs, nous devons utiliser un autre thread pour interroger constamment l'état de calcul. Cela rend le code complexe et inefficace. Utilisez des goyave à écouter pour nous aider à détecter si l'avenir est terminé. S'il est terminé, la fonction de rappel sera automatiquement appelée, ce qui peut réduire la complexité du programme simultané.
La deuxième méthode est recommandée, car la deuxième méthode peut obtenir directement la valeur de retour des erreurs futures ou de gestion. En substance, la deuxième méthode est obtenue en mobilisant la première méthode et une encapsulation supplémentaire est effectuée.
En outre, écouterablefuture a plusieurs autres implémentations intégrées:
SettableFuture: il n'est pas nécessaire d'implémenter une méthode pour calculer la valeur de retour, mais seule une valeur fixe est nécessaire pour retourner comme valeur de retour. Vous pouvez définir la valeur de retour ou les informations d'exception de cet avenir via le programme.
CheckEdFUture: Ceci est hérité de l'interface écoutable. Il fournit la méthode CheckEdget (). Cette méthode peut lancer une exception du type spécifié lorsqu'une exception se produit dans la future exécution.
Ratelimiter est similaire au sémaphore de JDK. Il est utilisé pour limiter le nombre de threads pour accéder simultanément aux ressources. Cet article présente l'utilisation de Ratelimiter.
Exemple de code
Importer java.util.concurrent.callable; import java.util.concurrent.executionException; import java.util.concurrent.executors; importer java.util.concurrent.futunit; import. com.google.common.util.concurrent.futures; import com.google.common.util.concurrent.ListeableFuture; import com.google.common.util.concurrent com.google.common.util.concurrent.rateliter; classe publique écoutéablefutureDemo {public static void main (String [] args) {TestRatelimiter (); TestListenableFuture ();} / ** * Ratelimiter est similaire à l'accès JDK Semest TestRateliTiter () {écoutexECUTORSERVICE exécutorService = MoreExECUTORS .ListeningDecorator (Exécutors.NewCachedThreadPool ()); Ratelimiter limiter = Ratelimiter.Create (5.0); // pas plus de 4 tasks sont soumis par seconde pour (int i = 0; i <10; i ++) Ratelimiter, les permis dépassant seront bloqués finaux écoutables Future <Integer> écoutablefuture = exécutor-service .submit (new tâche ("is" + i));}} public static void TestenableFuture () {écouterxECUTORSERVICE EXECTROCHERNICE = MoreExECUTORS. Final écoutableFuture <Integer> écoutéablefuture = EMMIRICESERVICE .SUMMIT (nouvelle tâche ("TestListenableFuture")); // Obtenez de manière synchrone le résultat de l'appel essayez {System.out.println (écoutablefuture.get ());} Catch (interruptedException e1) {e1.printStackTrace ();} catch (exécution E1) gens ExecutorService); // The Second Way Futures.AddCallback (écouterableFuture, nouveau FutureCallback <Integer> () {@Override public void onSuccess (Integer Result) {System.out .printLnn ("Get écouter le résultat de Future avec le callback" + résultat);} @ override public vide onfailure (Throwable T) {t.printStackTrace ();}});}} La tâche de classe implémente Calable <Integer> {String Str; Public Task (String Str) {this.str = str;} @ Override Public Integer Call () lève exception {System.out.println ("Call EXECUTE .." + str); TimeUnit.seconds.Sleep Sleep (1);Version de goyave
<dependency> <proupId> com.google.guava </rom groupeid> <Artifactid> Guava </ artifactid> <in version> 14.0.1 </ version> </Dependance>
Résumer
Ce qui précède est tout au sujet de Ratelimit - en utilisant des goyaves pour faire des exemples de code limitant le courant de l'interface. J'espère que ce sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à d'autres sujets connexes sur ce site. S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!