Comment utiliser les groupes de consommateurs dans Redis Streams

Roshan Kumar est chef de produit senior chez Redis Labs.

Redis Streams est une nouvelle structure de données, introduite dans Redis 5.0, qui vous permet de créer et de gérer des flux de données. Dans un article précédent, j'ai montré comment ajouter des données à un flux et comment lire les données de plusieurs manières. Dans cet article, je vais vous expliquer comment utiliser les groupes de consommateurs dans Redis Streams. Un groupe de consommateurs est un moyen de diviser un flux de messages entre plusieurs clients pour accélérer le traitement ou alléger la charge pour les consommateurs plus lents.

Dans un monde parfait, les producteurs et les consommateurs de données travaillent au même rythme, et il n'y a pas de perte de données ni de retard de données. Malheureusement, ce n'est pas le cas dans le monde réel. Dans presque tous les cas d'utilisation du traitement de flux de données en temps réel, les producteurs et les consommateurs travaillent à des vitesses différentes. En outre, il existe plusieurs types de consommateurs, chacun ayant ses propres exigences et rythme de traitement. Redis Streams répond à ce besoin avec un ensemble de fonctionnalités qui gravite fortement vers le support des consommateurs. L'une de ses caractéristiques les plus importantes est le groupe de consommateurs.

Quand utiliser un groupe de consommateurs Redis Streams

Le but des groupes de consommateurs est d'étendre votre processus de consommation de données. Prenons un exemple - une application de traitement d'image. La solution nécessite trois composants principaux:

  1. Un producteur (une ou plusieurs caméras, peut-être) qui capture et stocke des images;
  2. Redis Stream qui enregistre les images (dans un magasin de données de flux) dans l'ordre où elles arrivent; et
  3. Un processeur d'image qui traite chaque image. 
Redis Labs

Supposons que votre producteur enregistre 500 images par seconde et que le processeur d'images ne traite que 100 images par seconde à sa pleine capacité. Cette différence de taux créera un retard et votre processeur d'image ne pourra jamais rattraper. Un moyen simple de résoudre ce problème consiste à exécuter cinq processeurs d'images (comme le montre la figure 2), chacun traitant un ensemble d'images mutuellement exclusives. Vous pouvez y parvenir via un groupe de consommateurs, qui vous permet de partitionner vos charges de travail et de les acheminer vers différents consommateurs.

Redis Labs

Un groupe de consommateurs fait plus que le partitionnement des données: il garantit la sécurité des données et permet la reprise après sinistre.

Fonctionnement d'un groupe de consommateurs Redis Streams

Un groupe de consommateurs est une structure de données dans un flux Redis. Comme le montre la figure 3, vous pouvez considérer un groupe de consommateurs comme une collection de listes. Une autre chose à imaginer est une liste d'articles qui ne sont consommés par aucun consommateur - pour notre discussion, appelons cela une «liste non consommée». Lorsque les données arrivent dans le flux, elles sont immédiatement placées dans la liste non consommée.

Redis Labs

Le groupe de consommateurs tient à jour une liste distincte pour chaque consommateur, généralement avec une application jointe. Dans la figure 3, notre solution a N applications identiques (App 1, App 2,…. App n) qui lisent les données via Consumer 1, Consumer 2,… Consumer n respectivement.

Lorsqu'une application lit des données à l'aide de la commande XREADGROUP, des entrées de données spécifiques sont supprimées de la liste non consommée et placées dans la liste des entrées en attente appartenant au consommateur respectif. Ainsi, deux consommateurs ne consommeront pas les mêmes données.

Enfin, lorsque l'application notifie le flux avec la commande XACK, elle supprime l'élément de la liste des entrées en attente du consommateur.

Maintenant que j'ai expliqué les bases des groupes de consommateurs, approfondissons le fonctionnement de ce cycle de vie des données.

Création d'un groupe de consommateurs Redis Streams

Vous pouvez créer un nouveau groupe de consommateurs à l'aide de la commande XGROUP CREATE, comme illustré ci-dessous.

XGROUP CREATE mystream mygroup $ MKSTREAM

Comme avec XREAD, un signe $ à la fin de la commande indique au flux de ne fournir que les nouvelles données à partir de ce moment. L'option alternative est 0 ou un autre ID de l'entrée de flux. Lorsque vous utilisez 0, le flux fournira toutes les données depuis le début du flux.

MKSTREAM crée un nouveau flux, mystream dans ce cas, s'il n'existe pas déjà.

Lire et gérer les données Redis Stream

Supposons que vous ayez un flux Redis (mystream) et que vous ayez déjà créé un groupe de consommateurs (mygroup) comme indiqué ci-dessus. Vous pouvez maintenant ajouter des éléments avec les noms a, b, c, d, e comme dans l'exemple suivant.

XADD mystream * nom a

L'exécution de cette commande pour les noms a à e remplira Redis Stream, mystream et la liste non utilisée du groupe de consommateurs mystream. Ceci est illustré à la figure 4.

Redis Labs

Ici, vous pouvez voir que les consommateurs Alice et Bob n'ont pas encore commencé leur travail. L'application A consomme des données via le consommateur Alice, tandis que l'application B consomme des données via Bob.

Consommation de données Redis Streams

La commande pour lire les données d'un groupe est XREADGROUP. Dans notre exemple, lorsque l'application A commence à traiter des données, elle appelle le consommateur (Alice) pour récupérer les données, comme dans:

XREADGROUP GROUP mygroup COUNT 2 Alice STREAMS mystream>

De même, l'application B lit les données via Bob, comme suit:

GROUPE XREADGROUP mygroup COUNT 2 Bob STREAMS mystream>

