Programovanie

Ako používať skupiny spotrebiteľov v streamoch Redis

Roshan Kumar je senior produktový manažér v Redis Labs.

Redis Streams je nová dátová štruktúra zavedená v Redis 5.0, ktorá umožňuje vytvárať a spravovať dátové toky. V predchádzajúcom článku som ukázal, ako pridať údaje do streamu a ako ich čítať viacerými spôsobmi. V tomto článku vysvetlím, ako používať skupiny spotrebiteľov v Redis Streams. Skupina spotrebiteľov je spôsob, ako rozdeliť prúd správ medzi viacerých klientov, aby sa urýchlilo spracovanie alebo znížila záťaž pre pomalších spotrebiteľov.

V perfektnom svete pracujú producenti aj spotrebitelia dát rovnakým tempom a nedochádza k ich strate ani nevyriešeniu. Bohužiaľ to tak nie je v skutočnom svete. Takmer vo všetkých prípadoch použitia spracovania dátových tokov v reálnom čase pracujú producenti a spotrebitelia rôznymi rýchlosťami. Okrem toho existuje viac ako jeden typ spotrebiteľov, z ktorých každý má svoje vlastné požiadavky a tempo spracovania. Redis Streams túto potrebu rieši pomocou sady funkcií, ktorá výrazne gravituje smerom k podpore spotrebiteľov. Jednou z jeho najdôležitejších vlastností je skupina spotrebiteľov.

Kedy použiť skupinu spotrebiteľov Redis Streams

Účelom skupín spotrebiteľov je rozšíriť váš proces spotreby údajov. Uvažujme jeden príklad - aplikáciu na spracovanie obrázkov. Riešenie vyžaduje tri hlavné komponenty:

  1. Producent (pravdepodobne jeden alebo viac fotoaparátov), ​​ktorý sníma a ukladá obrázky;
  2. Redis Stream, ktorý ukladá obrázky (v úložisku údajov o streame) v poradí, v akom prichádzajú; a
  3. Obrazový procesor, ktorý spracováva každý obraz.
Redis Labs

Predpokladajme, že váš producent uloží 500 obrázkov za sekundu a obrazový procesor spracuje pri plnej kapacite iba 100 obrázkov za sekundu. Tento rozdiel sadzieb vytvorí nevybavené položky a váš obrazový procesor nebude nikdy schopný dohnať ich. Jednoduchým spôsobom, ako tento problém vyriešiť, je spustiť päť obrazových procesorov (ako je znázornené na obrázku 2), z ktorých každý spracováva navzájom sa vylučujúcu množinu obrázkov. Môžete to dosiahnuť prostredníctvom skupiny spotrebiteľov, ktorá vám umožní rozdeliť vaše pracovné zaťaženie a smerovať ich k rôznym zákazníkom.

Redis Labs

Skupina spotrebiteľov nedokáže iba rozdelenie údajov - zaisťuje bezpečnosť údajov a umožňuje zotavenie po katastrofe.

Ako funguje skupina spotrebiteľov Redis Streams

Skupina spotrebiteľov je dátová štruktúra v rámci toku Redis. Ako je znázornené na obrázku 3, o skupine spotrebiteľov môžete uvažovať ako o súbore zoznamov. Ďalšou vecou, ​​ktorú si treba predstaviť, je zoznam položiek, ktoré nekonzumujú nijakí spotrebitelia - v našej diskusii to nazvime „nespotrebovaný zoznam“. Keď dáta prichádzajú do streamu, okamžite sa presunú na nespotrebovaný zoznam.

Redis Labs

Skupina spotrebiteľov vedie pre každého spotrebiteľa samostatný zoznam, zvyčajne s priloženou aplikáciou. Na obrázku 3 má naše riešenie N identické aplikácie (App 1, App 2, .... App n), ktoré čítajú údaje prostredníctvom Consumer 1, Consumer 2, ... Consumer n.

Keď aplikácia načíta údaje pomocou príkazu XREADGROUP, konkrétne položky údajov sa odstránia z nespotrebovaného zoznamu a vloží sa do zoznamu nespracovaných záznamov, ktorý patrí príslušnému spotrebiteľovi. Žiadni dvaja spotrebitelia teda nebudú konzumovať rovnaké údaje.

Nakoniec, keď aplikácia upozorní stream pomocou príkazu XACK, odstráni položku zo zoznamu nespracovaných položiek spotrebiteľa.

