Rate Limiting in Java: Bibliotheken und Tools zur Anfragenkontrolle (Bucket4j, Resilience4j)

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Begrenzung der Anfragehäufigkeit (Rate Limiting) in Java: Überblick über Bibliotheken und Tools

\n\n

Rate Limiting (Begrenzung der Anfragehäufigkeit) ist ein kritischer Mechanismus zum Schutz von Webdiensten, APIs und Microservices vor Überlastung, DDoS-Angriffen und versehentlichem Missbrauch. In Java gibt es mehrere ausgereifte Bibliotheken, die verschiedene Algorithmen implementieren: vom einfachen Zähler bis hin zu komplexen verteilten Systemen. In diesem Artikel betrachten wir drei Hauptansätze: Guava RateLimiter, Bucket4j und Resilience4j und diskutieren deren Anwendung.

\n\n

1. Guava RateLimiter (einfach und leichtgewichtig)

\n\n

Die Bibliothek Google Guava bietet die Klasse RateLimiter, die den Algorithmus Token Bucket (Token-Eimer) im Single-Thread-Modus implementiert. Sie ist ideal für die lokale Verwendung in einem einzigen JVM-Prozess geeignet.

\n\n

Funktionsprinzip: Der Eimer wird mit einer bestimmten Geschwindigkeit mit Token gefüllt. Jede Anfrage entnimmt einen oder mehrere Token. Sind nicht genügend Token vorhanden, wird der Thread blockiert oder die Anfrage abgelehnt.

\n\n

Beispiel für die Verwendung von Guava RateLimiter:

\n\n
import com.google.common.util.concurrent.RateLimiter;\n\npublic class GuavaRateLimiterExample {\n    public static void main(String[] args) {\n        // Erstellen eines RateLimiters für 10 Anfragen pro Sekunde\n        RateLimiter rateLimiter = RateLimiter.create(10.0);\n\n        // Simulation eingehender Anfragen\n        for (int i = 0; i < 20; i++) {\n            // tryAcquire() gibt true zurück, wenn ein Token erhalten wurde\n            if (rateLimiter.tryAcquire()) {\n                System.out.println("Anfrage " + i + " ausgeführt");\n            } else {\n                System.out.println("Anfrage " + i + " abgelehnt (Limit überschritten)");\n            }\n        }\n    }\n}\n
\n\n

Vorteile: Minimale Abhängigkeit, Einfachheit, geringer Speicherverbrauch.
\nNachteile: Nicht geeignet für verteilte Systeme (keine Synchronisation zwischen Instanzen).

\n\n

2. Bucket4j (fortschrittlicher Token Bucket mit Redis-Unterstützung)

\n\n

Bucket4j ist eine Bibliothek, die den Token-Bucket-Algorithmus mit erweiterten Funktionen implementiert: Unterstützung mehrerer Anbieter zur Zustandsspeicherung (in-memory, Redis, Hazelcast, Infinispan), was den Einsatz in verteilten Szenarien ermöglicht.

\n\n

Wesentliche Merkmale:

\n
    \n
  • Unterstützung von greedy- und interval-based-Modi.
  • \n
  • Möglichkeit, Limits für verschiedene Zeitfenster festzulegen (z. B. 100 Anfragen pro Minute + 10 Anfragen pro Sekunde).
  • \n
  • Integration mit Jakarta EE / Spring Boot über vorgefertigte Filter und Annotationen.
  • \n
\n\n

Beispiel mit In-Memory-Speicher:

\n\n
import io.github.bucket4j.Bandwidth;\nimport io.github.bucket4j.Bucket;\nimport io.github.bucket4j.Refill;\n\nimport java.time.Duration;\n\npublic class Bucket4jExample {\n    public static void main(String[] args) {\n        // Limit: 5 Anfragen in 10 Sekunden\n        Bandwidth limit = Bandwidth.classic(5, Refill.intervally(5, Duration.ofSeconds(10)));\n        Bucket bucket = Bucket.builder()\n                .addLimit(limit)\n                .build();\n\n        for (int i = 0; i < 10; i++) {\n            if (bucket.tryConsume(1)) {\n                System.out.println("Anfrage " + i + " erlaubt");\n            } else {\n                System.out.println("Anfrage " + i + " blockiert");\n            }\n        }\n    }\n}\n
\n\n

Vorteile: Flexible Konfiguration, verteilte Unterstützung, hohe Leistung.
\nNachteile: Mehr Abhängigkeiten als bei Guava.

\n\n

3. Resilience4j RateLimiter (für Microservice-Architekturen)

\n\n

Resilience4j ist eine Bibliothek zur Gewährleistung von Ausfallsicherheit, die das Modul RateLimiter enthält. Sie wurde entwickelt unter Berücksichtigung

Empfehlungen