Verwendung von Verbrauchergruppen in Redis Streams

Roshan Kumar ist Senior Product Manager bei Redis Labs.

Redis Streams ist eine neue Datenstruktur, die in Redis 5.0 eingeführt wurde und mit der Sie Datenströme erstellen und verwalten können. In einem früheren Artikel habe ich gezeigt, wie man Daten zu einem Stream hinzufügt und wie man die Daten auf verschiedene Arten liest. In diesem Artikel werde ich erklären, wie Verbrauchergruppen in Redis Streams verwendet werden. Eine Verbrauchergruppe ist eine Möglichkeit, einen Nachrichtenstrom auf mehrere Clients aufzuteilen, um die Verarbeitung zu beschleunigen oder die Last für langsamere Verbraucher zu verringern.

In einer perfekten Welt arbeiten sowohl Datenproduzenten als auch -konsumenten im gleichen Tempo, und es gibt keinen Datenverlust oder Datenstau. Leider ist das in der realen Welt nicht der Fall. In fast allen Anwendungsfällen der Echtzeit-Datenstromverarbeitung arbeiten Hersteller und Verbraucher mit unterschiedlichen Geschwindigkeiten. Darüber hinaus gibt es mehr als einen Verbrauchertyp, von denen jeder seine eigenen Anforderungen und sein eigenes Verarbeitungstempo hat. Redis Streams begegnet diesem Bedarf mit einem Funktionsumfang, der sich stark auf die Unterstützung der Verbraucher konzentriert. Eines der wichtigsten Merkmale ist die Verbrauchergruppe.

Wann wird eine Redis Streams-Verbrauchergruppe verwendet?

Der Zweck von Verbrauchergruppen besteht darin, Ihren Datenverbrauchsprozess zu skalieren. Betrachten wir ein Beispiel - eine Bildverarbeitungsanwendung. Die Lösung erfordert drei Hauptkomponenten:

  1. Ein Produzent (vielleicht eine oder mehrere Kameras), der Bilder aufnimmt und speichert;
  2. Redis Stream, der Bilder (in einem Stream-Datenspeicher) in der Reihenfolge ihres Eintreffens speichert; und
  3. Ein Bildprozessor, der jedes Bild verarbeitet. 
Redis Labs

Angenommen, Ihr Produzent speichert 500 Bilder pro Sekunde und der Bildprozessor verarbeitet nur 100 Bilder pro Sekunde bei voller Kapazität. Dieser Ratenunterschied führt zu einem Rückstand, und Ihr Bildprozessor kann niemals aufholen. Eine einfache Möglichkeit, dieses Problem zu beheben, besteht darin, fünf Bildprozessoren (wie in Abbildung 2 dargestellt) auszuführen, die jeweils einen sich gegenseitig ausschließenden Satz von Bildern verarbeiten. Sie können dies über eine Verbrauchergruppe erreichen, mit der Sie Ihre Workloads partitionieren und an verschiedene Verbraucher weiterleiten können.

Redis Labs

Eine Verbrauchergruppe leistet mehr als nur Datenpartitionierung - sie gewährleistet Datensicherheit und ermöglicht die Notfallwiederherstellung.

Funktionsweise einer Redis Streams-Verbrauchergruppe

Eine Verbrauchergruppe ist eine Datenstruktur innerhalb eines Redis-Streams. Wie in Abbildung 3 dargestellt, können Sie sich eine Verbrauchergruppe als eine Sammlung von Listen vorstellen. Eine andere vorstellbare Sache ist eine Liste von Artikeln, die von keinem Verbraucher konsumiert werden. Für unsere Diskussion nennen wir dies eine „nicht konsumierte Liste“. Sobald Daten im Stream ankommen, werden sie sofort in die nicht verbrauchte Liste verschoben.

Redis Labs

Die Verbrauchergruppe führt für jeden Verbraucher eine separate Liste, in der Regel mit einer angehängten Anwendung. In Abbildung 3 verfügt unsere Lösung über N identische Anwendungen (App 1, App 2,… App n), die Daten über Consumer 1, Consumer 2,… Consumer n lesen.

Wenn eine App Daten mit dem Befehl XREADGROUP liest, werden bestimmte Dateneinträge aus der Liste der nicht verbrauchten Einträge entfernt und in die Liste der ausstehenden Einträge verschoben, die dem jeweiligen Verbraucher gehört. Somit verbrauchen keine zwei Verbraucher dieselben Daten.

