Programování

Jak používat skupiny spotřebitelů v Redis Streams

Roshan Kumar je vedoucí produktový manažer ve společnosti Redis Labs.

Redis Streams je nová datová struktura zavedená v Redis 5.0, která umožňuje vytvářet a spravovat datové toky. V předchozím článku jsem ukázal, jak přidat data do streamu a jak číst data několika způsoby. V tomto článku vysvětlím, jak používat skupiny spotřebitelů v Redis Streams. Skupina spotřebitelů je způsob, jak rozdělit proud zpráv mezi více klientů, aby se urychlilo zpracování nebo se snížilo zatížení pro pomalejší spotřebitele.

V dokonalém světě pracují producenti i spotřebitelé stejným tempem a nedochází ke ztrátě ani nevyřízenosti dat. Ve skutečném světě tomu tak bohužel není. Téměř ve všech případech použití zpracování datových proudů v reálném čase pracují producenti a spotřebitelé různou rychlostí. Kromě toho existuje více než jeden typ spotřebitele, z nichž každý má své vlastní požadavky a tempo zpracování. Redis Streams řeší tuto potřebu sadou funkcí, která silně gravituje směrem k podpoře spotřebitelů. Jednou z jeho nejdůležitějších funkcí je skupina spotřebitelů.

Kdy použít skupinu zákazníků Redis Streams

Účelem skupin spotřebitelů je škálovat proces spotřeby dat. Uvažujme jeden příklad - aplikaci pro zpracování obrázků. Řešení vyžaduje tři hlavní komponenty:

  1. Producent (možná jedna nebo více kamer), který snímá a ukládá obrázky;
  2. Redis Stream, který ukládá obrázky (v datovém úložišti datového proudu) v pořadí, v jakém dorazí; a
  3. Procesor obrazu, který zpracovává každý obraz.
Redis Labs

Předpokládejme, že váš producent uloží 500 obrazů za sekundu a obrazový procesor zpracuje na plnou kapacitu pouze 100 obrazů za sekundu. Tento rozdíl rychlostí vytvoří nevyřízené položky a váš obrazový procesor nikdy nebude schopen dohnat. Snadný způsob, jak tento problém vyřešit, je spustit pět obrazových procesorů (jak je znázorněno na obrázku 2), přičemž každý zpracovává vzájemně se vylučující sadu obrazů. Toho můžete dosáhnout prostřednictvím skupiny spotřebitelů, která vám umožní rozdělit pracovní zátěže a směrovat je k různým spotřebitelům.

Redis Labs

Skupina spotřebitelů dělá víc než dělení dat - zajišťuje bezpečnost dat a umožňuje zotavení po katastrofě.

Jak funguje skupina zákazníků Redis Streams

Skupina spotřebitelů je datová struktura v rámci Redis Stream. Jak je znázorněno na obrázku 3, můžete skupinu spotřebitelů považovat za kolekci seznamů. Další věc, kterou si lze představit, je seznam položek, které nespotřebovávají žádní spotřebitelé - pro naši diskusi to označme jako „nespotřebovaný seznam“. Jak data přicházejí do streamu, jsou okamžitě přenesena do nespotřebovaného seznamu.

Redis Labs

Skupina spotřebitelů udržuje samostatný seznam pro každého spotřebitele, obvykle s připojenou aplikací. Na obrázku 3 má naše řešení N identické aplikace (App 1, App 2,…. App n), které čtou data prostřednictvím Consumer 1, Consumer 2,… Consumer n.

Když aplikace čte data pomocí příkazu XREADGROUP, jsou konkrétní datové položky odebrány z nespotřebovaného seznamu a vloženy do seznamu nevyřízených záznamů, který patří příslušnému spotřebiteli. Žádní dva spotřebitelé tedy nebudou konzumovat stejná data.

Nakonec, když aplikace upozorní stream pomocí příkazu XACK, odstraní položku ze seznamu nevyřízených položek spotřebitele.

Nyní, když jsem vysvětlil základy skupin spotřebitelů, pojďme se hlouběji zabývat tím, jak tento životní cyklus dat funguje.

Vytváření skupiny zákazníků Redis Streams

Novou skupinu spotřebitelů můžete vytvořit pomocí příkazu XGROUP CREATE, jak je znázorněno níže.

XGROUP CREATE mystream mygroup $ MKSTREAM

Stejně jako u XREAD, znak $ na konci příkazu řekne streamu, aby doručoval pouze nová data z tohoto bodu v čase vpřed. Alternativní možností je 0 nebo jiné ID ze záznamu proudu. Při použití 0 bude stream doručovat všechna data od začátku streamu.

MKSTREAM vytvoří nový stream, v tomto případě mystream, pokud již neexistuje.

Čtení a správa dat Redis Stream

Předpokládejme, že máte Redis Stream (mystream) a již jste vytvořili skupinu spotřebitelů (mygroup), jak je uvedeno výše. Nyní můžete přidat položky se jmény a, b, c, d, e jako v následujícím příkladu.

XADD mystream * jméno a

Spuštěním tohoto příkazu pro názvy a až e se naplní Redis Stream, mystream a nespotřebovaný seznam skupiny spotřebitelů mystream. To je znázorněno na obrázku 4.

Redis Labs

Zde vidíte, že spotřebitelé Alice a Bob ještě nezačali pracovat. Aplikace A spotřebovává data prostřednictvím spotřebitele Alice, zatímco aplikace B spotřebovává data prostřednictvím Boba.

Spotřeba dat Redis Streams

Příkaz ke čtení dat ze skupiny je XREADGROUP. V našem příkladu, když aplikace A začne zpracovávat data, volá spotřebitele (Alice) k načtení dat, jako v:

SKUPINA XREADGROUP mygroup POČET 2 Alice STREAMS mystream>

