5

Nehmen wir an, ich habe P-Prozesse, die einige Geschäftslogik auf N physischen Maschinen ausführen. Diese Prozesse rufen zum Beispiel einen Web-Service S auf. Ich möchte sicherstellen, dass nicht mehr als X Anrufe pro Sekunde von allen P-Prozessen zusammen an den Dienst S gesendet werden.Wie wird der Distributed Rate Limiter implementiert?

Wie kann eine solche Lösung implementiert werden?

Google Guava Rate Limiter funktioniert gut für Prozesse, die auf Einzel-Box, aber nicht in verteilten Setup ausgeführt werden.

Gibt es für JAVA Standardlösungen, die sofort einsatzbereit sind? [kann auf Tierpfleger basieren]

Danke!

+1

Kurator (ein häufig verwendeter Java-ZooKeeper-Client) hat dieses genaue Rezept nicht. Allerdings hat Curator ein Distributed Long-Rezept, das als Grundlage dafür verwendet werden könnte: http://curator.apache.org/curator-recipes/distributed-atomic-long.html – Randgalt

+0

Hm, Semaphor ist kein gemeinsames Rezept für dieser Fall? http://curator.apache.org/curator-recipes/shared-semaphore.html –

+0

Problem mit gemeinsamem Semaphor ist, dass es jemanden gibt, der alle Sperren jede Sekunde freigibt. Ich denke, dass verteiltes Atom lange oder ganze Zahl geeignet sein wird, aber Ich habe meine Lösung noch nicht implementiert ... also nicht sicher –

Antwort

2

Ich habe an einer Open Source-Lösung für diese Art von Problemen gearbeitet.

Limitd ist ein "Server" für Grenzen. Die Grenzwerte werden mit der implementiert.

Grundsätzlich definieren Sie Grenzen in der Service-Konfiguration wie folgt aus:

buckets: 
    "request to service a": 
    per_minute: 10 
    "request to service b": 
    per_minute: 5 

Der Dienst als Daemon auf einem TCP/IP-Port lauscht ausgeführt wird.

Dann ist Ihre Anwendung etwas in dieser Richtung:

var limitd = new Limitd('limitd://my-limitd-address'); 

limitd.take('request to service a', 'app1' 1, function (err, result) { 
    if (result.conformant) { 
    console.log('everything is okay - this should be allowed'); 
    } else { 
    console.error('too many calls to this thing'); 
    } 
}); 

Wir derzeit verwenden diese für geschwindigkeitsbestimmend und Entprellung einige Anwendungsereignisse.

Der Server ist auf:

https://github.com/auth0/limitd

Wir planen auf mehrere SDKs zu arbeiten, aber jetzt wir nur node.js haben und teilweise umgesetzt gehen:

https://github.com/limitd

0

https://github.com/jdwyah/ratelimit-java bietet verteilte Rate Grenzen, die genau dies tun sollten. Sie können Ihr Limit als S pro Sekunde/Minute usw. konfigurieren und die Burst-Größe/Nachfüllrate des Leaky-Buckets unter den Deckeln auswählen.

1

Bucket4j ist Java-Implementierung von "Token-Bucket" Ratenbegrenzungsalgorithmus. Es funktioniert sowohl lokal als auch verteilt (zusätzlich zu JCache). Für den verteilten Anwendungsfall können Sie beliebige JCache-Implementierungen wie Hazelcast oder Apache Ignite auswählen. Siehe this example der Verwendung von Bucket4j im Cluster.