Articles

Queryable Kafka témata s Kafka proudy

V dnešních architekturách zpracování dat, Apache Kafka je často používán ve fázi ingress. Obvykle se tento krok používá k obohacení a filtrování dat příchozích zpráv; interaktivní dotazy však není možné provádět až v pozdější fázi zpracování dat. Je to proto, že ačkoli každá zpráva v tématu Kafka ve výchozím nastavení přetrvává, zatím není k dispozici žádný mechanismus, který umožňuje rychlé vyhledávání konkrétní zprávy v tématu.

Nicméně, být schopen dotaz na nová data v této rané fázi v potrubí by se zabránilo zpoždění tradiční zpracování potrubí, které se obvykle zahrnují dlouhotrvající šarže-předzpracování kroky a poskytnout koncovým uživatelům téměř okamžitý přístup k příchozí data.

Pro budování zpracování dat aplikací s Kafka, Kafka Proudy knihovna, která je udržována jako součást projekt Kafka, se běžně používá k definování transformace dat a analýz. Jedním z důležitých rysů Kafkova Proudy jsou státní obchody, které nabízejí abstrakce rychlé místní Klíč-Hodnota, Obchod, které lze číst a zapisovat při zpracování zprávy s Kafka Proudy. Tyto páry Klíč-Hodnota obchodech lze plynule naplní nové zprávy z Kafky téma definováním vhodné stream procesor, tak, že je nyní možné rychle načíst zprávy ze základní téma.

V návaznosti na tuto funkci Kafka Streams vytvoříme jednotné rozhraní REST API, které poskytuje jediný dotazovací koncový bod pro dané téma Kafka.

stručně řečeno, kombinující Kafka Proudy procesory se Stát, Obchody a HTTP server může účinně proměnit jakoukoli Kafka tématu rychlé čtení-pouze key-value store.

Kafka Streams je postaven jako knihovna, která může být vložena do samostatné Java nebo Scala aplikace. Umožňuje vývojářům definovat streamové procesory, které provádějí transformace nebo agregace dat na Kafkových zprávách a zajišťují, že každá vstupní zpráva je zpracována přesně jednou. Pomocí Kafka Proudy DSL, který je inspirován Java Stream API, stream procesorů, a státních obchodech lze flexibilně připoutaný.

Kromě toho, při spuštění více instancí Kafka Proudy-založené aplikace, procesy automaticky forma vyrovnávání zatížení, vysoce dostupné zpracování clusteru bez závislosti na externí systémy, jiné než Kafka.

Pro ilustraci architektura Kafka Proudy aplikace, která zaměstnává státní obchody, představte si následující situaci: Jako železniční dopravce, pokaždé, když zákazník knih výlet na našich webových stránkách, nové zprávy, skládající se z id zákazníka a razítko je vloženo do Kafky téma. Konkrétně jeden nebo více Kafkových producentů vkládá tyto zprávy do tématu s devíti oddíly. Protože je jako klíč pro každou zprávu zvoleno ID zákazníka, data patřící danému zákazníkovi budou vždy vložena do stejné oblasti tématu. Implicitně Kafka producenti používají DefaultPartitioner pro přiřazení zpráv diskovým oddílům.

nyní předpokládejme, že máme aplikaci Kafka Streams, která čte zprávy z tohoto tématu a přetrvává je ve stavovém úložišti. Protože klíč každé zprávy sestává pouze z id zákazníka, odpovídající hodnota ve státním obchodě bude vždy časovým razítkem poslední rezervace zákazníka. Abychom dosáhli maximálního stupně paralelního zpracování, můžeme spustit až devět instancí aplikace Kafka Streams. V tomto případě bude každé instanci aplikace přiřazen přesně jeden z tematických oddílů. Pro každý vstupní oddíl vytvoří Kafka Streams samostatný stavový obchod, který zase uchovává pouze data zákazníků patřících do tohoto oddílu.

výsledná architektura aplikace je znázorněna na následujícím diagramu.

Kafka Stream Procesorů zodpovědný za Oddíly 4 až 9 jsou v této ilustraci. Přerušované šipky naznačují, že nové zprávy v oddílu jsou také šířeny na další stream procesorů a jejich státních obchodech, což umožňuje rychlý fail-over, pokud primárně přidělen procesor by měl selhat.

