Mit der Entwicklung des Internets müssen viele Anwendungen den Fluss verschiedener Anfragen begrenzen. Dies liegt daran, dass die Anwendung bei hoher Parallelität einer großen Anzahl von Anforderungen ausgesetzt ist, was dazu führt, dass der Dienst abstürzt oder langsam reagiert. Um dieses Problem zu lösen, verwenden Entwickler normalerweise verteilte Strombegrenzungstechnologien, um den Anforderungsfluss zu steuern und die hohe Verfügbarkeit und Stabilität des Dienstes sicherzustellen. Als leistungsstarkes Speicherdatenspeichersystem ist Redis eine der am häufigsten verwendeten Lösungen zur verteilten Strombegrenzung. In diesem Artikel werden das Prinzip und die Implementierungsmethode der verteilten Strombegrenzung in Redis vorgestellt.
1. Was ist verteilte Strombegrenzung?
Unter verteilter Strombegrenzung versteht man den Prozess der Steuerung des Anforderungsverkehrs durch Zusammenarbeit zwischen mehreren Servern. Ein Ratenbegrenzer zählt die Anzahl der Anfragen, vergleicht die Rate der eingehenden Anfragen mit der zulässigen Rate und akzeptiert oder lehnt Anfragen basierend auf dem Verhältnis ab. Bei der verteilten Drosselung teilt jeder Knoten die Anforderungsrate und den Anforderungszähler, wodurch sichergestellt wird, dass die Rate für alle Knoten gleich ist und eine Überlastung eines Knotens vermieden wird.
2. Das Prinzip der Implementierung einer verteilten Strombegrenzung durch Redis
Redis verwendet seine integrierte Datenstruktur, insbesondere zset (sortierter Satz), um eine verteilte Strombegrenzung zu implementieren. Ein Zset ist eine sortierte Menge, bei der jedes Element eindeutig ist und eine Punktzahl hat. Die Punktzahl wird zum Sortieren von Elementen verwendet, normalerweise Zahlen oder Zeiten. Bei der verteilten Strombegrenzung können wir für jeden Benutzer (oder jede IP-Adresse) einen Zset festlegen und diesen Zset dann zum Speichern des Anforderungszählers des Benutzers verwenden. Wenn jede Anfrage eintrifft, speichern wir sie in einem Zset und erhöhen den Zähler mit dem INCRBY-Befehl von Redis. Anschließend übergeben wir die Anforderungsbewertung und den aktuellen Zeitstempel zusammen als Parameter an den Befehl zrangebyscore, um die Anforderungsrate innerhalb eines bestimmten Zeitbereichs zu berechnen. Wenn der Preis unseren zulässigen Preis überschreitet, wird die Anfrage abgelehnt.
3. Wie Redis die verteilte Strombegrenzung implementiert
Die spezifische Implementierung der verteilten Strombegrenzung durch Redis ist wie folgt:
Das Folgende ist ein Beispielcode, der zeigt, wie Redis verwendet wird, um eine verteilte Strombegrenzung zu implementieren. Unter anderem haben wir ein globales Zset verwendet, um den Anforderungszähler für jede IP-Adresse zu speichern, und den Befehl zrangebyscore verwendet, um die Anforderungsrate pro Sekunde zu berechnen.
import redis import time class RateLimiter(object): def __init__(self, redis_client, rate, key_prefix='limiter'): self.redis = redis_client self.rate = rate self.key_prefix = key_prefix def allow_request(self, ip): key = '%s:%s' % (self.key_prefix, ip) now = time.time() count = self.redis.zcount(key, now - 1, now) if count < self.rate: self.redis.zadd(key, now, now) return True return False if __name__ == '__main__': redis_client = redis.Redis() limiter = RateLimiter(redis_client, 5) for i in range(10): print(limiter.allow_request('192.168.1.1')) time.sleep(1)
Im obigen Code erstellen wir zunächst eine Klasse namens RateLimiter, die Redis als Backend-Speicher verwendet. Der Konstruktor akzeptiert zwei Parameter: Redis-Client-Instanz und Ratenlimit. Wann immer wir die Methode „allow_request“ aufrufen, akzeptiert sie einen Parameter, der eine IP-Adresse darstellt, und prüft dann, ob die Anzahl der Anfragen für diese IP-Adresse das Ratenlimit überschreitet. Wenn der Wert nicht überschritten wird, wird die Anforderung erfasst und „True“ zurückgegeben. Andernfalls wird die Anforderung abgelehnt und „False“ zurückgegeben.
In der Hauptfunktion haben wir eine Instanz namens limiter erstellt, das Ratenlimit auf 5 gesetzt (d. h. bis zu 5 Anfragen pro Sekunde akzeptieren) und dann 10 aufeinanderfolgende Anfragen simuliert, mit einem Intervall von 1 Sekunde zwischen jeder Anfrage. Zu Beginn der 6. Anfrage werden alle Anfragen abgelehnt und „False“ zurückgegeben, da das Ratenlimit erreicht ist.
4. Zusammenfassung
Redis ist ein leistungsstarkes Speicherdatenspeichersystem, das eine Vielzahl von Datenstrukturen bereitstellt, insbesondere Zset (Sorted Set), das eine ideale Wahl für die Implementierung einer verteilten Strombegrenzung ist. Durch die Verwendung von Funktionen wie den Befehlen zset, INCRBY und zrangebyscore von Redis können wir problemlos eine verteilte Strombegrenzung implementieren, um den Anforderungsfluss zu steuern und die hohe Verfügbarkeit und Stabilität des Dienstes sicherzustellen.
Das obige ist der detaillierte Inhalt vonDas Prinzip und die Implementierungsmethode von Redis zur Implementierung einer verteilten Strombegrenzung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!