Programmering

Sådan bruges forbrugergrupper i Redis Streams

Roshan Kumar er senior produktchef hos Redis Labs.

Redis Streams er en ny datastruktur, introduceret i Redis 5.0, der giver dig mulighed for at oprette og administrere datastrømme. I en tidligere artikel viste jeg, hvordan man føjer data til en stream, og hvordan man læser dataene på flere måder. I denne artikel forklarer jeg, hvordan man bruger forbrugergrupper i Redis Streams. En forbrugergruppe er en måde at opdele en strøm af meddelelser på mellem flere klienter for at fremskynde behandlingen eller lette belastningen for langsommere forbrugere.

I en perfekt verden arbejder både dataproducenter og forbrugere i samme tempo, og der er intet datatab eller dataefterspørgsel. Desværre er det ikke tilfældet i den virkelige verden. I næsten alle sager i realtid, der behandler datastrømme, arbejder producenter og forbrugere med forskellige hastigheder. Derudover er der mere end en type forbruger, hver med sine egne krav og behandlingstempo. Redis Streams imødekommer dette behov med et funktionssæt, der graverer stærkt mod at støtte forbrugerne. En af dens vigtigste funktioner er forbrugergruppen.

Hvornår skal jeg bruge en Redis Streams forbrugergruppe

Formålet med forbrugergrupper er at skalere din dataforbrugsproces. Lad os overveje et eksempel - en billedbehandlingsapplikation. Løsningen kræver tre hovedkomponenter:

  1. En producent (måske et eller flere kameraer), der tager og gemmer billeder;
  2. Redis Stream, der gemmer billeder (i et stream-datalager) i den rækkefølge, de ankommer; og
  3. En billedprocessor, der behandler hvert billede.
Redis Labs

Antag, at din producent gemmer 500 billeder i sekundet, og billedprocessoren kun behandler 100 billeder i sekundet ved sin fulde kapacitet. Denne satsforskel vil skabe et efterslæb, og din billedprocessor vil aldrig være i stand til at indhente. En nem måde at løse dette problem på er at køre fem billedbehandlere (som vist i figur 2), der hver behandler et gensidigt eksklusivt sæt billeder. Du kan opnå dette gennem en forbrugergruppe, der giver dig mulighed for at opdele dine arbejdsbelastninger og dirigere dem til forskellige forbrugere.

Redis Labs

En forbrugergruppe gør mere end datadeling - det sikrer datasikkerhed og muliggør katastrofegendannelse.

Sådan fungerer en Redis Streams forbrugergruppe

En forbrugergruppe er en datastruktur inden for en Redis Stream. Som vist i figur 3 kan du tænke på en forbrugergruppe som en samling lister. En anden ting at forestille sig er en liste over varer, der ikke forbruges af nogen forbrugere - lad os kalde dette en "uforbrugt liste" til vores diskussion. Da data ankommer i strømmen, skubbes de straks til den uforbrugte liste.

Redis Labs

Forbrugergruppen opretholder en separat liste for hver forbruger, typisk med en vedhæftet applikation. I figur 3 har vores løsning N identiske applikationer (App 1, App 2, ... App n), der læser data via henholdsvis Forbruger 1, Forbruger 2, ... Forbruger n.

Når en app læser data ved hjælp af XREADGROUP-kommandoen, fjernes specifikke dataposter fra den uforbrugte liste og skubbes ind i den ventende postliste, der tilhører den respektive forbruger. Således forbruger ikke to forbrugere de samme data.

Endelig, når appen underretter strømmen med XACK-kommandoen, fjerner den varen fra forbrugerens ventende postliste.

Nu hvor jeg har forklaret det grundlæggende i forbrugergrupper, lad os grave dybere ned i, hvordan denne datalivscyklus fungerer.

Oprettelse af en Redis Streams forbrugergruppe

Du kan oprette en ny forbrugergruppe ved hjælp af kommandoen XGROUP CREATE, som vist nedenfor.

XGROUP OPRET mystream mygroup $ MKSTREAM

Som med XREAD fortæller et $ -tegn i slutningen af ​​kommandoen, at strømmen kun skal levere nye data fra det tidspunkt fremad. Den alternative mulighed er 0 eller et andet ID fra strømindgangen. Når du bruger 0, leverer streamen alle data fra starten af ​​streamen.

MKSTREAM opretter en ny stream, mystream i dette tilfælde, hvis den ikke allerede findes.

Læsning og styring af Redis Stream-data

Antag, at du har en Redis Stream (mystream), og at du allerede har oprettet en forbrugergruppe (min gruppe) som vist ovenfor. Du kan nu tilføje emner med navnene a, b, c, d, e som i følgende eksempel.

XADD mystream * navn a

At køre denne kommando for navne a til e udfylder Redis Stream, mystream og den uforbrugte liste over forbrugergruppen mystream. Dette er illustreret i figur 4.

Redis Labs

Her kan du se, at forbrugere Alice og Bob endnu ikke har startet deres job. App A bruger data gennem forbrugeren Alice, mens App B bruger data gennem Bob.

Forbruger Redis Streams-data

Kommandoen til at læse data fra en gruppe er XREADGROUP. I vores eksempel, når App A begynder at behandle data, kalder det forbrugeren (Alice) for at hente data som i:

XREADGROUP GROUP mygroup COUNT 2 Alice STREAMS mystream>

Tilsvarende læser App B dataene via Bob som følger:

