Bucket4j Java: Vollständiges Rate-Limiting-Tutorial

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

Bucket4j für Java: Vollständiges Rate-Limiting-Tutorial

In der modernen Softwareentwicklung, insbesondere bei der Erstellung hochfrequenter Webdienste und APIs, ist es entscheidend, die Intensität eingehender Anfragen zu kontrollieren. Ohne diese Kontrolle kann ein einzelner böswilliger Benutzer oder ein Systemfehler zu einem Dienstausfall (DoS) für alle anderen Kunden führen. Hier kommt das Konzept des Rate Limitings ins Spiel, und die Bibliothek Bucket4j ist eines der leistungsstärksten und flexibelsten Werkzeuge für dessen Implementierung auf der Java-Plattform.

Bucket4j ist eine threadsichere Java-Bibliothek, die auf dem Token-Bucket-Algorithmus basiert. Sie ermöglicht Entwicklern, die Häufigkeit von Operationen einfach und effizient zu begrenzen: die Anzahl der HTTP-API-Anfragen, Datenbankaufrufe, Nachrichtenversand usw. Im Gegensatz zu einfachen Zählern glättet der Token-Bucket-Algorithmus die Last, indem er kurzfristige Traffic-Spitzen zulässt, aber die durchschnittliche Rate langfristig strikt einhält. Dies macht ihn zur idealen Wahl für die meisten realen Szenarien.

Warum Bucket4j verwenden? Erstens schützt es Ihr Backend vor Überlastung und Angreifern. Zweitens ermöglicht es die Implementierung mehrstufiger Tarifpläne (Premium-Nutzer erhalten mehr Anfragen pro Sekunde). Drittens bietet die Bibliothek eine umfangreiche API für die Feineinstellung, einschließlich verschiedener Token-Wiederherstellungsstrategien, Unterstützung für verteilte Systeme über Redis oder Hazelcast und Integration mit gängigen Frameworks wie Spring Boot. Bucket4j ist kein bloßer "Platzhalter", sondern ein vollwertiges Produktionstool.

Installation

Bucket4j wird über das zentrale Maven-Repository (Maven Central) verteilt. Um die Bibliothek in Ihr Projekt einzubinden, müssen Sie die Abhängigkeit in Ihre pom.xml (für Maven) oder build.gradle (für Gradle) einfügen.

Maven (pom.xml):

<dependency>
    <groupId>com.github.vladimir-bukhtoyarov</groupId>
    <artifactId>bucket4j-core</artifactId>
    <version>8.7.0</version>
</dependency>

Gradle (build.gradle):

implementation 'com.github.vladimir-bukhtoyarov:bucket4j-core:8.7.0'

Wichtig: Version 8.x erfordert Java 11 oder höher. Wenn Sie Java 8 verwenden, benötigen Sie Version 7.x. Für die Arbeit mit verteilten Caches (Redis, Hazelcast) müssen die entsprechenden Module hinzugefügt werden, z. B. bucket4j-redis.

Schnellstart: Minimales Arbeitsbeispiel

Lassen Sie uns einen einfachen Ratenbegrenzer erstellen, der nicht mehr als 10 Operationen pro Sekunde zulässt.

import io.github.bucket4j.Bandwidth;
import io.github.bucket4j.Bucket;
import io.github.bucket4j.Refill;

import java.time.Duration;

public class QuickStartExample {

    public static void main(String[] args) {
        // 1. Konfiguration: 10 Token, Auffüllung mit 10 Token pro Sekunde
        Bandwidth limit = Bandwidth.classic(10, Refill.greedy(10, Duration.ofSeconds(1)));

        // 2. Bucket erstellen
        Bucket bucket = Bucket.builder()
                .addLimit(limit)
                .build();

        // 3. Anfragen simulieren
        for (int i = 1; i <= 15; i++) {
            boolean consumed = bucket.tryConsume(1);
            if (consumed) {
                System.out.println("Anfrage " + i + ": Erfolgreich (Token erhalten)");
            } else {
                System.out.println("Anfrage " + i + ": ABGELEHNT (Limit überschritten)");
            }
        }
    }
}

Dieser Code erstellt einen Bucket mit 10 Token. Jede Sekunde werden 10 neue Token hinzugefügt (greedy refill – Token werden kontinuierlich hinzugefügt, nicht als Batch am Ende des Intervalls). Die ersten 10 Anfragen werden sofort ausgeführt.

Empfehlungen