Wenn die App den Stream mit dem XACK-Befehl benachrichtigt, wird das Element schließlich aus der Liste der ausstehenden Einträge des Verbrauchers entfernt.

Nachdem ich die Grundlagen der Verbrauchergruppen erläutert habe, wollen wir uns eingehender mit der Funktionsweise dieses Datenlebenszyklus befassen.

Erstellen einer Redis Streams-Verbrauchergruppe

Sie können eine neue Verbrauchergruppe mit dem Befehl XGROUP CREATE erstellen (siehe unten).

XGROUP CREATE mystream mygroup $ MKSTREAM

Wie bei XREAD weist ein $ -Zeichen am Ende des Befehls den Stream an, ab diesem Zeitpunkt nur noch neue Daten zu liefern. Die alternative Option ist 0 oder eine andere ID aus dem Stream-Eintrag. Bei Verwendung von 0 liefert der Stream alle Daten vom Anfang des Streams.

MKSTREAM erstellt einen neuen Stream, in diesem Fall mystream, falls dieser noch nicht vorhanden ist.

Lesen und Verwalten von Redis Stream-Daten

Angenommen, Sie haben einen Redis-Stream (mystream) und haben bereits eine Verbrauchergruppe (mygroup) erstellt, wie oben gezeigt. Sie können jetzt Elemente mit den Namen a, b, c, d, e wie im folgenden Beispiel hinzufügen.

XADD mystream * name a

Wenn Sie diesen Befehl für die Namen a bis e ausführen, werden Redis Stream, mystream und die nicht verbrauchte Liste der Verbrauchergruppe mystream ausgefüllt. Dies ist in Abbildung 4 dargestellt.

Redis Labs

Hier können Sie sehen, dass die Verbraucher Alice und Bob ihre Arbeit noch nicht begonnen haben. App A verbraucht Daten über den Verbraucher Alice, während App B Daten über Bob verbraucht.

Verbrauch von Redis Streams-Daten

Der Befehl zum Lesen von Daten aus einer Gruppe lautet XREADGROUP. In unserem Beispiel ruft App A, wenn sie mit der Datenverarbeitung beginnt, den Verbraucher (Alice) auf, um Daten abzurufen, wie in:

XREADGROUP GROUP mygroup COUNT 2 Alice STREAMS mystream>

In ähnlicher Weise liest App B die Daten über Bob wie folgt:

XREADGROUP GROUP mygroup COUNT 2 Bob STREAMS mystream>

Das Sonderzeichen> am Ende weist Redis Streams an, nur Dateneinträge abzurufen, die nicht an andere Verbraucher gesendet werden. Beachten Sie auch, dass keine zwei Verbraucher dieselben Daten verwenden, was dazu führt, dass Daten aus der nicht verbrauchten Liste nach Alice und Bob verschoben werden (siehe Abbildung 5).

Redis Labs

Verarbeitete Nachrichten aus Listen ausstehender Einträge entfernen

Die Daten in den Listen der ausstehenden Einträge Ihrer Kunden bleiben dort, bis App A und App B Redis Streams bestätigen, dass sie die Daten erfolgreich konsumiert haben. Dies erfolgt mit dem Befehl XACK. Zum Beispiel würde App A nach dem Konsumieren von d und e, die die IDs 1526569411111-0 und 1526569411112-0 haben, Folgendes bestätigen.

XACK mystream mygroup 1526569411111-0 1526569411112-0

Die Kombination von XREADGROUP und XACK entspricht dem Starten und Festschreiben einer Transaktion, wodurch die Datensicherheit gewährleistet wird. 

Nehmen wir nach dem Ausführen von XACK an, dass App A XREADGROUP wie unten gezeigt ausgeführt hat. Jetzt sieht die Datenstruktur wie in Abbildung 6 aus.

XREADGROUP GROUP mygroup COUNT 2 Alice STREAMS mystream>
Redis Labs

Wiederherstellung nach Fehlern

Wenn App B aufgrund eines Fehlers während der Verarbeitung von b und c beendet wird, sieht die Datenstruktur wie in Abbildung 7 aus.

Redis Labs

Jetzt haben Sie zwei Möglichkeiten:

1. Starten Sie App B neu und laden Sie die Daten vom Consumer (Bob) neu.

In diesem Fall muss App B Daten von Ihrem Verbraucher (Bob) mit dem Befehl XREADGROUP lesen, jedoch mit einem Unterschied. Anstelle von> am Ende würde App B 0 übergeben (oder die ID niedriger als die vorherige Dateneingabe, die verarbeitet wurde). Denken Sie daran, dass> neue Daten aus der nicht verbrauchten Liste an den Verbraucher sendet.