XREADGROUP GROUP mygroup COUNT 2 Bob STREAMS mystream>

Specialtegnet> i slutningen fortæller Redis Streams at hente kun dataposter, der ikke leveres til andre forbrugere. Bemærk også, at ikke to forbrugere vil forbruge de samme data, hvilket vil resultere i at flytte data fra den uforbrugte liste til Alice og Bob som vist i figur 5.

Redis Labs

Fjernelse af behandlede beskeder fra ventende poster

Dataene i de ventende postlister over dine forbrugere forbliver der, indtil App A og App B anerkender overfor Redis Streams, at de har brugt dataene med succes. Dette gøres ved hjælp af kommandoen XACK. For eksempel anerkender App A som følger efter indtagelse af d og e, som har ID'erne 1526569411111-0 og 1526569411112-0.

XACK mystream mygroup 1526569411111-0 1526569411112-0

Kombinationen af ​​XREADGROUP og XACK er analog med at starte en transaktion og begå den, hvilket sikrer datasikkerhed.

Efter at have kørt XACK, lad os antage, at App A udførte XREADGROUP som vist nedenfor. Nu ser datastrukturen ud som figur 6.

XREADGROUP GROUP mygroup COUNT 2 Alice STREAMS mystream>
Redis Labs

Gendannelse efter fejl

Hvis App B blev afsluttet på grund af fejl under behandling af b og c, ville datastrukturen se ud som figur 7.

Redis Labs

Nu har du to muligheder:

1. Genstart app B og genindlæs data fra forbrugeren (Bob).

I dette tilfælde skal App B læse data fra din forbruger (Bob) ved hjælp af kommandoen XREADGROUP, men med en forskel. I stedet for> i slutningen ville App B passere 0 (eller ID'et lavere end den tidligere dataindtastning, der blev behandlet). Husk at> sender nye data fra den uforbrugte liste til forbrugeren.

XREADGROUP GROUP mygroup COUNT 2 Bob STREAMS mystream 0

Ovenstående kommando henter dataposter, der allerede er gemt på listen til forbruger Bob. Det henter ikke nye data fra den uforbrugte liste. App B kunne gentage alle data i forbrugerens Bob, før de hentede nye data.

2. Tving Alice til at kræve alle data fra Bob og behandle dem via App A.

Dette er især nyttigt, hvis du ikke kan gendanne App B på grund af knudepunkt, disk eller netværksfejl. I sådanne tilfælde kan enhver anden forbruger (såsom Alice) kræve Bobs data og fortsætte med at behandle disse data og dermed forhindre nedetid på tjenester. For at gøre krav på Bobs data skal du køre to sæt kommandoer:

XPENDING mystream mygroup - + 10 Bob

Dette vil hente alle ventende dataindtastninger for Bob. Indstillingerne - og + henter hele området. Hvis b og c havde henholdsvis id'erne 1526569411113-0 og 1526569411114-0, er kommandoen, der flytter Bobs data til Alice, som følger:

XCLAIM mystream mygroup Alice 0 1526569411113-0 1526569411114-0

Forbrugergrupper opretholder et kørende ur til data på den forbrugte liste. For eksempel, når App B læser b, starter uret, indtil Bob modtager ACK. Med tidsindstillingen i XCLAIM-kommandoen kan du bede forbrugergruppen kun om at flytte data, der er inaktive længere end et bestemt tidspunkt. Du kan også ignorere det ved at passere 0 som vist i eksemplet ovenfor. Resultatet af disse kommandoer er illustreret i figur 8. XCLAIM er også praktisk, når en af ​​dine forbrugerprocessorer er langsom, hvilket resulterer i et efterslæb af ubehandlede data.

Redis Labs

I den forrige artikel dækkede vi det grundlæggende om, hvordan du bruger Redis Streams. Vi gik lidt dybere ned i denne artikel og forklarede, hvornår man skulle bruge forbrugergrupper, og hvordan de fungerer. Forbrugergrupper i Redis Streams reducerer din byrde, når det gælder administration af datapartitioner, deres livscyklus og datasikkerhed. Desuden kan udskalningsfunktionerne for forbrugergrupper gavne mange realtidsapplikationer.

I en kommende tredje artikel om Redis Streams vil jeg demonstrere, hvordan man udvikler en klassifikationsapplikation i realtid ved hjælp af Redis Streams and Lettuce, et Java-baseret open source-bibliotek til Redis. I mellemtiden kan du lære mere ved at arbejde gennem Redis Streams-tutorial på Redis-projektwebstedet.

Roshan Kumar er senior produktchef hosRedis Labs. Han har stor erfaring inden for softwareudvikling og teknologimarkedsføring. Roshan har arbejdet hos Hewlett-Packard og mange succesrige Silicon Valley startups, herunder ZillionTV, Salorix, Alopa og ActiveVideo. Som en entusiastisk programmør designede og udviklede han mindzeal.com, en online platform, der er vært for computerprogrammeringskurser for unge studerende. Roshan har en bachelorgrad i datalogi og en MBA fra Santa Clara University.

New Tech Forum giver et sted at udforske og diskutere nye virksomhedsteknologier i hidtil uset dybde og bredde. Valget er subjektivt baseret på vores valg af de teknologier, som vi mener er vigtige og af største interesse for læserne. accepterer ikke markedsføringssikkerhed til offentliggørelse og forbeholder sig retten til at redigere alt bidraget indhold. Send alle henvendelser til[email protected].