je možné použít buď v paměti nebo trvalé státní obchody v aplikaci. Operace na stavových úložištích v paměti jsou ještě rychlejší ve srovnání s perzistentní variantou, která interně používá úložiště RocksDB. Na druhou stranu lze trvalé stavové obchody obnovit rychleji v případě, že aplikace Kafka Streams selhala a je třeba ji restartovat. Navíc objem dat na úložiště není omezen množstvím hlavní paměti při použití trvalých stavových úložišť.

V našem scénáři není nutné mít changelog téma, které zaznamenává operace zápisu do státních obchodech: Všechny údaje nezbytné k obnovení stavu store může být získán z původní vstupní téma.

Přidání koncový bod REST stream procesorů

S architekturou, které byly zatím předloženy, máme devět státních obchodech, které mohou být použity k načtení poslední rezervace datum zákazníků patřících do příslušných vstupních téma oddílu.

Nyní, s cílem, aby byla tato informace přístupná z venku z Kafky Proudy procesory, musíme vystavit koncový bod služby na každý stream procesor instance aplikace a odpovědět na příchozí požadavky z vnitřní státní obchod, který je spravován Kafka Proudy.

Jako dodatečný požadavek, nemůžeme očekávat, že žádající aplikaci vědět, které Kafka Proudy stupně je v současné době zodpovědná za zpracování údajů daného zákazníka. V důsledku toho je každý koncový bod služby odpovědný za přesměrování dotazu na správnou instanci aplikace, pokud nejsou údaje o zákaznících lokálně dostupné.

rozhodli jsme se implementovat koncový bod služby jako REST API, které má tu výhodu, že je přístupné z jakéhokoli klienta, který podporuje HTTP, a umožňuje velmi snadno přidat transparentní vyvažovač zatížení.

KafkaStreams objekt, který je k dispozici v každé Kafka Proudy aplikace, poskytuje přístup jen pro čtení pro všechny místní státní obchody a lze také určit instance aplikace zodpovědný za dané id zákazníka. Při použití tohoto objektu vybudovat naše OSTATNÍ služby, architektura vypadá takto:

HTTP klient může odeslat požadavků na vyhledávání na OSTATNÍ koncové body stream procesorů. Přerušovaná šipka ukazuje, jak je požadavek interně předán mezi procesory stream, pokud na něj nelze odpovědět z místního státního úložiště.

Sumarizace, naše navržená architektura využívá Kafka témata spolehlivě uchovávat data zpráva v klidu a udržuje druhý reprezentace dat ve státních obchodech na podporu rychlé dotazy.

zajištění škálovatelnosti aplikace

abychom získali škálovatelnou aplikaci, musíme zajistit, aby zatížení zpracování bylo stejně vyvážené ve všech instancích aplikace Kafka Streams. Zatížení jednotlivého streamového procesoru závisí na množství dat a dotazů, které musí zpracovat.

konkrétněji je důležité zvolit schéma dělení pro téma Kafka tak, aby zatížení příchozích zpráv a dotazů bylo vyvážené napříč všemi oddíly a následně také všemi streamovými procesory.

Pokud se v paměti státních obchodech by měla být použita, počet oddílů, v tématu musí být dostatečně velká, tak, že každý stream procesor je schopen udržet objem dat z jednoho oddílu v hlavní paměti. Všimněte si, že v případě selhání-overs, stream procesor může dokonce muset držet dva oddíly v hlavní paměti.

Na účet pro stream procesor selhání, počet pohotovostním repliky může být nakonfigurován tak pomocí num.standby.replicas nastavení Kafka Toků, která zajišťuje, že další stream procesorů se také přihlásit k odběru zpráv z daného procesoru oddíl. V případě poruchy mohou tyto procesory rychle převzít odpovědi na dotazy, místo toho, aby začaly rekonstruovat státní úložiště až poté, co již došlo k selhání.

nakonec se požadovaný počet proudových procesorů musí přizpůsobit dostupnému hardwaru. Pro každou instanci aplikace stream processor by mělo být vyhrazeno alespoň jedno jádro CPU. Na vícejádrových systémech, je možné zvýšit počet stream vláken na instanci aplikace, což snižuje režijní náklady vzniklé zahájením samostatné Java aplikace na jádro PROCESORU.