Teraz, keď som vysvetlil základy skupín spotrebiteľov, poďme sa hlbšie zaoberať tým, ako tento životný cyklus údajov funguje.

Vytvorenie skupiny spotrebiteľov Redis Streams

Novú skupinu spotrebiteľov môžete vytvoriť pomocou príkazu XGROUP CREATE, ako je uvedené nižšie.

XGROUP CREATE mystream mygroup $ MKSTREAM

Rovnako ako v prípade XREAD, znak $ na konci príkazu hovorí, že stream má doručiť iba nové údaje od tohto bodu vpred. Alternatívnou možnosťou je 0 alebo iné ID zo záznamu streamu. Pri použití hodnoty 0 bude stream doručovať všetky údaje od začiatku toku.

MKSTREAM vytvorí nový stream, v tomto prípade mystream, ak ešte neexistuje.

Čítanie a správa údajov Redis Stream

Predpokladajme, že máte Redis Stream (mystream) a už ste vytvorili skupinu spotrebiteľov (mygroup), ako je uvedené vyššie. Teraz môžete pridať položky s názvami a, b, c, d, e, ako v nasledujúcom príklade.

XADD mystream * meno a

Spustením tohto príkazu pre mená a až e sa naplnia Redis Stream, mystream a nespotrebovaný zoznam skupiny spotrebiteľov mystream. To je znázornené na obrázku 4.

Redis Labs

Tu môžete vidieť, že spotrebitelia Alice a Bob ešte nezačali pracovať. Aplikácia A spotrebúva údaje prostredníctvom spotrebiteľa Alice, zatiaľ čo aplikácia B spotrebúva údaje prostredníctvom spotrebiteľa Alice.

Spotreba dát Redis Streams

Príkaz na čítanie údajov zo skupiny je XREADGROUP. V našom príklade, keď aplikácia A začne spracovávať údaje, zavolá spotrebiteľa (Alice), aby načítal údaje, ako napríklad v:

SKUPINA XREADGROUP mygroup POČET 2 Alice STREAMS mystream>

Aplikácia B podobne číta dáta prostredníctvom Boba nasledovne:

SKUPINA XREADGROUP mygroup POČET 2 Bob STREAMS mystream>

Špeciálny znak> na konci povie Redis Streams, aby načítal iba položky údajov, ktoré sa nedoručujú iným spotrebiteľom. Upozorňujeme tiež, že žiadny dvaja spotrebitelia nespotrebujú rovnaké údaje, čo bude mať za následok presun údajov z nespotrebovaného zoznamu k Alice a Bobovi, ako je to znázornené na obrázku 5.

Redis Labs

Odstraňujú sa spracované správy zo zoznamov nespracovaných záznamov

Údaje v zoznamoch nespracovaných záznamov vašich spotrebiteľov tam zostanú, kým aplikácie A a B nepotvrdia pre Redis Streams, že údaje úspešne spotrebovali. To sa deje pomocou príkazu XACK. Napríklad aplikácia A by po skonzumovaní písmen d a e, ktoré majú ID 1526569411111-0 a 1526569411112-0, potvrdila nasledovné.

XACK mystream mygroup 1526569411111-0 1526569411112-0

Kombinácia XREADGROUP a XACK je analogická ako pri začatí transakcie a jej spáchaní, čo zaisťuje bezpečnosť údajov.

Po spustení XACKu predpokladajme, že aplikácia A vykonala XREADGROUP, ako je to zobrazené nižšie. Teraz dátová štruktúra vyzerá ako na obrázku 6.

SKUPINA XREADGROUP mygroup POČET 2 Alice STREAMS mystream>
Redis Labs

Obnova po zlyhaniach

Ak by bola aplikácia B ukončená z dôvodu zlyhania pri spracovaní b a c, potom by dátová štruktúra vyzerala ako na obrázku 7.

Redis Labs

Teraz vám ostávajú dve možnosti:

1. Reštartujte aplikáciu B a znovu načítajte údaje od spotrebiteľa (Bob).

V takom prípade musí aplikácia B načítať údaje od vášho spotrebiteľa (Bob) pomocou príkazu XREADGROUP, ale s jedným rozdielom. Namiesto> na konci by aplikácii B prešlo 0 (alebo ID nižšie ako predchádzajúci údajový záznam, ktorý bol spracovaný). Pamätajte, že> odosiela spotrebiteľovi nové údaje z nespotrebovaného zoznamu.

