Dieser Artikel untersucht hauptsächlich Ratelimit - der relevante Inhalt der Verwendung von Guaven zur Durchführung von Grenzflächenflussbeschränkungen wie folgt.
1. Problembeschreibung
Eines Tages stellte Mr. A plötzlich fest, dass die Anzahl der Anfragen für seine Schnittstelle plötzlich auf das 10 -fache des vorherigen stieg. Nicht lange danach war die Grenzfläche nahezu unbrauchbar und löste eine Kettenreaktion aus, die das gesamte System zusammenbrach. Wie geht es mit dieser Situation um? Das Leben gibt uns die Antwort: Zum Beispiel sind altmodische Schalter mit Sicherungen ausgestattet. Sobald jemand Super-Hochleistungsgeräte verwendet, wird die Sicherung geblasen, um jedes Gerät vor starkem Strom zu schützen. In ähnlicher Weise muss unsere Schnittstelle auch mit einer "Sicherung" installiert werden, um die durch unerwartete Anfragen durch übermäßige Druck auf das System verursachte Systemlähmung zu verhindern. Wenn der Verkehr zu groß ist, können Mechanismen wie Ablehnung oder Entwässerung eingesetzt werden.
2. häufig verwendete Strombegrenzungsalgorithmen
Es gibt zwei häufig verwendete Stromlimitalgorithmen: einen undichten Bucket -Algorithmus und Token -Bucket -Algorithmus.
Die Idee, dass der undichte Eimer -Algorithmus sehr einfach ist. Bitte geben Sie zuerst den undichten Eimer ein. Der undichte Eimer wird mit einer bestimmten Geschwindigkeit herauskommen. Wenn die Wasseranfrage zu groß ist, überflutet sie direkt. Es ist ersichtlich, dass der undichte Bucket -Algorithmus die Datenübertragungsrate gewaltsam einschränken kann.
Abbildung 1 schematisches Diagramm des durchgesickerten Eimeralgorithmus
Für viele Anwendungsszenarien ist zusätzlich zur Einschränkung der durchschnittlichen Übertragungsrate von Daten erforderlich, sondern auch einen gewissen Grad an Burst -Übertragung zu ermöglichen. Zu diesem Zeitpunkt ist der durchgesickerte Eimeralgorithmus möglicherweise nicht geeignet, und der Token -Eimer -Algorithmus ist besser geeignet. Wie in Abbildung 2 gezeigt, lautet das Prinzip des Token -Eimer -Algorithmus, dass das System mit konstanter Geschwindigkeit ein Token in den Eimer steckt. Wenn die Anfrage bearbeitet werden muss, ist es erforderlich, zuerst ein Token aus dem Eimer zu erhalten. Wenn der Eimer kein Token gibt, wird der Service verweigert.
2 schematisches Diagramm des Token -Eimer -Algorithmus
3.. Ratelimiter in der aktuellen Grenzwerkzeugklasse
Die Open -Source -Toolkit -Guave von Google bietet die Ratelimiter -Klasse, die auf dem "Token Bucket Algorithmus" basiert und sehr bequem zu verwenden ist. Für die spezifische Verwendung dieser Klassenschnittstelle finden Sie in der Nutzungspraxis der Ratelimiter.
Ratelimiter mit Demo
Paket ratelimit; import com.google.common.util.concurrent i <10; als 10 Aufgaben pro Sekunde werden für (int i = 0; i <10; i ++) {limiter.acquire (); // Ratelimiter anfordern, die Genehmigungen werden blockiert. Vier Guave -Parallelität: hörbarer Future und Ratelimiter Beispiel
Konzept
ListenableFuture ist, wie der Name schon sagt, eine Zukunft, die angehört werden kann. Es ist eine erweiterte Verbesserung für die in Java Native Future. Wir wissen, dass die Zukunft eine asynchrone Berechnungsaufgabe darstellt und die Berechnungsergebnisse erhalten werden können, wenn die Aufgabe abgeschlossen ist. Wenn wir die Ergebnisse abrufen und dem Benutzer nach Abschluss der Berechnung oder anderen Berechnungen anzeigen möchten, müssen wir einen anderen Thread verwenden, um den Berechnungsstatus ständig abzufragen. Dies macht den Code komplex und ineffizient. Verwenden Sie ListenableFableFuture -Guave, um zu erkennen, ob die Zukunft abgeschlossen ist. Wenn es abgeschlossen ist, wird die Rückruffunktion automatisch aufgerufen, die die Komplexität des gleichzeitigen Programms verringern kann.
Die zweite Methode wird empfohlen, da die zweite Methode den Rückgabewert der zukünftigen oder den Handlungsfehler direkt erhalten kann. Im Wesentlichen wird die zweite Methode erreicht, indem die erste Methode mobilisiert wird und eine weitere Einkapselung durchgeführt wird.
Darüber hinaus verfügt ListenableFuture über mehrere andere integrierte Implementierungen:
SETABLEFTUTURE: Es besteht keine Notwendigkeit, eine Methode zur Berechnung des Rückgabewerts zu implementieren, sondern es ist nur ein fester Wert erforderlich, um die Rückgabe als Rückgabewert zu erhalten. Sie können den Rückgabewert oder die Ausnahmeinformationen dieser Zukunft über das Programm festlegen.
CheckedFuture: Dies ist eine von der HörableFuture -Schnittstelle geerbte. Es bietet die checkedGet () -Methode. Diese Methode kann eine Ausnahme des angegebenen Typs machen, wenn eine Ausnahme in zukünftiger Ausführung auftritt.
Ratelimiter ähnelt dem Semaphor von JDK. Es wird verwendet, um die Anzahl der Threads zu begrenzen, um gleichzeitig auf Ressourcen zuzugreifen. In diesem Artikel wird die Verwendung von Ratelimiter eingeführt.
Codebeispiel
importieren java.util.concurrent com.google.common.util.concurrent.futures; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent com.google.common.util.concurrent.Ratelimiter; public class hörbarFuturedemo {public static void main (String [] args) {testRatelimiter (); testInsableableFuture ();}/*** Rasing -Zugriffs -Semester -Semester -Semester -Semester -Semester -Semester -Semester -Semester -Semester -Semester -Semester -Semester -Semester -Semester -Semester -Semester -Semester -Semester -Semestern. testRatelimiter () {HörenexecutorService ExecutorService = moreExecutors .ListingDeCorator (Executors.NewCachedThreadpool ()); ratelimiter limiter = ratelimiter.create (5.0); // nicht mehr als 4 Aufgaben werden pro Sekunde eingereicht (int i = 0; RATELIMiter, überschreitende Genehmigungen werden endgültige ListenablableFuture <Integer> ListenableFuture = ExecutorService .Submit (neue Aufgabe ("IS"+ I);}} public static voidElennableFableFuture () {Hörenexecutorsservice -Dienstleistungsdscutors). endgültige ListenableFuture <Neger> ListenableFuture = ExecutorService .SubMit (neue Task ("testListenableFuture"); // Synchron den Aufrufergebnis try {system.out.println (ListeningableFuture.get ()); {e1.printStacktrace ();} // Der erste Weg hörbare Future.AddListener (new Runnable () {@Override public void run () {try {system.out.println ("Hörable Future's Ergebnis" + Hörensfuture.get (); ExecutorService); // Der zweite Weg futures.addcallback (hörbarer Future, neuer FutureCallback <Integer> () {@Override public void OnSuccess (Integer -Ergebnis) {System.out .println oderGuavenversion
<Depopenty> <gruppe> com.google.guava </Groupid> <artifactId> Guava </artifactid> <version> 14.0.1 </Version> </abhängig>
Zusammenfassen
Bei der oben genannten Bezirks geht es um Ratelimit - Verwenden von Guave, um Schnittstellenstromlimit -Codebeispiele zu erstellen. Ich hoffe, es wird für alle hilfreich sein. Interessierte Freunde können weiterhin auf andere verwandte Themen auf dieser Website verweisen. Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen. Vielen Dank an Freunde für Ihre Unterstützung für diese Seite!