Guave ist RateLimiter pro Minuten statt Sekunden?
Ich versuche rate-Begrenzung der Anzahl der Konten, die ein Nutzer erstellen kann mit meinem REST-API.
Würde ich gerne nutzen Guave ist RateLimiter
dass nur eine IP-Adresse zu erstellen, sagen wir mal, 5 accounts innerhalb von 10 Minuten, aber die RateLimiter.create
Methode dauert nur ein double
Angabe der Zahl der Genehmigungen "pro Sekunde".
Gibt es eine Möglichkeit zu konfigurieren RateLimiter release erlaubt bei einer Korngröße, die größer als eine Sekunde?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aus der
RateLimiter.create
javadoc:So können Sie
permitsPerSecond
auf weniger als1.0
zu release eine Genehmigung, die weniger Häufig als einmal pro Sekunde.In Ihrem speziellen Fall, fünf Konten in zehn Minuten erleichtert, um ein Konto pro zwei Minuten, die ein Konto pro 120 Sekunden. Sie würde passieren
1.0/120
fürpermitsPerSecond
.In Ihrem Fall verwenden Sie wahrscheinlich wollen, um Platz für Burst-Anfragen für die Konto-Kreationen. Die
RateLimiter
Spezifikation nicht scheinen, um zu definieren, was passiert, um ungenutzte erlaubt, aber die default-Implementierung,SmoothRateLimiter
scheint, lassen die Genehmigungen anfallen, bis zu einem gewissen maximum zu befriedigen platzt. Diese Klasse ist nicht öffentlich, es gibt also keine javadoc-Dokumentation, aber dieSmoothRateLimiter
Quelle hat einen längeren Kommentar mit einer ausführlichen Diskussion des aktuellen Verhaltens.RateLimiter
keine release mehr als eine Genehmigung zu einer Zeit, aber Sie bauen vielleicht eine Art wrapper, wo eine Genehmigung von derRateLimiter
ist übersetzt in fünf accounts, die erstellt werden können, und legen Sie dieRateLimiter
um die Freigabe erlauben, alle zehn Minuten.Gibt es eine Klasse namens
SmoothRateLimiter.SmoothBursty
innen Guava-Bibliothek, die gewünschte Verhalten, aber es hat Paket den lokalen Zugriff, also können wir es nicht verwenden, direkt.Es gibt auch einen Github-issue, damit der Zugriff auf die Klasse public: https://github.com/google/guava/issues/1974
Wenn Sie nicht bereit sind zu warten, bis Sie eine neue version von RateLimiter dann können Sie mit Reflexion zu instanziieren
SmoothBursty
rate limiter. So etwas wie dies funktionieren sollte:Ja, neue version von Guave vielleicht Bremsen Sie Ihren code, aber wenn Sie bereit sind, zu akzeptieren, dass dieses Risiko könnte der Weg zu gehen.
Könnte man auch einstellen, dass es eine Genehmigung pro Sekunde und erwerben 120 Genehmigungen für jedes Konto.
Ich glaube, ich kam auf das gleiche problem wie in der ursprünglichen Frage, und basiert auf Louis Wasserman ist Kommentar dies ist, was ich hatte:
Die Dosis gemessen, die von der Titrator ist Analog zu einer Erlaubnis von einem RateLimiter. Diese Implementierung wird davon ausgegangen, dass, wenn Sie verbrauchen Ihre erste Dosis, die Uhr beginnt zu ticken auf der Anwendungsdauer. Sie können verbrauchen max Dosen pro Periode so schnell wie Sie wollen, aber, wenn Sie erreichen Ihre max, Sie haben zu warten, bis die Frist verstreicht, bevor man eine weitere Dosis.
Für eine
tryConsume()
analog zu RateLimiter isttryAcquire
würden Sie überprüfen, dassnumDosesAvailable
ist positiv.Nur falls Ihr es verpassen, die RateLimiter nicht angeben, was passiert mit dem nicht genutzten ermöglichen. Das Standardverhalten ist das speichern der nicht verwendete link bis zu einer minute RateLimiter.
The default RateLimiter configuration can save the unused permits of up to one second
Unsere Lösung HIERFÜR ist das erstellen einer RateLimiter Klasse auf unserer eigenen, und ändern Sie die Zeit-Einheiten. Zum Beispiel, in unserem Fall, wir wollen ein tägliches limit.
Alles das gleiche ist, wie die RateLimiter außer für den Erwerb(Genehmigungen) - Funktion, wo wir verändert die Zeiteinheit in (Doppel -) TimeUnit.SEKUNDEN.toMicros(1L), um die Einheit, die wir uns wünschen. In unserem Fall ändern wir das in TimeUnit.Tag für den täglichen Grenzen.
Dann erstellen wir unsere eigenen glatten RateLimiter und in der doSetRate(Doppel-permitsPerDay, lange nowMicros) und doGetRate () - Funktion, die wir auch ändern Sie die Zeiteinheit.