{"id":32632,"date":"2019-10-31T21:48:08","date_gmt":"2019-10-31T18:48:08","guid":{"rendered":"https:\/\/prohoster.info\/blog\/ne-tolko-obrabotka-kak-my-sdelali-iz-kafka-streams-raspredelennuyu-bazu-dannyh-i-chto-iz-etogo-vyshlo\/"},"modified":"2019-10-31T21:48:08","modified_gmt":"2019-10-31T18:48:08","slug":"ne-tolko-obrabotka-kak-my-sdelali-iz-kafka-streams-raspredelennuyu-bazu-dannyh-i-chto-iz-etogo-vyshlo","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/ne-tolko-obrabotka-kak-my-sdelali-iz-kafka-streams-raspredelennuyu-bazu-dannyh-i-chto-iz-etogo-vyshlo","title":{"rendered":"Nie iba spracovanie: Ako sme z Kafka Streams vytvorili distribuovan\u00fa datab\u00e1zu a \u010do z toho vzniklo","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ahoj, Habr!<\/p>\n<p>Pripom\u00edname, \u017ee po knihe o <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/product_by_id\/112863410\">Kafka<\/a><\/noindex> sme vydali nie menej zauj\u00edmav\u00fa pr\u00e1cu o kni\u017enici <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/collection\/new\/product\/kafka-streams-v-deystvii-prilozheniya-i-mikroservisy-dlya-raboty-v-realnom-vremeni\">Kafka Streams API<\/a><\/noindex>. <\/p>\n<p><img decoding=\"async\" alt=\"Nie iba spracovanie: Ako sme z Kafka Streams vytvorili distribuovan\u00fa datab\u00e1zu a \u010do z toho vzniklo\" src=\"\/wp-content\/uploads\/2019\/04\/7d16ba31ae06a96339a0755b62454f49.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nZatia\u013e \u010do komunita len objavuje hranice mo\u017enost\u00ed tohto mocn\u00e9ho n\u00e1stroja. Ned\u00e1vno vy\u0161la \u010dl\u00e1nok, s ktor\u00fdm v\u00e1s chceme obozn\u00e1mi\u0165. Na vlastnej sk\u00fasenosti autor rozpr\u00e1va, ako vytvori\u0165 z Kafka Streams distribuovan\u00e9 \u00falo\u017eisko d\u00e1t. Pr\u00edjemn\u00e9 \u010d\u00edtanie!<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex> <br \/>\nKni\u017enica Apache <noindex><a rel=\"nofollow\" href=\"https:\/\/kafka.apache.org\/documentation\/streams\/\">Kafka Streams<\/a><\/noindex> sa po celom svete pou\u017e\u00edva v podnikoch na distribuovan\u00e9 spracovanie pr\u00fadov nad Apache Kafka. Jeden z nedocenen\u00fdch aspektov tohto r\u00e1mca spo\u010d\u00edva v tom, \u017ee umo\u017e\u0148uje uklada\u0165 lok\u00e1lny stav, vytvoren\u00fd na z\u00e1klade spracovania pr\u00fadov.<\/p>\n<p>V tomto \u010dl\u00e1nku sa podel\u00edm o to, ako sa na\u0161ej spolo\u010dnosti podarilo v\u00fdhodne vyu\u017ei\u0165 t\u00fato mo\u017enos\u0165 pri v\u00fdvoji produktu na bezpe\u010dnos\u0165 cloudov\u00fdch aplik\u00e1ci\u00ed. Pomocou Kafka Streams sme vytvorili mikroservisy so zdie\u013ean\u00fdm stavom, z ktor\u00fdch ka\u017ed\u00fd sl\u00fa\u017ei ako odoln\u00fd a vysoko dostupn\u00fd zdroj presn\u00fdch inform\u00e1ci\u00ed o stave objektov v syst\u00e9me. Pre n\u00e1s je to krok vpred z poh\u013eadu spo\u013eahlivosti aj pohodlia \u00fadr\u017eby.<\/p>\n<p>Ak v\u00e1s zauj\u00edma alternat\u00edvny pr\u00edstup, ktor\u00fd umo\u017e\u0148uje vyu\u017e\u00edva\u0165 jednu centr\u00e1lnu datab\u00e1zu na podporu form\u00e1lneho stavu va\u0161ich objektov \u2013 pre\u010d\u00edtajte si, bude to zauj\u00edmav\u00e9... <\/p>\n<p><b>Pre\u010do sme us\u00fadili, \u017ee nastal \u010das zmeni\u0165 na\u0161e pr\u00edstupy k pr\u00e1ci so zdie\u013ean\u00fdm stavom <\/b><\/p>\n<p>Potrebovali sme udr\u017eiava\u0165 stav r\u00f4znych objektov, spoliehaj\u00fac sa na spr\u00e1vy agentov (napr\u00edklad: bol web vystaven\u00fd \u00fatoku?). Pred prechodom na Kafka Streams sme sa \u010dasto spoliehali na spr\u00e1vu stavu pomocou jedinej centr\u00e1lnej datab\u00e1zy (+ servisn\u00e9ho API). Tento pr\u00edstup m\u00e1 svoje nev\u00fdhody: v <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/collection\/all\/product\/vysokonagruzhennye-prilozheniya-programmirovanie-masshtabirovanie-podderzhka\">d\u00e1taintenz\u00edvnych situ\u00e1ci\u00e1ch<\/a><\/noindex> udr\u017eanie konzistencie a synchroniz\u00e1cie sa st\u00e1va skuto\u010dnou v\u00fdzvou. Datab\u00e1za sa m\u00f4\u017ee sta\u0165 \u00fazkym miestom alebo sa ocitn\u00fa\u0165 v <noindex><a rel=\"nofollow\" href=\"https:\/\/stackoverflow.com\/questions\/9850336\/database-race-conditions\">stavovej s\u00fa\u0165a\u017ei<\/a><\/noindex> a trpie\u0165 nep\u0159edv\u00eddate\u013enos\u0165ou.<\/p>\n<p><img decoding=\"async\" alt=\"Nie iba spracovanie: Ako sme z Kafka Streams vytvorili distribuovan\u00fa datab\u00e1zu a \u010do z toho vzniklo\" src=\"\/wp-content\/uploads\/2019\/04\/7fd4afa4d56578cf327e6391883933f1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustr\u00e1cia 1: typick\u00fd scen\u00e1r s rozdelen\u00edm stavu, ktor\u00fd sa vyskytoval pred prechodom na <br \/>\nKafka a Kafka Streams: agenti oznamuj\u00fa svoje predpoklady cez API, aktualizovan\u00fd stav sa vypo\u010d\u00edta cez centr\u00e1lnu datab\u00e1zu <\/i><\/p>\n<p><b>Zozn\u00e1mte sa s Kafka Streams \u2013 teraz je jednoduch\u00e9 vytv\u00e1ra\u0165 mikroslu\u017eby so zdie\u013ean\u00fdm stavom <\/b><\/p>\n<p>Pred pribli\u017ene rokom sme sa rozhodli podrobne presk\u00fama\u0165 na\u0161e scen\u00e1re pr\u00e1ce so zdie\u013ean\u00fdm stavom, aby sme sa vysporiadali s tak\u00fdmito probl\u00e9mami. Rozhodli sme sa okam\u017eite vysk\u00fa\u0161a\u0165 Kafka Streams \u2013 je zn\u00e1me, ak\u00e1 je \u0161k\u00e1lovate\u013en\u00e1, vysoko dostupn\u00e1 a odoln\u00e1 vo\u010di chyb\u00e1m, a ak\u00e9 bohat\u00e9 m\u00e1 funkcie spracovania tokov (vr\u00e1tane transform\u00e1ci\u00ed so zachovan\u00edm stavu). Presne to, \u010do sme potrebovali, nehovoriac o tom, ak\u00fd zrel\u00fd a spo\u013eahliv\u00fd syst\u00e9m v\u00fdmeny spr\u00e1v vznikol v Kugene.<\/p>\n<p>Ka\u017ed\u00e1 z na\u0161ich vytvoren\u00fdch mikroslu\u017eieb so zdie\u013ean\u00fdm stavom bola postaven\u00e1 na instance Kafka Streams s pomerne jednoduchou topol\u00f3giou. Skladala sa z 1) zdroja 2) spracovate\u013ea s trval\u00fdm \u00falo\u017eiskom k\u013e\u00fa\u010dov a hodn\u00f4t 3) toku:<\/p>\n<p><img decoding=\"async\" alt=\"Nie iba spracovanie: Ako sme z Kafka Streams vytvorili distribuovan\u00fa datab\u00e1zu a \u010do z toho vzniklo\" src=\"\/wp-content\/uploads\/2019\/04\/b6bfdbb87ef774dd914b0e4e60405ec5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustr\u00e1cia 2: predvolen\u00e9 topol\u00f3gie na\u0161ich streamov\u00fdch in\u0161tanci\u00ed pre mikroslu\u017eby so zdie\u013ean\u00fdm stavom. V\u0161imnite si, \u017ee tu sa nach\u00e1dza aj \u00falo\u017eisko, ktor\u00e9 obsahuje metadata o pl\u00e1novan\u00ed. <\/i><\/p>\n<p>Pri takomto novom pr\u00edstupe agenti zostavuj\u00fa spr\u00e1vy, ktor\u00e9 s\u00fa zasielan\u00e9 do po\u010diato\u010dn\u00e9ho topiku, zatia\u013e \u010do konzumenti \u2013 povedzme, slu\u017eba po\u0161tov\u00fdch ozn\u00e1men\u00ed \u2013 prij\u00edmaj\u00fa vypo\u010d\u00edtan\u00fd zdie\u013ean\u00fd stav cez tok (v\u00fdstupn\u00fd topik).<\/p>\n<p><img decoding=\"async\" alt=\"Nie iba spracovanie: Ako sme z Kafka Streams vytvorili distribuovan\u00fa datab\u00e1zu a \u010do z toho vzniklo\" src=\"\/wp-content\/uploads\/2019\/04\/de60549d9cc1d5c0c473364d5236a339.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustr\u00e1cia 3: nov\u00fd pr\u00edklad toku \u00faloh pre scen\u00e1r so zdie\u013ean\u00fdmi mikroslu\u017ebami: 1) agent generuje spr\u00e1vu, ktor\u00e1 ide do po\u010diato\u010dn\u00e9ho topiku Kafka; 2) mikroslu\u017eba so zdie\u013ean\u00fdm stavom (pou\u017e\u00edvaj\u00faca Kafka Streams) ju spracov\u00e1va a zapisuje vypo\u010d\u00edtan\u00fd stav do koncov\u00e9ho topiku Kafka; n\u00e1sledne 3) konzumenti prij\u00edmaj\u00fa nov\u00fd stav<\/i><\/p>\n<p><b>Hej, toto vstavan\u00e9 \u00falo\u017eisko k\u013e\u00fa\u010dov a hodn\u00f4t je naozaj ve\u013emi u\u017eito\u010dn\u00e9!<\/b><\/p>\n<p>Ako u\u017e bolo spomenut\u00e9, na\u0161a topol\u00f3gia so zdie\u013ean\u00fdm stavom obsahuje \u00falo\u017eisko k\u013e\u00fa\u010dov a hodn\u00f4t. Na\u0161li sme nieko\u013eko mo\u017enost\u00ed jeho vyu\u017eitia a dve z nich s\u00fa op\u00edsan\u00e9 ni\u017e\u0161ie.<\/p>\n<p><i><b>Mo\u017enos\u0165 \u010d. 1: vyu\u017eitie \u00falo\u017eiska k\u013e\u00fa\u010dov a hodn\u00f4t pri v\u00fdpo\u010dtoch<\/b><\/i><\/p>\n<p>Na\u0161e prv\u00e9 \u00falo\u017eisko k\u013e\u00fa\u010dov a hodn\u00f4t obsahovalo pomocn\u00e9 \u00fadaje, ktor\u00e9 sme potrebovali na v\u00fdpo\u010dty. Napr\u00edklad v niektor\u00fdch pr\u00edpadoch sa zdie\u013ean\u00fd stav ur\u010doval na z\u00e1klade \u201ev\u00e4\u010d\u0161iny hlasov\u201c. V \u00falo\u017eisku sme mohli uchov\u00e1va\u0165 v\u0161etky posledn\u00e9 spr\u00e1vy agentov o stave ur\u010dit\u00e9ho objektu. Potom, ke\u010f sme dostali nov\u00fa spr\u00e1vu od nejak\u00e9ho agenta, mohli sme ju ulo\u017ei\u0165, na\u010d\u00edta\u0165 z \u00falo\u017eiska spr\u00e1vy v\u0161etk\u00fdch ostatn\u00fdch agentov o stave toho ist\u00e9ho objektu a zopakova\u0165 v\u00fdpo\u010det.<br \/>\nNa obr\u00e1zku 4 je zn\u00e1zornen\u00e9, ako sme otvorili pr\u00edstup k \u00falo\u017eisku k\u013e\u00fa\u010dov a hodn\u00f4t spracov\u00e1vaj\u00facej met\u00f3de procesora, aby sa dalo n\u00e1sledne spracova\u0165 nov\u00e9 hl\u00e1senie.<\/p>\n<p><img decoding=\"async\" alt=\"Nie iba spracovanie: Ako sme z Kafka Streams vytvorili distribuovan\u00fa datab\u00e1zu a \u010do z toho vzniklo\" src=\"\/wp-content\/uploads\/2019\/04\/8c11f9aac4c616b1ebf59d2fe5431ea0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Obr\u00e1zok 4: Otvorenie pr\u00edstupu k \u00falo\u017eisku k\u013e\u00fa\u010dov a hodn\u00f4t pre spracov\u00e1vaj\u00facu met\u00f3du procesora (po tomto mus\u00ed by\u0165 v ka\u017edom scen\u00e1ri pracuj\u00facom so zdie\u013ean\u00fdm stavom implementovan\u00e1 met\u00f3da <code>doProcess<\/code>)<\/i><\/p>\n<p><i><b>Varianta #2: Vytvorenie CRUD API nad Kafka Streams<\/b><\/i><\/p>\n<p>Ke\u010f sme nastavili n\u00e1\u0161 z\u00e1kladn\u00fd tok \u00faloh, za\u010dali sme sk\u00fa\u0161a\u0165 vytvori\u0165 RESTful CRUD API pre na\u0161e mikroservisy so zdie\u013ean\u00fdm stavom. Chceli sme, aby bolo mo\u017en\u00e9 na\u010d\u00edta\u0165 stav niektor\u00fdch alebo v\u0161etk\u00fdch objektov, ako aj nastavova\u0165 alebo odstra\u0148ova\u0165 stav objektu (to je u\u017eito\u010dn\u00e9 pri podpore serverovej \u010dasti).<\/p>\n<p>Pre podporu v\u0161etk\u00fdch API Get State, zaka\u017ed\u00fdm, ke\u010f sme potrebovali znova vypo\u010d\u00edta\u0165 stav pri spracovan\u00ed, sme ho dlhodobo ukl\u00e1dali do zabudovan\u00e9ho \u00falo\u017eiska k\u013e\u00fa\u010dov a hodn\u00f4t. V takom pr\u00edpade je dos\u0165 jednoduch\u00e9 implementova\u0165 tak\u00e9to API pomocou jedinej in\u0161tancie Kafka Streams, ako je zobrazen\u00e9 v ni\u017e\u0161ie uvedenom v\u00fdpise:<\/p>\n<p><img decoding=\"async\" alt=\"Nie iba spracovanie: Ako sme z Kafka Streams vytvorili distribuovan\u00fa datab\u00e1zu a \u010do z toho vzniklo\" src=\"\/wp-content\/uploads\/2019\/04\/614f601f7b4cf407c2b2a7826e377cbb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Obr\u00e1zok 5: Pou\u017eitie zabudovan\u00e9ho \u00falo\u017eiska k\u013e\u00fa\u010dov a hodn\u00f4t na z\u00edskanie predpo\u010d\u00edtan\u00e9ho stavu objektu <\/i><\/p>\n<p>Aktualiz\u00e1cia stavu objektu cez API nie je tie\u017e \u0165a\u017ek\u00e9 implementova\u0165. V podstate sta\u010d\u00ed len vytvori\u0165 Kafka producenta a s jeho pomocou uskuto\u010dni\u0165 z\u00e1pis, ktor\u00fd obsahuje nov\u00fd stav. To zaru\u010duje, \u017ee v\u0161etky spr\u00e1vy generovan\u00e9 cez API bud\u00fa spracov\u00e1van\u00e9 presne tak, ako aj tie, ktor\u00e9 prich\u00e1dzaj\u00fa od in\u00fdch producentov (napr. agentov).<\/p>\n<p><img decoding=\"async\" alt=\"Nie iba spracovanie: Ako sme z Kafka Streams vytvorili distribuovan\u00fa datab\u00e1zu a \u010do z toho vzniklo\" src=\"\/wp-content\/uploads\/2019\/04\/0b03bbafb3cf5a41164e9df85b766fcf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Obr\u00e1zok 6: Stav objektu je mo\u017en\u00e9 nastavi\u0165 pomocou Kafka producenta <\/i><\/p>\n<p><b>Mal\u00e9 komplik\u00e1cie: Kafka m\u00e1 mno\u017estvo partit\u00e1ci\u00ed<\/b><\/p>\n<p>\u010ealej sme chceli rozlo\u017ei\u0165 z\u00e1\u0165a\u017e spojen\u00fa s spracovan\u00edm a zlep\u0161i\u0165 dostupnos\u0165 t\u00fdm, \u017ee sme pre ka\u017ed\u00fd scen\u00e1r poskytli kluster mikroslu\u017eieb so zdie\u013ean\u00fdm stavom. Nastavenie n\u00e1m i\u0161lo ve\u013emi hladko: po tom, \u010do sme nakonfigurovali v\u0161etky in\u0161tancie tak, aby pracovali s rovnak\u00fdm ID aplik\u00e1cie (a s t\u00fdmi ist\u00fdmi servermi pre po\u010diato\u010dn\u00e9 na\u010d\u00edtanie), takmer v\u0161etko ostatn\u00e9 prebehlo automaticky. Tie\u017e sme ur\u010dili, \u017ee ka\u017ed\u00fd zdrojov\u00fd topic bude pozost\u00e1va\u0165 z viacer\u00fdch part\u00edci\u00ed, aby ka\u017edej in\u0161tancii mohol by\u0165 pridelen\u00fd podmno\u017eina tak\u00fdchto part\u00edci\u00ed.<\/p>\n<p>Taktie\u017e by som spomenul, \u017ee tu je be\u017enou praxou robi\u0165 z\u00e1lohu \u00falo\u017eiska stavov, aby sme, napr\u00edklad, v pr\u00edpade obnovenia po zlyhan\u00ed mohli presun\u00fa\u0165 t\u00fato k\u00f3piu na in\u00fa in\u0161tanciu. Na ka\u017ed\u00e9 \u00falo\u017eisko stavov v Kafka Streams sa vytv\u00e1ra replika\u010dn\u00fd topic s denn\u00edkom zmien (v ktorom s\u00fa sledovan\u00e9 lok\u00e1lne aktualiz\u00e1cie). T\u00fdmto sp\u00f4sobom Kafka neust\u00e1le podopiera \u00falo\u017eisko stavov. Ak d\u00f4jde k zlyhaniu tej \u010di onej in\u0161tancie, stavov\u00e9 \u00falo\u017eisko Kafka Streams m\u00f4\u017ee by\u0165 r\u00fdchlo obnoven\u00e9 na inej in\u0161tancii, na ktor\u00fa prejd\u00fa pr\u00edslu\u0161n\u00e9 part\u00edcie. Na\u0161e testy uk\u00e1zali, \u017ee to prebieha za nieko\u013eko sek\u00fand, aj ke\u010f v \u00falo\u017eisku s\u00fa mili\u00f3ny z\u00e1znamov.<\/p>\n<p>Prechod z jednej mikroslu\u017eby so zdie\u013ean\u00fdm stavom na kluster mikroslu\u017eieb rob\u00ed implement\u00e1ciu Get State API menej trivi\u00e1lnou. V novej situ\u00e1cii obsahuje \u00falo\u017eisko stavov ka\u017edej mikroslu\u017eby iba \u010das\u0165 celkov\u00e9ho obrazu (tie objekty, ktor\u00fdch k\u013e\u00fa\u010de sa mapovali na konkr\u00e9tnu part\u00edciu). Museli sme ur\u010di\u0165, na ktorej in\u0161tancii sa nach\u00e1dzal stav potrebn\u00e9ho objektu, a robili sme to na z\u00e1klade metad\u00e1t pr\u00fadov, ako je uk\u00e1zan\u00e9 ni\u017e\u0161ie:<\/p>\n<p><img decoding=\"async\" alt=\"Nie iba spracovanie: Ako sme z Kafka Streams vytvorili distribuovan\u00fa datab\u00e1zu a \u010do z toho vzniklo\" src=\"\/wp-content\/uploads\/2019\/04\/7182a396869f2f9692d895fc5084cccb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustr\u00e1cia 7: pomocou metad\u00e1t pr\u00fadov ur\u010dujeme, z ktorej in\u0161tancie po\u017eadova\u0165 stav potrebn\u00e9ho objektu; podobn\u00fd pr\u00edstup bol uplatnen\u00fd s GET ALL API<\/i><\/p>\n<p><b>Hlavn\u00e9 zistenia<\/b><\/p>\n<p>\u00dalo\u017eisk\u00e1 stavov v Kafka Streams de facto m\u00f4\u017eu sl\u00fa\u017ei\u0165 ako distribuovan\u00e1 datab\u00e1za, <\/p>\n<ul>\n<li>neust\u00e1le replikovan\u00e1 v Kafke<\/li>\n<li>Nad tak\u00fdmto syst\u00e9mom sa \u013eahko buduje CRUD API <\/li>\n<li>Spracovanie viacer\u00fdch part\u00edci\u00ed sa ukazuje ako o nie\u010do zlo\u017eitej\u0161ie <\/li>\n<li>Mo\u017eno tie\u017e prida\u0165 jedno alebo viac \u00falo\u017e\u00edsk stavov do streamovej topol\u00f3gie na uchov\u00e1vanie pomocn\u00fdch \u00fadajov. Tento variant m\u00f4\u017ee by\u0165 pou\u017eit\u00fd na:<\/li>\n<li>Dlhodob\u00e9 uchov\u00e1vanie \u00fadajov potrebn\u00fdch na v\u00fdpo\u010dty pri streamovom spracovan\u00ed <\/li>\n<li>Dlhodob\u00e9 uchov\u00e1vanie \u00fadajov, ktor\u00e9 m\u00f4\u017eu by\u0165 u\u017eito\u010dn\u00e9 pri nasleduj\u00facej inicializ\u00e1cii streamov\u00e9ho in\u0161tancie <\/li>\n<li>mnoh\u00fdch \u010fal\u0161\u00edch vec\u00ed\u2026<\/li>\n<\/ul>\n<p>V\u010faka t\u00fdmto a \u010fal\u0161\u00edm v\u00fdhod\u00e1m je Kafka Streams vynikaj\u00faca na podporu glob\u00e1lneho stavu v takej distribuovanej s\u00fastave, ako je t\u00e1 na\u0161a. Kafka Streams sa v produkcii osved\u010dila ako ve\u013emi spo\u013eahliv\u00e1 (od jej nasadenia sme takmer nestratili \u017eiadne spr\u00e1vy) a sme presved\u010den\u00ed, \u017ee jej mo\u017enosti sa t\u00fdmto nekon\u010dia!<br \/>\n<br \/>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/piter\/blog\/449928\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0432\u0441\u043b\u0435\u0434 \u0437\u0430 \u043a\u043d\u0438\u0433\u043e\u0439 \u043e Kafka \u043c\u044b \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0442\u0440\u0443\u0434 \u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 Kafka Streams API. \u041f\u043e\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0449\u043d\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430. \u0422\u0430\u043a, \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u0432\u044b\u0448\u043b\u0430 \u0441\u0442\u0430\u0442\u044c\u044f, \u0441 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u043c \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0432\u0430\u0441 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c. \u041d\u0430 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u043e\u043f\u044b\u0442\u0435 \u0430\u0432\u0442\u043e\u0440 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0437 Kafka Streams \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u0440\u0438\u044f\u0442\u043d\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f! [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":24423,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-32632","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0432\u0441\u043b\u0435\u0434 \u0437\u0430 \u043a\u043d\u0438\u0433\u043e\u0439 \u043e Kafka \u043c\u044b \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0442\u0440\u0443\u0434 \u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/ne-tolko-obrabotka-kak-my-sdelali-iz-kafka-streams-raspredelennuyu-bazu-dannyh-i-chto-iz-etogo-vyshlo\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"sk_SK\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430: \u041a\u0430\u043a \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0438\u0437 Kafka Streams \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u0447\u0442\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0448\u043b\u043e | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0432\u0441\u043b\u0435\u0434 \u0437\u0430 \u043a\u043d\u0438\u0433\u043e\u0439 \u043e Kafka \u043c\u044b \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0442\u0440\u0443\u0434 \u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/ne-tolko-obrabotka-kak-my-sdelali-iz-kafka-streams-raspredelennuyu-bazu-dannyh-i-chto-iz-etogo-vyshlo\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:48:08+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:48:08+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Nie len spracovanie: Ako sme z Kafka Streams vytvorili distribuovan\u00fa datab\u00e1zu a \u010do z toho vzi\u0161lo | ProHoster","description":"Ahoj, Habr! Pripom\u00edname, \u017ee po knihe o Kafke sme vydali nemenej zauj\u00edmav\u00fa pr\u00e1cu o kni\u017enici","canonical_url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/ne-tolko-obrabotka-kak-my-sdelali-iz-kafka-streams-raspredelennuyu-bazu-dannyh-i-chto-iz-etogo-vyshlo","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sk_SK","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430: \u041a\u0430\u043a \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0438\u0437 Kafka Streams \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u0447\u0442\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0448\u043b\u043e | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0432\u0441\u043b\u0435\u0434 \u0437\u0430 \u043a\u043d\u0438\u0433\u043e\u0439 \u043e Kafka \u043c\u044b \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0442\u0440\u0443\u0434 \u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435","og:url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/ne-tolko-obrabotka-kak-my-sdelali-iz-kafka-streams-raspredelennuyu-bazu-dannyh-i-chto-iz-etogo-vyshlo","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:48:08+00:00","article:modified_time":"2019-10-31T18:48:08+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"32632","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 11:51:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:55:24","updated":"2026-01-21 11:51:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/32632","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/comments?post=32632"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/32632\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media\/24423"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media?parent=32632"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/categories?post=32632"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/tags?post=32632"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}