Begrenzung der Anfragehäufigkeit (Rate Limiting) in Java: Überblick über Bibliotheken und Tools
\n\nRate 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\n1. Guava RateLimiter (einfach und leichtgewichtig)
\n\nDie 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.
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\nBeispiel für die Verwendung von Guava RateLimiter:
\n\nimport 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\nVorteile: Minimale Abhängigkeit, Einfachheit, geringer Speicherverbrauch.
\nNachteile: Nicht geeignet für verteilte Systeme (keine Synchronisation zwischen Instanzen).
2. Bucket4j (fortschrittlicher Token Bucket mit Redis-Unterstützung)
\n\nBucket4j 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\nWesentliche 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
Beispiel mit In-Memory-Speicher:
\n\nimport 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\nVorteile: Flexible Konfiguration, verteilte Unterstützung, hohe Leistung.
\nNachteile: Mehr Abhängigkeiten als bei Guava.
3. Resilience4j RateLimiter (für Microservice-Architekturen)
\n\nResilience4j ist eine Bibliothek zur Gewährleistung von Ausfallsicherheit, die das Modul RateLimiter enthält. Sie wurde entwickelt unter Berücksichtigung
Auch in der Bibliothek
Datenvalidierung in TypeScript: Bibliotheken Zod, Yup und io-ts
iTextSharp für C# (.NET): Komplettguide mit Beispielen
Arbeiten mit CSV in Java: Vollständige Anleitung zum Lesen und Schreiben
Beste Logging-Bibliotheken für Go (Golang): Überblick und Vergleich
PDF-Generierung in Rust: Überblick über Bibliotheken und Werkzeuge zur Erstellung von PDF-Dokumenten