Podobně aplikace B čte data prostřednictvím Boba, a to následovně:

SKUPINA XREADGROUP mygroup POČET 2 Bob STREAMS mystream>

Speciální znak> na konci říká Redis Streams, aby načetla pouze datové položky, které nejsou doručeny žádným dalším spotřebitelům. Všimněte si také, že žádní dva spotřebitelé nebudou konzumovat stejná data, což bude mít za následek přesun dat z nespotřebovaného seznamu do Alice a Boba, jak je znázorněno na obrázku 5.

Redis Labs

Odebírání zpracovaných zpráv ze seznamů nevyřízených záznamů

Data v seznamech nevyřízených záznamů vašich spotřebitelů tam zůstanou, dokud App A a App B nepotvrdí Redis Streams, že data úspěšně spotřebovali. To se provádí pomocí příkazu XACK. Například aplikace A by potvrdila následující po konzumaci d a e, které mají ID 1526569411111-0 a 1526569411112-0.

XACK mystream mygroup 1526569411111-0 1526569411112-0

Kombinace XREADGROUP a XACK je analogická zahájení transakce a jejímu potvrzení, což zajišťuje bezpečnost dat.

Po spuštění XACKu předpokládejme, že aplikace A provedla XREADGROUP, jak je uvedeno níže. Nyní vypadá datová struktura jako na obrázku 6.

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

Obnova po selhání

Pokud by aplikace B byla ukončena z důvodu selhání při zpracování bac, pak by datová struktura vypadala jako na obrázku 7.

Redis Labs

Nyní máte dvě možnosti:

1. Restartujte aplikaci B a znovu načtěte data od spotřebitele (Bob).

V tomto případě musí aplikace B číst data od vašeho spotřebitele (Bob) pomocí příkazu XREADGROUP, ale s jedním rozdílem. Namísto> na konci by aplikace B předala 0 (nebo ID nižší než předchozí položka dat, která byla zpracována). Pamatujte, že> odesílá spotřebiteli nová data z nespotřebovaného seznamu.

SKUPINA XREADGROUP mygroup POČET 2 Bob STREAMS mystream 0

Výše uvedený příkaz načte datové položky, které jsou již uloženy v seznamu pro spotřebitele Boba. Nebude načíst nová data z nespotřebovaného seznamu. Aplikace B by mohla načíst všechna data ve spotřebitelském Bobovi před načtením nových dat.

2. Donutte Alici požadovat všechna data od Boba a zpracovat je pomocí aplikace A.

To je obzvláště užitečné, pokud nemůžete obnovit aplikaci B kvůli selhání uzlu, disku nebo sítě. V takových případech může jakýkoli jiný spotřebitel (například Alice) získat Bobova data a pokračovat v jejich zpracování, čímž zabrání prostojům služby. Chcete-li získat Bobova data, musíte spustit dvě sady příkazů:

XPENDING mystream mygroup - + 10 Bob

Tím se načtou všechny nevyřízené položky dat pro Boba. Možnosti - a + načtou celý rozsah. Pokud b a c měly ID 1526569411113-0 a 1526569411114-0, příkaz, který přesune Bobova data do Alice, je následující:

XCLAIM mystream mygroup Alice 0 1526569411113-0 1526569411114-0

Skupiny spotřebitelů udržují běžící hodiny pro data ve spotřebovaném seznamu. Například když aplikace B přečte b, hodiny se spustí, dokud Bob neobdrží ACK. Pomocí možnosti čas v příkazu XCLAIM můžete skupině spotřebitelů říci, že má přesouvat pouze data, která jsou nečinná déle než zadaný čas. Můžete to také ignorovat předáním 0, jak je znázorněno ve výše uvedeném příkladu. Výsledek těchto příkazů je znázorněn na obrázku 8. XCLAIM se také hodí, když je jeden z vašich spotřebitelských procesorů pomalý, což má za následek nevyřízené položky nezpracovaných dat.

Redis Labs

V předchozím článku jsme se zabývali základy používání Redis Streamů. V tomto článku jsme šli trochu hlouběji a vysvětlili jsme, kdy použít skupiny spotřebitelů a jak fungují. Skupiny spotřebitelů v Redis Streams snižují vaši zátěž, pokud jde o správu datových oddílů, jejich životní cykly a bezpečnost dat. Možnosti škálovatelnosti skupin spotřebitelů mohou navíc těžit z mnoha aplikací v reálném čase.

V připravovaném třetím článku o Redis Streams ukážu, jak vyvinout klasifikační aplikaci v reálném čase pomocí Redis Streams a Lettuce, open-source knihovny založené na Javě pro Redis. Mezitím se můžete dozvědět více procházením tutoriálu Redis Streams na webu projektu Redis.

Roshan Kumar je senior produktový manažer ve společnostiRedis Labs. Má bohaté zkušenosti s vývojem softwaru a technologickým marketingem. Roshan pracoval ve společnosti Hewlett-Packard a v mnoha úspěšných startupech ze Silicon Valley, včetně ZillionTV, Salorix, Alopa a ActiveVideo. Jako nadšený programátor navrhl a vyvinul mindzeal.com, online platformu hostující kurzy programování pro mladé studenty. Roshan je držitelem bakalářského titulu v oboru počítačových věd a MBA na univerzitě v Santa Clara.

Nové technologické fórum poskytuje místo, kde můžete prozkoumat a diskutovat o nově vznikajících podnikových technologiích v nebývalé hloubce a šíři. Výběr je subjektivní, založený na našem výběru technologií, které považujeme za důležité a pro čtenáře nejzajímavější. nepřijímá marketingové materiály ke zveřejnění a vyhrazuje si právo upravovat veškerý přispěný obsah. Všechny dotazy zasílejte na adresu[email protected].