SKUPINA XREADGROUP mygroup POČET 2 Bob STREAMS mystream 0

Vyššie uvedený príkaz vyhľadá údaje, ktoré sú už uložené v zozname pre spotrebiteľa Bob. Nebude načítať nové údaje z nespotrebovaného zoznamu. Aplikácia B mohla pred načítaním nových údajov prechádzať všetkými údajmi v spotrebiteľovi Bobovi.

2. Donútte Alicu, aby získala všetky údaje od Boba a spracovala ich prostredníctvom aplikácie A.

To je obzvlášť užitočné, ak nemôžete obnoviť aplikáciu B z dôvodu zlyhania uzla, disku alebo siete. V takýchto prípadoch môže ktorýkoľvek iný spotrebiteľ (napríklad Alice) požiadať o Bobove údaje a pokračovať v ich spracovaní, čím zabráni prestojom služby. Ak chcete získať Bobove údaje, musíte spustiť dve sady príkazov:

XPENDING mystream mygroup - + 10 Bob

Týmto sa načítajú všetky nespracované záznamy údajov pre Boba. Možnosti - a + načítajú celý rozsah. Ak b a c mali ID 1526569411113-0 a 1526569411114-0, príkaz, ktorý presunie Bobove údaje do Alice, je nasledovný:

XCLAIM mystream mygroup Alice 0 1526569411113-0 1526569411114-0

Skupiny spotrebiteľov udržiavajú prevádzkové hodiny pre údaje v zozname spotrebovaných údajov. Napríklad keď aplikácia B prečíta b, hodiny sa naštartujú, kým Bob nedostane ACK. Pomocou možnosti čas v príkaze XCLAIM môžete skupine spotrebiteľov povedať, aby presunuli iba údaje, ktoré sú nečinné dlhšie ako zadaný čas. Môžete to tiež ignorovať zadaním 0, ako je uvedené v príklade vyššie. Výsledok týchto príkazov je znázornený na obrázku 8. XCLAIM sa tiež hodí, keď je jeden z vašich spotrebiteľských procesorov pomalý, čo vedie k hromadeniu nevybavených údajov.

Redis Labs

V predchádzajúcom článku sme sa venovali základom používania Redis Streamov. V tomto článku sme išli trochu hlbšie a vysvetlili sme, kedy treba skupiny spotrebiteľov používať a ako fungujú. Skupiny spotrebiteľov v streamoch Redis Streams znižujú vaše zaťaženie, pokiaľ ide o správu dátových oddielov, ich životných cyklov a bezpečnosť údajov. Navyše možnosti škálovania skupín spotrebiteľov môžu byť prínosom pre mnoho aplikácií v reálnom čase.

V pripravovanom treťom článku o Redis Streams ukážem, ako vyvinúť aplikáciu na klasifikáciu v reálnom čase pomocou Redis Streams and Lettuce, open-source knižnice založenej na Jave pre Redis. Medzitým sa môžete dozvedieť viac tým, že si prečítate príručku Redis Streams na webovej stránke projektu Redis.

Roshan Kumar je senior produktový manažér v spoločnostiRedis Labs. Má bohaté skúsenosti s vývojom softvéru a technologickým marketingom. Roshan pracoval v spoločnosti Hewlett-Packard a v mnohých úspešných startupoch v Silicon Valley vrátane ZillionTV, Salorix, Alopa a ActiveVideo. Ako nadšený programátor navrhol a vyvinul online platformu mindzeal.com, ktorá organizuje kurzy počítačového programovania pre mladých študentov. Roshan je držiteľom bakalárskeho titulu v odbore počítačových vied a titulu MBA na univerzite v Santa Clare.

Nové technologické fórum poskytuje miesto na preskúmanie a diskusiu o vznikajúcich podnikových technológiách v nebývalej hĺbke a šírke. Výber je subjektívny, založený na našom výbere technológií, ktoré považujeme za dôležité a pre čitateľov najväčší záujem. neprijíma marketingové záruky na zverejnenie a vyhradzuje si právo upravovať všetok prispievaný obsah. Všetky otázky posielajte na adresu[email protected].

$config[zx-auto] not found$config[zx-overlay] not found