Wie implementiert man einen zentralen Rate-Limit-Manager via Redis, um globale IP-Sperren in einem distribuierten Cluster zu vermeiden?

Die Implementierung eines zentralen Rate-Limit-Managers erfolgt über eine Redis-Instanz, die als globaler State-Store für alle Cluster-Knoten fungiert. Anstatt lokale Counter in den Applikationsinstanzen zu führen, delegieren wir die Zählung und Zeitsteuerung an Redis, um eine konsistente Sicht auf die Request-Rate pro Ziel-IP oder Domain zu gewährleisten.

Wir setzen hierbei auf Lua-Skripte, um die Operationen atomar auszuführen. Dies verhindert Race-Conditions, die bei einem einfachen GET gefolgt von einem SET in einer distribuierten Umgebung auftreten würden.

MethodeFunktionsweiseVorteilNachteil
Fixed WindowZähler pro ZeitintervallGeringer SpeicherbedarfBurst-Probleme an Intervallgrenzen
Sliding WindowZeitstempel-Liste pro KeyHohe PräzisionHöherer Speicherverbrauch
Token BucketToken-AuffüllrateGlättung von TrafficKomplexere Logik

Für die Umsetzung im Bereich Data Engineering nutzen wir primär den Sliding Window Log Ansatz. Dabei speichern wir jeden Request-Zeitstempel in einem Redis-Sorted-Set (ZSET). Der technische Ablauf ist wie folgt definiert:

  1. Bereinigung: Entfernen aller Einträge, die älter als das definierte Zeitfenster sind (ZREMRANGEBYSCORE).
  2. Prüfung: Zählen der verbleibenden Elemente im Set (ZCARD).
  3. Validierung: Wenn die Anzahl unter dem Limit liegt, wird der aktuelle Zeitstempel hinzugefügt (ZADD).
  4. Lifecycle: Setzen eines TTL (Time-to-Live) für den Key, um Speicherlecks bei inaktiven IPs zu vermeiden.

Durch diese Architektur wird sichergestellt, dass unabhängig von der Anzahl der Cluster-Knoten die aggregierte Request-Rate niemals die Schwelle des Zielsystems überschreitet. Die Latenz wird durch die In-Memory-Natur von Redis minimiert, während die globale Konsistenz gewahrt bleibt.

Wir empfehlen den Einsatz von Lua-Skripten gegenüber einer clientseitigen Logik, da nur so die strikte Konsistenz gewahrt bleibt. Ein rein clientseitiger Ansatz führt bei hoher Last unweigerlich zu Over-Limit-Requests und damit zu IP-Sperren. Die Nutzung von Redis-Clustern mit Sharding ist bei extrem hohen Durchsatzraten vorzuziehen, um Performance-Bottlenecks am einzelnen Redis-Knoten zu vermeiden.

Sergej Wiens

Sergej Wiens

Gründer & Software Architekt