Le caractère spécial> à la fin indique à Redis Streams de récupérer uniquement les entrées de données qui ne sont livrées à aucun autre consommateur. Notez également que deux consommateurs ne consommeront pas les mêmes données, ce qui entraînera le déplacement des données de la liste non consommée vers Alice et Bob, comme illustré à la figure 5.

Redis Labs

Suppression des messages traités des listes d'entrées en attente

Les données des listes d'entrées en attente de vos consommateurs y resteront jusqu'à ce que les applications A et B reconnaissent à Redis Streams qu'elles ont réussi à consommer les données. Cela se fait à l'aide de la commande XACK. Par exemple, l'application A reconnaîtrait ce qui suit après avoir consommé d et e, qui ont les ID 1526569411111-0 et 1526569411112-0.

XACK mystream mygroup 1526569411111-0 1526569411112-0

La combinaison de XREADGROUP et XACK équivaut au démarrage d'une transaction et à sa validation, ce qui garantit la sécurité des données. 

Après avoir exécuté XACK, supposons que l'application A ait exécuté XREADGROUP comme indiqué ci-dessous. Maintenant, la structure des données ressemble à la figure 6.

XREADGROUP GROUP mygroup COUNT 2 Alice STREAMS mystream>
Redis Labs

Récupération des pannes

Si l'application B s'est terminée en raison d'un échec lors du traitement de b et c, la structure de données ressemblerait à la figure 7.

Redis Labs

Il vous reste maintenant deux options:

1. Redémarrez l'application B et rechargez les données du consommateur (Bob).

Dans ce cas, l'application B doit lire les données de votre consommateur (Bob) à l'aide de la commande XREADGROUP, mais avec une différence. Au lieu de> à la fin, l'application B passerait 0 (ou l'ID inférieur à la précédente entrée de données traitée). N'oubliez pas que> envoie de nouvelles données de la liste non consommée au consommateur.

GROUPE XREADGROUP mygroup COUNT 2 Bob STREAMS mystream 0

La commande ci-dessus récupérera les entrées de données déjà stockées dans la liste pour le consommateur Bob. Il ne récupérera pas les nouvelles données de la liste non consommée. L'application B peut parcourir toutes les données du consommateur Bob avant d'extraire de nouvelles données.

2. Forcez Alice à réclamer toutes les données de Bob et à les traiter via l'application A.

Cela est particulièrement utile si vous ne pouvez pas récupérer l'application B en raison d'une panne de nœud, de disque ou de réseau. Dans de tels cas, tout autre consommateur (comme Alice) peut réclamer les données de Bob et continuer à traiter ces données, évitant ainsi les temps d'arrêt du service. Pour réclamer les données de Bob, vous devez exécuter deux ensembles de commandes:

XPENDING mystream mygroup - + 10 Bob

Cela récupérera toutes les entrées de données en attente pour Bob. Les options - et + récupèrent toute la plage. Si b et c avaient respectivement les ID 1526569411113-0 et 1526569411114-0, la commande qui déplacera les données de Bob vers Alice est la suivante:

XCLAIM mystream mygroup Alice 0 1526569411113-0 1526569411114-0

Les groupes de consommateurs maintiennent une horloge en cours d'exécution pour les données de la liste consommée. Par exemple, lorsque l'App B lit b, l'horloge démarre jusqu'à ce que Bob reçoive l'ACK. Avec l'option time de la commande XCLAIM, vous pouvez indiquer au groupe de consommateurs de ne déplacer que les données inactives plus longtemps qu'une durée spécifiée. Vous pouvez également ignorer cela en passant 0 comme indiqué dans l'exemple ci-dessus. Le résultat de ces commandes est illustré à la figure 8. XCLAIM est également utile lorsque l'un de vos processeurs consommateurs est lent, ce qui entraîne un retard de traitement des données non traitées.

Redis Labs

Dans l'article précédent, nous avons abordé les bases de l'utilisation de Redis Streams. Nous sommes allés un peu plus loin dans cet article et avons expliqué quand utiliser les groupes de consommateurs et comment ils fonctionnent. Les groupes de consommateurs dans Redis Streams réduisent votre charge de travail en matière de gestion des partitions de données, de leur cycle de vie et de la sécurité des données. De plus, les capacités d'évolutivité des groupes de consommateurs peuvent profiter à de nombreuses applications en temps réel.

Dans un troisième article à paraître sur Redis Streams, je montrerai comment développer une application de classification en temps réel à l'aide de Redis Streams et de Lettuce, une bibliothèque open source basée sur Java pour Redis. En attendant, vous pouvez en savoir plus en suivant le didacticiel Redis Streams sur le site Web du projet Redis. 

Roshan Kumar est chef de produit senior chez  Redis Labs . Il possède une vaste expérience dans le développement de logiciels et le marketing technologique. Roshan a travaillé chez Hewlett-Packard et de nombreuses startups à succès de la Silicon Valley, notamment ZillionTV, Salorix, Alopa et ActiveVideo. En tant que programmeur enthousiaste, il a conçu et développé mindzeal.com, une plateforme en ligne hébergeant des cours de programmation informatique pour les jeunes étudiants. Roshan est titulaire d'un baccalauréat en informatique et d'un MBA de l'Université de Santa Clara.

-

New Tech Forum offre un lieu pour explorer et discuter des technologies d'entreprise émergentes avec une profondeur et une ampleur sans précédent. La sélection est subjective, basée sur notre choix des technologies que nous pensons importantes et qui intéressent le plus les lecteurs. n'accepte pas les supports marketing pour la publication et se réserve le droit de modifier tout le contenu fourni. Envoyez toutes vos demandes à  [email protected] .