{"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\/cs\/blog\/administrirovanie\/ne-tolko-obrabotka-kak-my-sdelali-iz-kafka-streams-raspredelennuyu-bazu-dannyh-i-chto-iz-etogo-vyshlo","title":{"rendered":"Nejen zpracov\u00e1n\u00ed: Jak jsme z Kafka Streams ud\u011blali distribuovanou datab\u00e1zi a co z toho vze\u0161lo","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ahoj, Habr!<\/p>\n<p>P\u0159ipom\u00edn\u00e1me, \u017ee po knize o <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/product_by_id\/112863410\">Kafka<\/a><\/noindex> jsme vydali nem\u00e9n\u011b zaj\u00edmavou pr\u00e1ci o knihovn\u011b <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=\"Nejen zpracov\u00e1n\u00ed: Jak jsme z Kafka Streams ud\u011blali distribuovanou datab\u00e1zi a co z toho vze\u0161lo\" src=\"\/wp-content\/uploads\/2019\/04\/7d16ba31ae06a96339a0755b62454f49.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nZat\u00edmco komunita teprve objevuje hranice mo\u017enost\u00ed tohoto mocn\u00e9ho n\u00e1stroje. Ned\u00e1vno vy\u0161el \u010dl\u00e1nek, se kter\u00fdm v\u00e1s chceme sezn\u00e1mit. Na vlastn\u00edch zku\u0161enostech autor popisuje, jak p\u0159etvo\u0159it Kafka Streams na distribuovan\u00e9 \u00falo\u017ei\u0161t\u011b dat. P\u0159\u00edjemn\u00e9 \u010dten\u00ed!<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex> <br \/>\nKnihovna Apache <noindex><a rel=\"nofollow\" href=\"https:\/\/kafka.apache.org\/documentation\/streams\/\">Kafka Streams<\/a><\/noindex> se po cel\u00e9m sv\u011bt\u011b pou\u017e\u00edv\u00e1 v podnic\u00edch pro distribuovan\u00e9 streamov\u00e1n\u00ed dat nad Apache Kafka. Jeden z podce\u0148ovan\u00fdch aspekt\u016f tohoto r\u00e1mce spo\u010d\u00edv\u00e1 v tom, \u017ee umo\u017e\u0148uje uchov\u00e1vat m\u00edstn\u00ed stav, kter\u00fd vznik\u00e1 na z\u00e1klad\u011b streamovan\u00e9ho zpracov\u00e1n\u00ed.<\/p>\n<p>V tomto \u010dl\u00e1nku budu vypr\u00e1v\u011bt, jak se n\u00e1m v na\u0161\u00ed spole\u010dnosti poda\u0159ilo v\u00fdhodn\u011b vyu\u017e\u00edt tuto mo\u017enost p\u0159i v\u00fdvoji produktu pro zabezpe\u010den\u00ed cloudov\u00fdch aplikac\u00ed. Pomoc\u00ed Kafka Streams jsme vytvo\u0159ili mikroslu\u017eby se sd\u00edlen\u00fdm stavem, z nich\u017e ka\u017ed\u00e1 slou\u017e\u00ed jako odoln\u00fd a vysoce dostupn\u00fd zdroj spolehliv\u00fdch informac\u00ed o stavu objekt\u016f v syst\u00e9mu. Pro n\u00e1s je to krok vp\u0159ed jak co do spolehlivosti, tak co do pohodl\u00ed \u00fadr\u017eby.<\/p>\n<p>Pokud v\u00e1s zaj\u00edm\u00e1 alternativn\u00ed p\u0159\u00edstup, kter\u00fd umo\u017e\u0148uje pou\u017e\u00edvat jednotnou centr\u00e1ln\u00ed datab\u00e1zi pro podporu form\u00e1ln\u00edho stavu va\u0161ich objekt\u016f \u2013 p\u0159e\u010dt\u011bte si, bude to zaj\u00edmav\u00e9\u2026 <\/p>\n<p><b>Pro\u010d jsme usoudili, \u017ee je \u010das zm\u011bnit na\u0161e p\u0159\u00edstupy k pr\u00e1ci se sd\u00edlen\u00fdm stavem <\/b><\/p>\n<p>Pot\u0159ebovali jsme udr\u017eovat stav r\u016fzn\u00fdch objekt\u016f, zalo\u017een\u00fd na zpr\u00e1v\u00e1ch agent\u016f (nap\u0159\u00edklad: byl web napaden?). P\u0159ed p\u0159echodem na Kafka Streams jsme \u010dasto spol\u00e9hali na jedin\u00e9 centr\u00e1ln\u00ed datab\u00e1zi (+ servisn\u00ed API) pro \u0159\u00edzen\u00ed stavu. Tento p\u0159\u00edstup m\u00e1 sv\u00e9 nedostatky: v <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/collection\/all\/product\/vysokonagruzhennye-prilozheniya-programmirovanie-masshtabirovanie-podderzhka\">datech intenzivn\u00edch situac\u00edch<\/a><\/noindex> udr\u017eov\u00e1n\u00ed konzistence a synchronizace se st\u00e1v\u00e1 skute\u010dnou v\u00fdzvou. Datab\u00e1ze se m\u016f\u017ee st\u00e1t \u00fazk\u00fdm m\u00edstem, nebo se ocitnout v <noindex><a rel=\"nofollow\" href=\"https:\/\/stackoverflow.com\/questions\/9850336\/database-race-conditions\">stavu z\u00e1vodu<\/a><\/noindex> a trp\u011bt nep\u0159edv\u00eddatelnost\u00ed.<\/p>\n<p><img decoding=\"async\" alt=\"Nejen zpracov\u00e1n\u00ed: Jak jsme z Kafka Streams ud\u011blali distribuovanou datab\u00e1zi a co z toho vze\u0161lo\" src=\"\/wp-content\/uploads\/2019\/04\/7fd4afa4d56578cf327e6391883933f1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustrace 1: typick\u00fd sc\u00e9n\u00e1\u0159 s rozd\u011blen\u00edm stavu, kter\u00fd byl b\u011b\u017en\u00fd p\u0159ed p\u0159echodem na <br \/>\nKafka a Kafka Streams: agenti p\u0159edkl\u00e1daj\u00ed sv\u00e9 pohledy p\u0159es API, aktualizovan\u00fd stav se vypo\u010d\u00edt\u00e1v\u00e1 p\u0159es centr\u00e1ln\u00ed datab\u00e1zi. <\/i><\/p>\n<p><b>Seznamte se s Kafka Streams \u2013 nyn\u00ed je jednoduch\u00e9 vytv\u00e1\u0159et mikroslu\u017eby se sd\u00edlen\u00fdm stavem. <\/b><\/p>\n<p>P\u0159ibli\u017en\u011b p\u0159ed rokem jsme se rozhodli po\u0159\u00e1dn\u011b p\u0159epracovat na\u0161e sc\u00e9n\u00e1\u0159e pro pr\u00e1ci se sd\u00edlen\u00fdm stavem, abychom se vypo\u0159\u00e1dali s t\u011bmito probl\u00e9my. Okam\u017eit\u011b jsme se rozhodli vyzkou\u0161et Kafka Streams \u2013 je zn\u00e1mo, jak je \u0161k\u00e1lovateln\u00e1, vysoce dostupn\u00e1 a odoln\u00e1 proti chyb\u00e1m, jak\u00e1 bohat\u00e1 funk\u010dnost streamov\u00e1n\u00ed nab\u00edz\u00ed (transformace, v\u010detn\u011b t\u011bch s uchov\u00e1n\u00edm stavu). P\u0159esn\u011b to, co jsme pot\u0159ebovali, nemluv\u011b o tom, jak zral\u00fd a spolehliv\u00fd syst\u00e9m v\u00fdm\u011bny zpr\u00e1v v Kafka vznikl.<\/p>\n<p>Ka\u017ed\u00fd z na\u0161ich vytvo\u0159en\u00fdch mikroslu\u017eeb se sd\u00edlen\u00fdm stavem byl postaven na z\u00e1klad\u011b instance Kafka Streams s pom\u011brn\u011b jednoduchou topologi\u00ed. Sest\u00e1val se z 1) zdroje 2) procesoru s trval\u00fdm ulo\u017een\u00edm kl\u00ed\u010d\u016f a hodnot 3) potrub\u00ed:<\/p>\n<p><img decoding=\"async\" alt=\"Nejen zpracov\u00e1n\u00ed: Jak jsme z Kafka Streams ud\u011blali distribuovanou datab\u00e1zi a co z toho vze\u0161lo\" src=\"\/wp-content\/uploads\/2019\/04\/b6bfdbb87ef774dd914b0e4e60405ec5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Obr\u00e1zek 2: v\u00fdchoz\u00ed topologie na\u0161ich streamingov\u00fdch instanc\u00ed pro mikroslu\u017eby se sd\u00edlen\u00fdm stavem. V\u0161imn\u011bte si, \u017ee zde je tak\u00e9 \u00falo\u017ei\u0161t\u011b, kter\u00e9 obsahuje metadata o pl\u00e1nov\u00e1n\u00ed. <\/i><\/p>\n<p>P\u0159i t\u00e9to nov\u00e9 p\u0159\u00edstupu agenti vytv\u00e1\u0159ej\u00ed zpr\u00e1vy, kter\u00e9 se pos\u00edlaj\u00ed do v\u00fdchoz\u00edho topiku, a spot\u0159ebitel\u00e9 \u2013 nap\u0159\u00edklad slu\u017eba po\u0161tovn\u00edch upozorn\u011bn\u00ed \u2013 p\u0159ij\u00edmaj\u00ed vypo\u010d\u00edtan\u00fd sd\u00edlen\u00fd stav p\u0159es potrub\u00ed (v\u00fdstupn\u00ed topik).<\/p>\n<p><img decoding=\"async\" alt=\"Nejen zpracov\u00e1n\u00ed: Jak jsme z Kafka Streams ud\u011blali distribuovanou datab\u00e1zi a co z toho vze\u0161lo\" src=\"\/wp-content\/uploads\/2019\/04\/de60549d9cc1d5c0c473364d5236a339.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Obr\u00e1zek 3: nov\u00fd p\u0159\u00edklad spr\u00e1vn\u00edho toku pro sc\u00e9n\u00e1\u0159 se sd\u00edlen\u00fdmi mikroslu\u017ebami: 1) agent generuje zpr\u00e1vu, kter\u00e1 se dostane do v\u00fdchoz\u00edho topiku Kafka; 2) mikroslu\u017eba se sd\u00edlen\u00fdm stavem (pou\u017e\u00edvaj\u00edc\u00ed Kafka Streams) ji zpracov\u00e1v\u00e1 a zapisuje vypo\u010d\u00edtan\u00fd stav do koncov\u00e9ho topiku Kafka; po \u010dem\u017e 3) spot\u0159ebitel\u00e9 p\u0159ij\u00edmaj\u00ed nov\u00fd stav.<\/i><\/p>\n<p><b>Hele, to vestav\u011bn\u00e9 \u00falo\u017ei\u0161t\u011b kl\u00ed\u010d\u016f a hodnot je opravdu velmi u\u017eite\u010dn\u00e9!<\/b><\/p>\n<p>Jak bylo zm\u00edn\u011bno v\u00fd\u0161e, na\u0161e topologie se sd\u00edlen\u00fdm stavem obsahuje \u00falo\u017ei\u0161t\u011b kl\u00ed\u010d\u016f a hodnot. Na\u0161li jsme n\u011bkolik mo\u017enost\u00ed jeho pou\u017eit\u00ed a dv\u011b z nich jsou pops\u00e1ny n\u00ed\u017ee.<\/p>\n<p><i><b>Mo\u017enost \u010d. 1: pou\u017eit\u00ed \u00falo\u017ei\u0161t\u011b kl\u00ed\u010d\u016f a hodnot p\u0159i v\u00fdpo\u010dtech.<\/b><\/i><\/p>\n<p>Na\u0161e prvn\u00ed \u00falo\u017ei\u0161t\u011b kl\u00ed\u010d\u016f a hodnot obsahovalo pomocn\u00e1 data, kter\u00e1 jsme pot\u0159ebovali pro v\u00fdpo\u010dty. Nap\u0159\u00edklad v n\u011bkter\u00fdch p\u0159\u00edpadech bylo sd\u00edlen\u00e9 stavov\u00e9 ur\u010deno na z\u00e1klad\u011b principu \u201ev\u011bt\u0161inov\u00e9ho hlasov\u00e1n\u00ed\u201c. V \u00falo\u017ei\u0161ti jsme mohli uchov\u00e1vat v\u0161echny posledn\u00ed zpr\u00e1vy agent\u016f o stavu ur\u010dit\u00e9ho objektu. Pot\u00e9, co jsme obdr\u017eeli novou zpr\u00e1vu od jednoho z agent\u016f, jsme mohli jej\u00ed zpr\u00e1vu ulo\u017eit, vyhledat zpr\u00e1vy v\u0161ech ostatn\u00edch agent\u016f o stavu t\u00e9ho\u017e objektu a zopakovat v\u00fdpo\u010det.<br \/>\nN\u00ed\u017ee na ilustraci 4 je zn\u00e1zorn\u011bno, jak jsme otev\u0159eli p\u0159\u00edstup k \u00falo\u017ei\u0161ti kl\u00ed\u010d\u016f a hodnot zpracov\u00e1vaj\u00edc\u00edmu metod\u011b procesoru, aby bylo mo\u017en\u00e9 zpracovat novou zpr\u00e1vu.<\/p>\n<p><img decoding=\"async\" alt=\"Nejen zpracov\u00e1n\u00ed: Jak jsme z Kafka Streams ud\u011blali distribuovanou datab\u00e1zi a co z toho vze\u0161lo\" src=\"\/wp-content\/uploads\/2019\/04\/8c11f9aac4c616b1ebf59d2fe5431ea0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustrace 4: otev\u0159en\u00ed p\u0159\u00edstupu k \u00falo\u017ei\u0161ti kl\u00ed\u010d\u016f a hodnot pro zpracov\u00e1vaj\u00edc\u00ed metodu procesoru (pot\u00e9 je v ka\u017ed\u00e9m sc\u00e9n\u00e1\u0159i pracuj\u00edc\u00edm se sd\u00edlen\u00fdm stavem nutn\u00e9 implementovat metodu <code>doProcess<\/code>)<\/i><\/p>\n<p><i><b>Varianta #2: vytvo\u0159en\u00ed CRUD API nad Kafka Streams<\/b><\/i><\/p>\n<p>Pot\u00e9, co jsme nastavili n\u00e1\u0161 z\u00e1kladn\u00ed tok \u00faloh, jsme se pokusili napsat RESTful CRUD API pro na\u0161e mikroservisy se sd\u00edlen\u00fdm stavem. Cht\u011bli jsme, aby bylo mo\u017en\u00e9 z\u00edsk\u00e1vat stav n\u011bkter\u00fdch nebo v\u0161ech objekt\u016f, a tak\u00e9 nastavovat nebo odstra\u0148ovat stav objektu (co\u017e je u\u017eite\u010dn\u00e9 p\u0159i podpo\u0159e serverov\u00e9 \u010d\u00e1sti).<\/p>\n<p>Pro podporu v\u0161ech API Get State, kdykoli bylo pot\u0159eba znovu vypo\u010d\u00edtat stav p\u0159i zpracov\u00e1n\u00ed, jsme ho na dlouho ukl\u00e1dali do vestav\u011bn\u00e9ho \u00falo\u017ei\u0161t\u011b kl\u00ed\u010d\u016f a hodnot. V takov\u00e9m p\u0159\u00edpad\u011b je dostate\u010dn\u011b jednoduch\u00e9 implementovat takov\u00e9 API pomoc\u00ed jedin\u00e9ho instance Kafka Streams, jak je uk\u00e1z\u00e1no v n\u00e1sleduj\u00edc\u00edm v\u00fdpisu:<\/p>\n<p><img decoding=\"async\" alt=\"Nejen zpracov\u00e1n\u00ed: Jak jsme z Kafka Streams ud\u011blali distribuovanou datab\u00e1zi a co z toho vze\u0161lo\" src=\"\/wp-content\/uploads\/2019\/04\/614f601f7b4cf407c2b2a7826e377cbb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustrace 5: pou\u017eit\u00ed vestav\u011bn\u00e9ho \u00falo\u017ei\u0161t\u011b kl\u00ed\u010d\u016f a hodnot pro z\u00edsk\u00e1n\u00ed p\u0159edpo\u010d\u00edtan\u00e9ho stavu objektu <\/i><\/p>\n<p>Aktualizace stavu objektu prost\u0159ednictv\u00edm API tak\u00e9 nen\u00ed slo\u017eit\u00e1. V z\u00e1sad\u011b je t\u0159eba pouze vytvo\u0159it producenta Kafka a pomoc\u00ed n\u011bj prov\u00e9st z\u00e1pis, kter\u00fd obsahuje nov\u00fd stav. T\u00edm se zaru\u010duje, \u017ee v\u0161echny zpr\u00e1vy generovan\u00e9 prost\u0159ednictv\u00edm API budou zpracov\u00e1v\u00e1ny p\u0159esn\u011b tak, jak ty, kter\u00e9 p\u0159ich\u00e1zej\u00ed od jin\u00fdch producent\u016f (nap\u0159. agent\u016f).<\/p>\n<p><img decoding=\"async\" alt=\"Nejen zpracov\u00e1n\u00ed: Jak jsme z Kafka Streams ud\u011blali distribuovanou datab\u00e1zi a co z toho vze\u0161lo\" src=\"\/wp-content\/uploads\/2019\/04\/0b03bbafb3cf5a41164e9df85b766fcf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustrace 6: stav objektu lze nastavit pomoc\u00ed producenta Kafka <\/i><\/p>\n<p><b>Mal\u00e9 komplikace: Kafka m\u00e1 mnoho parti\u00ed<\/b><\/p>\n<p>D\u00e1le jsme cht\u011bli rozlo\u017eit z\u00e1t\u011b\u017e spojenou s zpracov\u00e1n\u00edm a zlep\u0161it dostupnost t\u00edm, \u017ee na ka\u017ed\u00fd sc\u00e9n\u00e1\u0159 poskytneme cluster mikroslu\u017eeb se sd\u00edlen\u00fdm stavem. Konfigurace se n\u00e1m zd\u00e1la snadn\u00e1: jakmile jsme nastavili v\u0161echny instance tak, aby pracovaly s t\u00edm sam\u00fdm ID aplikace (a se stejn\u00fdmi servery pro po\u010d\u00e1te\u010dn\u00ed nahr\u00e1n\u00ed), prakticky v\u0161echno ostatn\u00ed se d\u011blalo automaticky. Tak\u00e9 jsme stanovili, \u017ee ka\u017ed\u00fd zdrojov\u00fd topic se bude skl\u00e1dat z n\u011bkolika parti\u00ed, aby ka\u017ed\u00e9 instanci bylo mo\u017en\u00e9 p\u0159i\u0159adit podmno\u017einu t\u011bchto parti\u00ed.<\/p>\n<p>Tak\u00e9 bych cht\u011bl zm\u00ednit, \u017ee zde je b\u011b\u017en\u00e9 d\u011blat z\u00e1lohu \u00falo\u017ei\u0161t\u011b stav\u016f, abychom v p\u0159\u00edpad\u011b obnoven\u00ed po selh\u00e1n\u00ed mohli p\u0159esunout tuto kopii na jinou instanci. Na ka\u017ed\u00e9 \u00falo\u017ei\u0161t\u011b stav\u016f v Kafka Streams se vytv\u00e1\u0159\u00ed replika\u010dn\u00ed topic s logem zm\u011bn (v n\u011bm\u017e se sleduj\u00ed lok\u00e1ln\u00ed aktualizace). T\u00edmto zp\u016fsobem Kafka neust\u00e1le zabezpe\u010duje \u00falo\u017ei\u0161t\u011b stav\u016f. Proto v p\u0159\u00edpad\u011b selh\u00e1n\u00ed ur\u010dit\u00e9 instance m\u016f\u017ee b\u00fdt \u00falo\u017ei\u0161t\u011b stav\u016f Kafka Streams rychle obnoveno na jin\u00e9 instanci, kam p\u0159ejdou odpov\u00eddaj\u00edc\u00ed partie. Na\u0161e testy uk\u00e1zaly, \u017ee to lze prov\u00e9st b\u011bhem n\u011bkolika sekund, i kdy\u017e jsou v \u00falo\u017ei\u0161ti miliony z\u00e1znam\u016f.<\/p>\n<p>P\u0159i p\u0159echodu od jedn\u00e9 mikroslu\u017eby se sd\u00edlen\u00fdm stavem k clustru mikroslu\u017eeb se implementace Get State API st\u00e1v\u00e1 m\u00e9n\u011b trivi\u00e1ln\u00ed. V nov\u00e9 situaci se v \u00falo\u017ei\u0161ti stav\u016f ka\u017ed\u00e9 mikroslu\u017eby nach\u00e1z\u00ed pouze \u010d\u00e1st celkov\u00e9ho obrazu (ty objekty, jejich\u017e kl\u00ed\u010de byly p\u0159i\u0159azeny konkr\u00e9tn\u00ed partii). Museli jsme ur\u010dit, na kter\u00e9 instanci se nach\u00e1z\u00ed stav po\u017eadovan\u00e9ho objektu, co\u017e jsme d\u011blali na z\u00e1klad\u011b metadat proud\u016f, jak je uk\u00e1z\u00e1no n\u00ed\u017ee:<\/p>\n<p><img decoding=\"async\" alt=\"Nejen zpracov\u00e1n\u00ed: Jak jsme z Kafka Streams ud\u011blali distribuovanou datab\u00e1zi a co z toho vze\u0161lo\" src=\"\/wp-content\/uploads\/2019\/04\/7182a396869f2f9692d895fc5084cccb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustrace 7: pomoc\u00ed metadat proud\u016f ur\u010dujeme, z jak\u00e9 instance po\u017eadovat stav po\u017eadovan\u00e9ho objektu; podobn\u00fd p\u0159\u00edstup byl pou\u017eit s API GET ALL.<\/i><\/p>\n<p><b>Hlavn\u00ed z\u00e1v\u011bry<\/b><\/p>\n<p>\u00dalo\u017ei\u0161t\u011b stav\u016f v Kafka Streams de facto mohou slou\u017eit jako distribuovan\u00e1 datab\u00e1ze, <\/p>\n<ul>\n<li>neust\u00e1le replikovan\u00e1 v Kafka.<\/li>\n<li>Nad touto syst\u00e9mem se snadno stav\u00ed CRUD API. <\/li>\n<li>Zpracov\u00e1n\u00ed v\u00edce parti\u00ed se st\u00e1v\u00e1 o n\u011bco slo\u017eit\u011bj\u0161\u00edm. <\/li>\n<li>Je mo\u017en\u00e9 p\u0159idat jedno nebo v\u00edce \u00falo\u017ei\u0161\u0165 stav\u016f do streamov\u00e9 topologie pro ukl\u00e1d\u00e1n\u00ed pomocn\u00fdch dat. Tato mo\u017enost m\u016f\u017ee b\u00fdt vyu\u017eita pro:<\/li>\n<li>Dlouhodob\u00e9 ukl\u00e1d\u00e1n\u00ed dat pot\u0159ebn\u00fdch pro v\u00fdpo\u010dty b\u011bhem streamov\u00e9ho zpracov\u00e1n\u00ed <\/li>\n<li>Dlouhodob\u00e9 ukl\u00e1d\u00e1n\u00ed dat, kter\u00e1 mohou b\u00fdt u\u017eite\u010dn\u00e1 p\u0159i dal\u0161\u00ed inicializaci streamov\u00e9 instance <\/li>\n<li>mnoho dal\u0161\u00edho\u2026<\/li>\n<\/ul>\n<p>D\u00edky t\u011bmto a dal\u0161\u00edm v\u00fdhod\u00e1m je Kafka Streams skv\u011ble vhodn\u00e1 pro podporu glob\u00e1ln\u00edho stavu v takov\u00e9m distribuovan\u00e9m syst\u00e9mu, jako je n\u00e1\u0161. Kafka Streams se uk\u00e1zala jako velmi spolehliv\u00e1 v produk\u010dn\u00edm prost\u0159ed\u00ed (od doby jej\u00edho nasazen\u00ed jsme prakticky neztratili \u017e\u00e1dn\u00e9 zpr\u00e1vy), a jsme si jisti, \u017ee jej\u00ed mo\u017enosti t\u00edm rozhodn\u011b nekon\u010d\u00ed!<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\/cs\/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=\"cs_CZ\" \/>\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\/cs\/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\udd47 Nejen zpracov\u00e1n\u00ed: Jak jsme z Kafka Streams ud\u011blali distribuovanou datab\u00e1zi, a co z toho vze\u0161lo | ProHoster","description":"Ahoj, Habr! P\u0159ipom\u00edn\u00e1me, \u017ee po knize o Kafce jsme vydali stejn\u011b zaj\u00edmavou pr\u00e1ci o knihovn\u011b","canonical_url":"https:\/\/prohoster.info\/cs\/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":"cs_CZ","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\/cs\/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\/cs\/wp-json\/wp\/v2\/posts\/32632","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=32632"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/32632\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/24423"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=32632"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=32632"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=32632"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}