XREADGROUP GROUP mygroup COUNT 2 Bob STREAMS mystream 0

Mit dem obigen Befehl werden Dateneinträge abgerufen, die bereits in der Liste für Consumer Bob gespeichert sind. Es werden keine neuen Daten aus der nicht verbrauchten Liste abgerufen. App B könnte alle Daten im Consumer-Bob durchlaufen, bevor neue Daten abgerufen werden.

2. Erzwinge Alice, alle Daten von Bob zu fordern und sie über App A zu verarbeiten.

Dies ist besonders hilfreich, wenn Sie App B aufgrund eines Knoten-, Festplatten- oder Netzwerkfehlers nicht wiederherstellen können. In solchen Fällen kann jeder andere Verbraucher (z. B. Alice) die Daten von Bob beanspruchen und diese Daten weiter verarbeiten, wodurch Ausfallzeiten des Dienstes vermieden werden. Um Bobs Daten zu erhalten, müssen Sie zwei Befehlssätze ausführen:

XPENDING mystream mygroup - + 10 Bob

Dadurch werden alle ausstehenden Dateneinträge für Bob abgerufen. Die Optionen - und + rufen den gesamten Bereich ab. Wenn b und c die IDs 1526569411113-0 bzw. 1526569411114-0 hatten, lautet der Befehl, mit dem Bobs Daten nach Alice verschoben werden, wie folgt:

XCLAIM mystream mygroup Alice 0 1526569411113-0 1526569411114-0

Verbrauchergruppen verwalten eine laufende Uhr für Daten in der Verbrauchsliste. Wenn App B beispielsweise b liest, wird die Uhr aktiviert, bis Bob die Bestätigung erhält. Mit der Option time im Befehl XCLAIM können Sie die Verbrauchergruppe anweisen, nur Daten zu verschieben, die länger als eine bestimmte Zeit im Leerlauf sind. Sie können dies auch ignorieren, indem Sie 0 übergeben, wie im obigen Beispiel gezeigt. Das Ergebnis dieser Befehle ist in Abbildung 8 dargestellt. XCLAIM ist auch nützlich, wenn einer Ihrer Consumer-Prozessoren langsam ist, was zu einem Rückstand an unverarbeiteten Daten führt.

Redis Labs

Im vorherigen Artikel haben wir die Grundlagen der Verwendung von Redis Streams behandelt. Wir sind in diesem Artikel etwas tiefer gegangen und haben erklärt, wann Verbrauchergruppen verwendet werden sollen und wie sie funktionieren. Verbrauchergruppen in Redis Streams reduzieren Ihre Belastung bei der Verwaltung von Datenpartitionen, deren Lebenszyklen und Datensicherheit. Darüber hinaus können die Skalierungsfunktionen von Verbrauchergruppen vielen Echtzeitanwendungen zugute kommen.

In einem bevorstehenden dritten Artikel über Redis Streams werde ich zeigen, wie eine Echtzeit-Klassifizierungsanwendung mit Redis Streams und Lettuce, einer Java-basierten Open Source-Bibliothek für Redis, entwickelt wird. In der Zwischenzeit können Sie mehr erfahren, indem Sie das Redis Streams-Tutorial auf der Redis-Projektwebsite durcharbeiten. 

Roshan Kumar ist Senior Product Manager bei  Redis Labs . Er verfügt über umfangreiche Erfahrung in der Softwareentwicklung und im Technologiemarketing. Roshan hat bei Hewlett-Packard und vielen erfolgreichen Silicon Valley-Startups gearbeitet, darunter ZillionTV, Salorix, Alopa und ActiveVideo. Als begeisterter Programmierer entwarf und entwickelte er mindzeal.com, eine Online-Plattform, auf der Computerprogrammierkurse für junge Studenten angeboten werden. Roshan hat einen Bachelor-Abschluss in Informatik und einen MBA von der Santa Clara University.

- -

Das New Tech Forum bietet einen Ort, an dem Sie neue Unternehmenstechnologien in beispielloser Tiefe und Breite erkunden und diskutieren können. Die Auswahl ist subjektiv, basierend auf unserer Auswahl der Technologien, die wir für wichtig und für die Leser von größtem Interesse halten. akzeptiert keine Marketingmaterialien zur Veröffentlichung und behält sich das Recht vor, alle eingebrachten Inhalte zu bearbeiten. Senden Sie alle Anfragen an  [email protected] .