{"id":35786,"date":"2019-10-31T22:06:19","date_gmt":"2019-10-31T19:06:19","guid":{"rendered":"https:\/\/prohoster.info\/blog\/kniga-kafka-streams-v-dejstvii-prilozheniya-i-mikroservisy-dlya-raboty-v-realnom-vremeni\/"},"modified":"2019-10-31T22:06:19","modified_gmt":"2019-10-31T19:06:19","slug":"kniga-kafka-streams-v-dejstvii-prilozheniya-i-mikroservisy-dlya-raboty-v-realnom-vremeni","status":"publish","type":"post","link":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/kniga-kafka-streams-v-dejstvii-prilozheniya-i-mikroservisy-dlya-raboty-v-realnom-vremeni","title":{"rendered":"Kniha \u201eKafka Streams v akci. Aplikace a mikroservisy pro pr\u00e1ci v re\u00e1ln\u00e9m \u010dase\u201c","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/piter\/blog\/457756\/\"><img decoding=\"async\" alt=\"Kniha \u201eKafka Streams v akci. Aplikace a mikroservisy pro pr\u00e1ci v re\u00e1ln\u00e9m \u010dase\u201c\" src=\"\/wp-content\/uploads\/6f8bd2b31b87b0c760c1148515893c43.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex> Ahoj, Habr\u00e1ci! Tato kniha je vhodn\u00e1 pro ka\u017ed\u00e9ho v\u00fdvoj\u00e1\u0159e, kter\u00fd se chce pono\u0159it do problematiky streamov\u00e9ho zpracov\u00e1n\u00ed. Pochopen\u00ed distribuovan\u00e9ho programov\u00e1n\u00ed v\u00e1m pom\u016f\u017ee l\u00e9pe porozum\u011bt Kafce a Kafka Streams. Bylo by dobrou v\u00fdhodou zn\u00e1t tak\u00e9 samotn\u00fd framework Kafka, ale nen\u00ed to nutn\u00e9: pov\u00edm v\u00e1m v\u0161e, co pot\u0159ebujete. Zku\u0161en\u00ed v\u00fdvoj\u00e1\u0159i Kafky i nov\u00e1\u010dci d\u00edky t\u00e9to knize zvl\u00e1dnou vytv\u00e1\u0159en\u00ed zaj\u00edmav\u00fdch aplikac\u00ed pro streamov\u00e9 zpracov\u00e1n\u00ed pomoc\u00ed knihovny Kafka Streams. V\u00fdvoj\u00e1\u0159i Javy st\u0159edn\u00ed a vy\u0161\u0161\u00ed \u00farovn\u011b, kte\u0159\u00ed jsou ji\u017e obezn\u00e1meni s takov\u00fdmi pojmy jako serializace, se nau\u010d\u00ed aplikovat sv\u00e9 dovednosti na vytv\u00e1\u0159en\u00ed aplikac\u00ed Kafka Streams. Zdrojov\u00fd k\u00f3d knihy je naps\u00e1n v Jav\u011b 8 a v\u00fdznamn\u011b vyu\u017e\u00edv\u00e1 syntaxi lambda v\u00fdraz\u016f Javy 8, tak\u017ee dovednost pr\u00e1ce s lambda funkcemi (i v jin\u00e9m programovac\u00edm jazyce) se v\u00e1m bude hodit.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>\u00daryvek. 5.3. Agregace a oknov\u00e9 operace<\/h3>\n<p>\nV t\u00e9to \u010d\u00e1sti se p\u0159eneseme k prozkoum\u00e1n\u00ed nejnad\u011bjn\u011bj\u0161\u00edch \u010d\u00e1st\u00ed Kafka Streams. Dosud jsme prozkoumali n\u00e1sleduj\u00edc\u00ed aspekty Kafka Streams:<\/p>\n<ul>\n<li>vytv\u00e1\u0159en\u00ed zpracovatelsk\u00e9 topologie;<\/li>\n<li>vyu\u017eit\u00ed stavu ve streamov\u00fdch aplikac\u00edch;<\/li>\n<li>prov\u00e1d\u011bn\u00ed spojen\u00ed datov\u00fdch proud\u016f;<\/li>\n<li>rozd\u00edly mezi ud\u00e1lostmi (KStream) a aktualizacemi (KTable).<\/li>\n<\/ul>\n<p>\nV n\u00e1sleduj\u00edc\u00edch p\u0159\u00edkladech v\u0161echny tyto prvky spoj\u00edme dohromady. Nav\u00edc se sezn\u00e1m\u00edte s oknov\u00fdmi operacemi \u2014 dal\u0161\u00edm skv\u011bl\u00fdm vyu\u017eit\u00edm streamov\u00fdch aplikac\u00ed. Na\u0161\u00edm prvn\u00edm p\u0159\u00edkladem bude jednoduch\u00e1 agregace.<\/p>\n<h3>5.3.1. Agregace objemu prodeje akci\u00ed podle pr\u016fmyslov\u00fdch odv\u011btv\u00ed<\/h3>\n<p>\nAgregace a skupinov\u00e1n\u00ed jsou \u017eivotn\u011b d\u016fle\u017eit\u00e9 n\u00e1stroje p\u0159i pr\u00e1ci s proudov\u00fdmi daty. Zkoum\u00e1n\u00ed jednotliv\u00fdch z\u00e1znam\u016f p\u0159i jejich p\u0159\u00edjmu se \u010dasto ukazuje jako nedostate\u010dn\u00e9. Pro z\u00edsk\u00e1n\u00ed dal\u0161\u00edch informac\u00ed z dat je nutn\u00e9 je seskupit a zkombinovat.<\/p>\n<p>V tomto p\u0159\u00edkladu se stanete intradenn\u00edm obchodn\u00edkem, kter\u00fd pot\u0159ebuje sledovat objemy prodeje akci\u00ed firem v n\u011bkolika pr\u016fmyslov\u00fdch odv\u011btv\u00edch. Zvl\u00e1\u0161\u0165 v\u00e1s zaj\u00edm\u00e1 p\u011bt firem s nejv\u011bt\u0161\u00edmi objemy prodeje akci\u00ed v ka\u017ed\u00e9m z pr\u016fmyslov\u00fdch odv\u011btv\u00ed.<\/p>\n<p>Pro takovou agregaci bude pot\u0159eba n\u011bkolik n\u00e1sleduj\u00edc\u00edch krok\u016f k p\u0159eveden\u00ed dat do po\u017eadovan\u00e9 podoby (pokud mluv\u00edme obecn\u011b).<\/p>\n<ol>\n<li>Vytvo\u0159te zdroj na z\u00e1klad\u011b t\u00e9matu, kter\u00fd publikuje neupraven\u00e9 informace o obchodov\u00e1n\u00ed s akciemi. Mus\u00edme p\u0159ev\u00e9st objekt typu StockTransaction na objekt typu ShareVolume. Skute\u010dnost\u00ed je, \u017ee objekt StockTransaction obsahuje metadata prodeje, ale my pot\u0159ebujeme pouze \u00fadaje o po\u010dtu prodan\u00fdch akci\u00ed.<\/li>\n<li>Seskupte \u00fadaje ShareVolume podle akciov\u00fdch symbol\u016f. Po seskupen\u00ed podle symbol\u016f je mo\u017en\u00e9 tyto \u00fadaje zkr\u00e1tit na mezisouhrny objem\u016f prodeje akci\u00ed. Je t\u0159eba poznamenat, \u017ee metoda KStream.groupBy vrac\u00ed instanci typu KGroupedStream. A instanci KTable lze z\u00edskat vol\u00e1n\u00edm metody KGroupedStream.reduce.<\/li>\n<\/ol>\n<p><\/p>\n<blockquote><p><b>Co je rozhran\u00ed KGroupedStream<\/b><\/p>\n<p>Metody KStream.groupBy a KStream.groupByKey vrac\u00ed instanci KGroupedStream. KGroupedStream je mezivrstvov\u00e9 zobrazen\u00ed toku ud\u00e1lost\u00ed po seskupen\u00ed podle kl\u00ed\u010d\u016f. Nen\u00ed ur\u010deno pro p\u0159\u00edmou pr\u00e1ci s n\u00edm. M\u00edsto toho se KGroupedStream pou\u017e\u00edv\u00e1 pro opera\u010dn\u00ed aggregraci, jej\u00ed\u017e v\u00fdsledkem je v\u017edy KTable. A proto\u017ee v\u00fdsledkem opera\u010dn\u00ed agregace je KTable a pou\u017e\u00edv\u00e1 se \u00falo\u017ei\u0161t\u011b stavu, mo\u017en\u00e1 ne v\u0161echna aktualizace jsou pos\u00edl\u00e1ny d\u00e1le v potrub\u00ed.<\/p>\n<p>Metoda KTable.groupBy vrac\u00ed podobn\u00fd KGroupedTable \u2014 mezivrstvov\u00e9 zobrazen\u00ed toku aktualizac\u00ed p\u0159eorganizovan\u00fdch podle kl\u00ed\u010de.<\/p><\/blockquote>\n<p>\nUd\u011bl\u00e1me si malou p\u0159est\u00e1vku a pod\u00edv\u00e1me se na obr. 5.9, kde vid\u00edme, co jsme dos\u00e1hli. Tato topologie by v\u00e1m m\u011bla b\u00fdt ji\u017e dob\u0159e zn\u00e1m\u00e1.<\/p>\n<p><img decoding=\"async\" alt=\"Kniha \u201eKafka Streams v akci. Aplikace a mikroservisy pro pr\u00e1ci v re\u00e1ln\u00e9m \u010dase\u201c\" src=\"\/wp-content\/uploads\/9fd61317cde376362adcaeec72908919.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPod\u00edvejme se nyn\u00ed na k\u00f3d pro tuto topologii (najdete jej v souboru src\/main\/java\/bbejeck\/chapter_5\/AggregationsAndReducingExample.java) (v\u00fdpis 5.2).<\/p>\n<p><img decoding=\"async\" alt=\"Kniha \u201eKafka Streams v akci. Aplikace a mikroservisy pro pr\u00e1ci v re\u00e1ln\u00e9m \u010dase\u201c\" src=\"\/wp-content\/uploads\/f937287e448295fbd467c283ceca316a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nUveden\u00fd k\u00f3d se vyzna\u010duje stru\u010dnost\u00ed a mnoha proveden\u00fdmi akcemi v n\u011bkolika \u0159\u00e1dc\u00edch. V prvn\u00edm parametru metody builder.stream si m\u016f\u017eete v\u0161imnout n\u011b\u010deho nov\u00e9ho: hodnota v\u00fd\u010dtov\u00e9ho typu AutoOffsetReset.EARLIEST (existuje tak\u00e9 LATEST), kter\u00e1 je nastavena pomoc\u00ed metody Consumed.withOffsetResetPolicy. Pomoc\u00ed tohoto v\u00fd\u010dtov\u00e9ho typu m\u016f\u017eete ur\u010dit strategii resetov\u00e1n\u00ed offset\u016f pro ka\u017edou z KStream nebo KTable, m\u00e1 p\u0159ednost p\u0159ed parametrem resetov\u00e1n\u00ed offset\u016f v konfiguraci.<\/p>\n<blockquote><p><b>GroupByKey a GroupBy<\/b><\/p>\n<p>V rozhran\u00ed KStream existuj\u00ed dv\u011b metody pro skupinov\u00e1n\u00ed z\u00e1znam\u016f: GroupByKey a GroupBy. Ob\u011b vrac\u00ed KGroupedTable, tak\u017ee se m\u016f\u017ee objevit opr\u00e1vn\u011bn\u00e1 ot\u00e1zka: jak\u00fd je mezi nimi rozd\u00edl a kdy kter\u00fd z nich pou\u017e\u00edt?<\/p>\n<p>Metoda GroupByKey se pou\u017e\u00edv\u00e1, kdy\u017e jsou kl\u00ed\u010de v KStream ji\u017e nepr\u00e1zdn\u00e9. Hlavn\u011b, p\u0159\u00edznak \u201evy\u017eaduje nov\u00e9 rozd\u011blen\u00ed\u201c nikdy nebyl nastaven.<\/p>\n<p>Metoda GroupBy p\u0159edpokl\u00e1d\u00e1, \u017ee jste m\u011bnili kl\u00ed\u010de pro seskupen\u00ed, tak\u017ee p\u0159\u00edznak nov\u00e9ho rozd\u011blen\u00ed je nastaven na true. Prov\u00e1d\u011bn\u00ed po metod\u011b GroupBy, jako jsou spojen\u00ed, agregace atd., povede k automatick\u00e9mu nov\u00e9mu rozd\u011blen\u00ed.<br \/>\nShrnut\u00ed: p\u0159i jak\u00e9koliv p\u0159\u00edle\u017eitosti byste m\u011bli pou\u017e\u00edt GroupByKey, nikoli GroupBy.<\/p><\/blockquote>\n<p>\nCo d\u011blaj\u00ed metody mapValues a groupBy \u2013 je jasn\u00e9, tak\u017ee se pod\u00edvejme na metodu sum() (tu m\u016f\u017eete naj\u00edt v souboru src\/main\/java\/bbejeck\/model\/ShareVolume.java) (listing 5.3).<\/p>\n<p><img decoding=\"async\" alt=\"Kniha \u201eKafka Streams v akci. Aplikace a mikroservisy pro pr\u00e1ci v re\u00e1ln\u00e9m \u010dase\u201c\" src=\"\/wp-content\/uploads\/8e9a6f873594f9b5fef9a96c42353a61.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nMetoda ShareVolume.sum vrac\u00ed meziprodukt sou\u010dtu objemu obchodovan\u00fdch akci\u00ed a v\u00fdsledek cel\u00e9 \u0159et\u011bzec v\u00fdpo\u010dt\u016f p\u0159edstavuje objekt KTable. Nyn\u00ed ch\u00e1pete, jakou roli hraje KTable. P\u0159i p\u0159ijet\u00ed objekt\u016f ShareVolume je v odpov\u00eddaj\u00edc\u00edm objektu KTable uchov\u00e1v\u00e1no posledn\u00ed aktu\u00e1ln\u00ed aktualizace. Je d\u016fle\u017eit\u00e9 nezapom\u00ednat, \u017ee v\u0161echna aktualizace se odr\u00e1\u017e\u00ed v p\u0159edchoz\u00edm shareVolumeKTable, ale ne v\u0161echny jsou zas\u00edl\u00e1ny d\u00e1le.<\/p>\n<p>D\u00e1le pomoc\u00ed tohoto KTable prov\u00e1d\u00edme agregaci (podle po\u010dtu obchodovan\u00fdch akci\u00ed), abychom z\u00edskali p\u011bt spole\u010dnost\u00ed s nejvy\u0161\u0161\u00edmi objemy prodeje akci\u00ed v ka\u017ed\u00e9m odv\u011btv\u00ed. Na\u0161e kroky budou p\u0159i tom podobn\u00e9 t\u011bm p\u0159i prvn\u00edm agregov\u00e1n\u00ed.<\/p>\n<ol>\n<li>Prove\u010fte dal\u0161\u00ed operaci groupBy pro seskupen\u00ed jednotliv\u00fdch objekt\u016f ShareVolume podle odv\u011btv\u00ed.<\/li>\n<li>Za\u010dn\u011bte sou\u010dtov\u00e1n\u00ed objekt\u016f ShareVolume. Tentokr\u00e1t je objekt agregace prioritn\u00ed fronta pevn\u00e9 velikosti. V takov\u00e9 prioritn\u00ed front\u011b pevn\u00e9 velikosti jsou uchov\u00e1v\u00e1ny pouze p\u011bt spole\u010dnost\u00ed s nejvy\u0161\u0161\u00edm po\u010dtem prodan\u00fdch akci\u00ed.<\/li>\n<li>Zobrazte fronty z p\u0159edchoz\u00edho bodu jako \u0159et\u011bzcovou hodnotu a vra\u0165te p\u011bt nejprod\u00e1van\u011bj\u0161\u00edch podle po\u010dtu akci\u00ed v jednotliv\u00fdch odv\u011btv\u00edch.<\/li>\n<li>Zapi\u0161te v\u00fdsledky v \u0159et\u011bzcov\u00e9 podob\u011b do t\u00e9matu.<\/li>\n<\/ol>\n<p>\nNa obr. 5.10 je zobrazen graf topologie toku dat. Jak vid\u00edte, druh\u00fd cyklus zpracov\u00e1n\u00ed je dost jednoduch\u00fd.<\/p>\n<p><img decoding=\"async\" alt=\"Kniha \u201eKafka Streams v akci. Aplikace a mikroservisy pro pr\u00e1ci v re\u00e1ln\u00e9m \u010dase\u201c\" src=\"\/wp-content\/uploads\/dabd1507eee267038edb7f8d76d8d8ae.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNyn\u00ed, kdy\u017e m\u00e1te jasnou p\u0159edstavu o struktu\u0159e tohoto druh\u00e9ho cyklu zpracov\u00e1n\u00ed, m\u016f\u017eete se pod\u00edvat na jeho zdrojov\u00fd k\u00f3d (nalezneme ho v souboru src\/main\/java\/bbejeck\/chapter_5\/AggregationsAndReducingExample.java) (listing 5.4).<\/p>\n<p>V tomto inicializ\u00e1toru se nach\u00e1z\u00ed prom\u011bnn\u00e1 fixedQueue. Je to u\u017eivatelsk\u00fd objekt - adapt\u00e9r pro java.util.TreeSet, kter\u00fd se pou\u017e\u00edv\u00e1 k sledov\u00e1n\u00ed N nejv\u011bt\u0161\u00edch v\u00fdsledk\u016f podle klesaj\u00edc\u00edho po\u010dtu prodan\u00fdch akci\u00ed.<\/p>\n<p><img decoding=\"async\" alt=\"Kniha \u201eKafka Streams v akci. Aplikace a mikroservisy pro pr\u00e1ci v re\u00e1ln\u00e9m \u010dase\u201c\" src=\"\/wp-content\/uploads\/488b072b0d91b81c925ca72291e69e48.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nJi\u017e jste se setkali s v\u00fdzvami groupBy a mapValues, tak\u017ee se na n\u011b nebudeme zdr\u017eovat (vol\u00e1me metodu KTable.toStream, proto\u017ee metoda KTable.print je pova\u017eov\u00e1na za zastaralou). Ale je\u0161t\u011b jste nevid\u011bli KTable verzi metody aggregate(), tak\u017ee si na jej\u00ed diskusi vezmeme chv\u00edli \u010das.<\/p>\n<p>Jak v\u00edte, KTable se vyzna\u010duje t\u00edm, \u017ee z\u00e1znamy se stejn\u00fdmi kl\u00ed\u010di se pova\u017euj\u00ed za aktualizace. KTable nahrazuje star\u00fd z\u00e1znam nov\u00fdm. Agregov\u00e1n\u00ed prob\u00edh\u00e1 podobn\u00fdm zp\u016fsobem: agreguj\u00ed se posledn\u00ed z\u00e1znamy se stejn\u00fdm kl\u00ed\u010dem. P\u0159i p\u0159ijet\u00ed z\u00e1znamu se p\u0159id\u00e1v\u00e1 do instance t\u0159\u00eddy FixedSizePriorityQueue pomoc\u00ed s\u010d\u00edtac\u00edho (druh\u00fd parametr v vol\u00e1n\u00ed metody aggregate), ale pokud ji\u017e existuje jin\u00fd z\u00e1znam se stejn\u00fdm kl\u00ed\u010dem, star\u00fd z\u00e1znam se odstran\u00ed pomoc\u00ed ode\u010d\u00edtac\u00edho (t\u0159et\u00ed parametr v vol\u00e1n\u00ed metody aggregate).<\/p>\n<p>To v\u0161e znamen\u00e1, \u017ee n\u00e1\u0161 agreg\u00e1tor, FixedSizePriorityQueue, v\u016fbec neaggreguje v\u0161echna hodnoty se stejn\u00fdm kl\u00ed\u010dem, ale uchov\u00e1v\u00e1 klouzavou sumu N nejprod\u00e1van\u011bj\u0161\u00edch druh\u016f akci\u00ed. V ka\u017ed\u00e9m nov\u00e9m z\u00e1znamu je obsa\u017eeno celkov\u00e9 mno\u017estv\u00ed prodan\u00fdch akci\u00ed dosud. KTable v\u00e1m poskytne informace o tom, kter\u00e9 akcie firem se aktu\u00e1ln\u011b prod\u00e1vaj\u00ed nejv\u00edce, a nen\u00ed t\u0159eba klouzav\u00e9 agregov\u00e1n\u00ed ka\u017ed\u00e9 z aktualizac\u00ed.<\/p>\n<p>Nau\u010dili jsme se d\u011blat dv\u011b d\u016fle\u017eit\u00e9 v\u011bci:<\/p>\n<ul>\n<li>skupinovat hodnoty v KTable podle spole\u010dn\u00e9ho kl\u00ed\u010de;<\/li>\n<li>prov\u00e1d\u011bt nad t\u011bmito seskupen\u00fdmi hodnotami takov\u00e9 u\u017eite\u010dn\u00e9 operace, jako je shrnut\u00ed a agregace.<\/li>\n<\/ul>\n<p>\nSchopnost prov\u00e1d\u011bt tyto operace je d\u016fle\u017eit\u00e1 pro pochopen\u00ed smyslu dat, kter\u00e1 proch\u00e1zej\u00ed aplikac\u00ed Kafka Streams, a pro zji\u0161t\u011bn\u00ed, jak\u00e9 informace nesou.<\/p>\n<p>Spojili jsme tak\u00e9 n\u011bkter\u00e9 kl\u00ed\u010dov\u00e9 pojmy, kter\u00e9 byly d\u0159\u00edve prob\u00edr\u00e1ny v t\u00e9to knize. V kapitole 4 jsme hovo\u0159ili o d\u016fle\u017eitosti odoln\u00e9ho lok\u00e1ln\u00edho stavu pro streamovac\u00ed aplikaci. Prvn\u00ed p\u0159\u00edklad z t\u00e9to kapitoly uk\u00e1zal, pro\u010d je lok\u00e1ln\u00ed stav tak d\u016fle\u017eit\u00fd \u2014 umo\u017e\u0148uje sledovat, jak\u00e9 informace jste ji\u017e vid\u011bli. Lok\u00e1ln\u00ed p\u0159\u00edstup eliminuje s\u00ed\u0165ov\u00e9 zpo\u017ed\u011bn\u00ed, co\u017e zvy\u0161uje v\u00fdkon aplikace a jej\u00ed odolnost v\u016f\u010di chyb\u00e1m.<\/p>\n<p>P\u0159i prov\u00e1d\u011bn\u00ed jak\u00e9koli operace agregace nebo shrnut\u00ed je nutn\u00e9 zadat n\u00e1zev \u00falo\u017ei\u0161t\u011b stavu. Operace agregace a shrnut\u00ed vracej\u00ed instanci KTable a KTable vyu\u017e\u00edv\u00e1 \u00falo\u017ei\u0161t\u011b stavu k nahrazen\u00ed star\u00fdch v\u00fdsledk\u016f nov\u00fdmi. Jak jste vid\u011bli, ne v\u0161echny aktualizace jsou d\u00e1le pos\u00edl\u00e1ny potrub\u00edm, co\u017e je d\u016fle\u017eit\u00e9, proto\u017ee operace agregace jsou ur\u010deny k z\u00edsk\u00e1v\u00e1n\u00ed kone\u010dn\u00fdch informac\u00ed. Pokud nen\u00ed pou\u017e\u00edv\u00e1n lok\u00e1ln\u00ed stav, KTable bude pos\u00edlat v\u0161echny v\u00fdsledky agregace a shrnut\u00ed d\u00e1le.<\/p>\n<p>Nyn\u00ed se pod\u00edv\u00e1me na prov\u00e1d\u011bn\u00ed takov\u00fdch operac\u00ed, jako je agregace, v r\u00e1mci konkr\u00e9tn\u00edho \u010dasov\u00e9ho intervalu \u2014 takzvan\u00e9 oknov\u00e9 operace.<\/p>\n<h3>5.3.2. Oknov\u00e9 operace<\/h3>\n<p>\nV p\u0159edchoz\u00ed \u010d\u00e1sti jsme se sezn\u00e1mili s \u201eklouzaj\u00edc\u00edmi\u201c shrnut\u00edmi a agregacemi. Aplikace prov\u00e1d\u011bla kontinu\u00e1ln\u00ed shrnut\u00ed objemu obchodov\u00e1n\u00ed s akciemi a n\u00e1sledn\u00e9 agregace p\u011bti nejprod\u00e1van\u011bj\u0161\u00edch akci\u00ed na burze.<\/p>\n<p>N\u011bkdy jsou takov\u00e9 kontinu\u00e1ln\u00ed agregace a shrnut\u00ed v\u00fdsledk\u016f nezbytn\u00e9. Jindy je pot\u0159eba prov\u00e1d\u011bt operace pouze nad dan\u00fdm \u010dasov\u00fdm intervalem. Nap\u0159\u00edklad spo\u010d\u00edtat, kolik burzovn\u00edch operac\u00ed se uskute\u010dnilo s akciemi konkr\u00e9tn\u00ed spole\u010dnosti za posledn\u00edch 10 minut. Nebo kolik u\u017eivatel\u016f kliklo na nov\u00fd reklamn\u00ed banner za posledn\u00edch 15 minut. Aplikace m\u016f\u017ee tyto operace prov\u00e1d\u011bt opakovan\u011b, ale s v\u00fdsledky vztahuj\u00edc\u00edmi se pouze k dan\u00fdm \u010dasov\u00fdm interval\u016fm (\u010dasov\u00fdm okn\u016fm).<\/p>\n<h3>Po\u010d\u00edt\u00e1n\u00ed burzovn\u00edch transakc\u00ed podle kupuj\u00edc\u00edho<\/h3>\n<p>\nV n\u00e1sleduj\u00edc\u00edm p\u0159\u00edkladu se zam\u011b\u0159\u00edme na sledov\u00e1n\u00ed burzovn\u00edch transakc\u00ed n\u011bkolika obchodn\u00edk\u016f \u2014 bu\u010f velk\u00fdch organizac\u00ed, nebo bystr\u00fdch individu\u00e1ln\u00edch finan\u010dn\u00edk\u016f.<\/p>\n<p>Existuj\u00ed dv\u011b mo\u017en\u00e9 p\u0159\u00ed\u010diny pro takov\u00e9 sledov\u00e1n\u00ed. Jednou z nich je pot\u0159eba v\u011bd\u011bt, co kupuj\u00ed\/prod\u00e1vaj\u00ed l\u00edd\u0159i trhu. Pokud tito velc\u00ed hr\u00e1\u010di a zku\u0161en\u00ed investo\u0159i vid\u00ed p\u0159\u00edle\u017eitosti, m\u00e1 smysl sledovat jejich strategii. Druh\u00e1 p\u0159\u00ed\u010dina spo\u010d\u00edv\u00e1 v touze zaznamenat jak\u00e9koli mo\u017en\u00e9 zn\u00e1mky nez\u00e1konn\u00fdch obchod\u016f s vyu\u017eit\u00edm vnit\u0159n\u00edch informac\u00ed. K tomu je t\u0159eba analyzovat korelaci velk\u00fdch n\u00e1r\u016fst\u016f prodeje s d\u016fle\u017eit\u00fdmi tiskov\u00fdmi zpr\u00e1vami.<\/p>\n<p>Takov\u00e9 sledov\u00e1n\u00ed se skl\u00e1d\u00e1 z n\u00e1sleduj\u00edc\u00edch f\u00e1z\u00ed:<\/p>\n<ul>\n<li>vytvo\u0159en\u00ed proudu pro \u010dten\u00ed z t\u00e9matu stock-transactions;<\/li>\n<li>seskupen\u00ed p\u0159\u00edchoz\u00edch z\u00e1znam\u016f podle identifik\u00e1toru kupuj\u00edc\u00edho a burzovn\u00edho symbolu akcie. Vol\u00e1n\u00ed metody groupBy vrac\u00ed instanci t\u0159\u00eddy KGroupedStream;<\/li>\n<li>vracen\u00ed metodou KGroupedStream.windowedBy proudu dat omezen\u00e9ho \u010dasov\u00fdm oknem, co\u017e umo\u017e\u0148uje prov\u00e1d\u011bt agregaci v oknech. V z\u00e1vislosti na typu okna se vrac\u00ed bu\u010f TimeWindowedKStream, nebo SessionWindowedKStream;<\/li>\n<li>po\u010d\u00edt\u00e1n\u00ed transakc\u00ed pro agregaci operace. Okno proudov\u00fdch dat ur\u010duje, zda se dan\u00fd z\u00e1znam zahrnuje do tohoto po\u010dtu;<\/li>\n<li>zaznamen\u00e1n\u00ed v\u00fdsledk\u016f do t\u00e9matu nebo jejich v\u00fdstup na konzoli b\u011bhem v\u00fdvoje.<\/li>\n<\/ul>\n<p>\nTopologie t\u00e9to aplikace je jednoduch\u00e1, ale n\u00e1zorn\u00fd obr\u00e1zek neubl\u00ed\u017e\u00ed. Pod\u00edvejme se na obr. 5.11.<\/p>\n<p>D\u00e1le se budeme zab\u00fdvat funkcionalitou oknov\u00fdch operac\u00ed a odpov\u00eddaj\u00edc\u00edm k\u00f3dem.<\/p>\n<p><img decoding=\"async\" alt=\"Kniha \u201eKafka Streams v akci. Aplikace a mikroservisy pro pr\u00e1ci v re\u00e1ln\u00e9m \u010dase\u201c\" src=\"\/wp-content\/uploads\/67d9d8d8acb1370a7c7fe5cd9a8b6aa7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Typy oken<\/h3>\n<p>\nV Kafka Streams existuj\u00ed t\u0159i typy oken:<\/p>\n<ul>\n<li>sez\u00f3nn\u00ed;<\/li>\n<li>kollabovan\u00e9 (tumbling);<\/li>\n<li>klouzav\u00e9\/\u201esk\u00e1\u010d\u00edc\u00ed\u201c (sliding\/hopping).<\/li>\n<\/ul>\n<p>\nJak\u00e9 z nich vybrat, z\u00e1vis\u00ed na obchodn\u00edch po\u017eadavc\u00edch. \u201eKoulen\u00e9\u201c a \u201esk\u00e1\u010d\u00edc\u00ed\u201d okna jsou \u010dasov\u011b omezen\u00e1, zat\u00edmco omezen\u00ed sez\u00f3nn\u00edch vypl\u00fdv\u00e1 z u\u017eivatelsk\u00fdch akc\u00ed \u2013 d\u00e9lka sezen\u00ed(-\u00ed) je ur\u010dena v\u00fdhradn\u011b t\u00edm, jak aktivn\u011b se u\u017eivatel chov\u00e1. Hlavn\u00ed je nezapom\u00ednat, \u017ee v\u0161echny typy oken jsou zalo\u017eeny na datech\/\u010dasech z\u00e1znam\u016f, nikoli na syst\u00e9mov\u00e9m \u010dase.<\/p>\n<p>D\u00e1le implementujeme na\u0161i topologii pro ka\u017ed\u00fd typ oken. Kompletn\u00ed k\u00f3d bude uveden pouze v prvn\u00ed uk\u00e1zce; pro ostatn\u00ed typy oken se nic nezm\u011bn\u00ed, krom\u011b typu operace okna.<\/p>\n<h3>Sez\u00f3nn\u00ed okna<\/h3>\n<p>\nSez\u00f3nn\u00ed okna se v\u00fdrazn\u011b li\u0161\u00ed od v\u0161ech ostatn\u00edch typ\u016f oken. Jsou omezen\u00e1 nejen \u010dasem, ale tak\u00e9 aktivitou u\u017eivatele (nebo aktivitou entity, kterou chcete sledovat). Sez\u00f3nn\u00ed okna jsou vymezen\u00e1 obdob\u00edmi neaktivity.<\/p>\n<p>Obr\u00e1zek 5.12 ilustruje pojem sez\u00f3nn\u00edch oken. Men\u0161\u00ed seance se slou\u010d\u00ed se seanc\u00ed nalevo od n\u011bj. A seance napravo bude odd\u011blen\u00e1, proto\u017ee n\u00e1sleduje dlouh\u00e9 obdob\u00ed neaktivity. Sez\u00f3nn\u00ed okna se zakl\u00e1daj\u00ed na aktivit\u00e1ch u\u017eivatel\u016f, ale pou\u017e\u00edvaj\u00ed \u010dasov\u00e1 raz\u00edtka z z\u00e1znam\u016f k ur\u010den\u00ed, k jak\u00e9 seanci dan\u00fd z\u00e1znam pat\u0159\u00ed.<\/p>\n<p><img decoding=\"async\" alt=\"Kniha \u201eKafka Streams v akci. Aplikace a mikroservisy pro pr\u00e1ci v re\u00e1ln\u00e9m \u010dase\u201c\" src=\"\/wp-content\/uploads\/d39a5db7af7d6aa2194802622b2b47fd.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Pou\u017eit\u00ed sez\u00f3nn\u00edch oken pro sledov\u00e1n\u00ed burzovn\u00edch transakc\u00ed<\/h3>\n<p>\nVyu\u017eijeme sez\u00f3nn\u00ed okna k zachycen\u00ed informac\u00ed o burzovn\u00edch transakc\u00edch. Implementace sez\u00f3nn\u00edch oken je zn\u00e1zorn\u011bna v \u00faryvku 5.5 (kter\u00fd naleznete v souboru src\/main\/java\/bbejeck\/chapter_5\/CountingWindowingAndKTableJoinExample.java).<\/p>\n<p><img decoding=\"async\" alt=\"Kniha \u201eKafka Streams v akci. Aplikace a mikroservisy pro pr\u00e1ci v re\u00e1ln\u00e9m \u010dase\u201c\" src=\"\/wp-content\/uploads\/2dcbd9a36baec0e746aad165121451b3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nV\u011bt\u0161inu operac\u00ed t\u00e9to topologie jste ji\u017e vid\u011bli, tak\u017ee nen\u00ed nutn\u00e9 je znovu proch\u00e1zet. Ale jsou tu i n\u011bkter\u00e9 nov\u00e9 prvky, kter\u00e9 si nyn\u00ed probereme.<\/p>\n<p>P\u0159i ka\u017ed\u00e9 operaci groupBy se obvykle prov\u00e1d\u00ed n\u011bjak\u00e1 agrega\u010dn\u00ed operace (agregace, slou\u010den\u00ed nebo po\u010d\u00edt\u00e1n\u00ed). M\u016f\u017eete prov\u00e9st bu\u010f kumulativn\u00ed agregaci s pr\u016fb\u011b\u017en\u00fdm sou\u010dtem, nebo oknovou agregaci, p\u0159i n\u00ed\u017e se zohled\u0148uj\u00ed z\u00e1znamy v r\u00e1mci dan\u00e9ho \u010dasov\u00e9ho okna.<\/p>\n<p>K\u00f3d z \u00faryvku 5.5 po\u010d\u00edt\u00e1 po\u010det transakc\u00ed v r\u00e1mci sez\u00f3nn\u00edch oken. Na obr. 5.13 jsou tyto akce analyzov\u00e1ny krok za krokem.<\/p>\n<p>Pomoc\u00ed vol\u00e1n\u00ed windowedBy(SessionWindows.with(twentySeconds).until(fifteenMinutes)) vytv\u00e1\u0159\u00edme sez\u00f3nn\u00ed okno s intervalem neaktivity 20 sekund a uchov\u00e1vac\u00edm intervalem 15 minut. Interval neaktivity 20 sekund znamen\u00e1, \u017ee aplikace zahrnuje jak\u00fdkoli z\u00e1znam, kter\u00fd p\u0159ich\u00e1z\u00ed b\u011bhem 20 sekund od konce nebo za\u010d\u00e1tku aktu\u00e1ln\u00ed seance do aktu\u00e1ln\u00ed (aktivn\u00ed) seance.<\/p>\n<p><img decoding=\"async\" alt=\"Kniha \u201eKafka Streams v akci. Aplikace a mikroservisy pro pr\u00e1ci v re\u00e1ln\u00e9m \u010dase\u201c\" src=\"\/wp-content\/uploads\/9bd47b04698086872fd135b4c67eb938.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nD\u00e1le uv\u00e1d\u00edme, jakou agrega\u010dn\u00ed operaci je t\u0159eba prov\u00e9st ve sezen\u00ed \u2014 v tomto p\u0159\u00edpad\u011b count. Pokud p\u0159\u00edchoz\u00ed z\u00e1znam p\u0159es\u00e1hne dobu ne\u010dinnosti (z kter\u00e9koliv strany od \u010dasov\u00e9 zna\u010dky), aplikace vytvo\u0159\u00ed nov\u00e9 sezen\u00ed. Interval uchov\u00e1n\u00ed znamen\u00e1 udr\u017eet sezen\u00ed po ur\u010ditou dobu a umo\u017e\u0148uje zpo\u017ed\u011bn\u00e1 data, kter\u00e1 vych\u00e1zej\u00ed za obdob\u00ed ne\u010dinnosti sezen\u00ed, ale st\u00e1le mohou b\u00fdt p\u0159ipojena. Krom\u011b toho za\u010d\u00e1tek a konec nov\u00e9ho sezen\u00ed, kter\u00e9 vzniklo slou\u010den\u00edm, odpov\u00eddaj\u00ed nejstar\u0161\u00ed a nejnov\u011bj\u0161\u00ed \u010dasov\u00e9 zna\u010dce.<\/p>\n<p>Pod\u00edv\u00e1me se na n\u011bkolik z\u00e1znam\u016f z metody count, abychom vid\u011bli, jak se sezen\u00ed chovaj\u00ed (tab. 5.1).<\/p>\n<p><img decoding=\"async\" alt=\"Kniha \u201eKafka Streams v akci. Aplikace a mikroservisy pro pr\u00e1ci v re\u00e1ln\u00e9m \u010dase\u201c\" src=\"\/wp-content\/uploads\/ec04aae466d88c2d2349474069c8d541.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nP\u0159i p\u0159ij\u00edm\u00e1n\u00ed z\u00e1znam\u016f hled\u00e1me ji\u017e existuj\u00edc\u00ed sezen\u00ed se stejn\u00fdm kl\u00ed\u010dem, u nich\u017e je \u010das ukon\u010den\u00ed men\u0161\u00ed ne\u017e aktu\u00e1ln\u00ed \u010dasov\u00e1 zna\u010dka \u2014 interval ne\u010dinnosti a \u010das zah\u00e1jen\u00ed v\u011bt\u0161\u00ed ne\u017e aktu\u00e1ln\u00ed \u010dasov\u00e1 zna\u010dka + interval ne\u010dinnosti. S ohledem na to se \u010dty\u0159i z\u00e1znamy z tab. 5.1 slou\u010d\u00ed do jednoho sezen\u00ed n\u00e1sleduj\u00edc\u00edm zp\u016fsobem.<\/p>\n<p>1. Jako prvn\u00ed p\u0159ich\u00e1z\u00ed z\u00e1znam 1, tak\u017ee \u010das zah\u00e1jen\u00ed je rovn\u00fd \u010dasu ukon\u010den\u00ed a odpov\u00edd\u00e1 00:00:00.<\/p>\n<p>2. D\u00e1le p\u0159ich\u00e1z\u00ed z\u00e1znam 2, a hled\u00e1me sezen\u00ed kon\u010d\u00edc\u00ed nejd\u0159\u00edve v 23:59:55 a za\u010d\u00ednaj\u00edc\u00ed nejpozd\u011bji v 00:00:35. Nalezneme z\u00e1znam 1 a spoj\u00edme sezen\u00ed 1 a 2. Bereme \u010das zah\u00e1jen\u00ed sezen\u00ed 1 (star\u0161\u00ed) a \u010das ukon\u010den\u00ed sezen\u00ed 2 (pozd\u011bj\u0161\u00ed), tak\u017ee na\u0161e nov\u00e9 sezen\u00ed za\u010d\u00edn\u00e1 v 00:00:00 a kon\u010d\u00ed v 00:00:15.<\/p>\n<p>3. P\u0159ich\u00e1z\u00ed z\u00e1znam 3, hled\u00e1me sezen\u00ed mezi 00:00:30 a 00:01:10 a nenajdeme \u017e\u00e1dn\u00e9. P\u0159id\u00e1v\u00e1me druh\u00e9 sezen\u00ed pro kl\u00ed\u010d 123-345-654,FFBE, kter\u00e9 za\u010d\u00edn\u00e1 a kon\u010d\u00ed v 00:00:50.<\/p>\n<p>4. P\u0159ich\u00e1z\u00ed z\u00e1znam 4, a hled\u00e1me sezen\u00ed mezi 23:59:45 a 00:00:25. Tentokr\u00e1t se naleznou ob\u011b sezen\u00ed \u2014 1 a 2. V\u0161echna t\u0159i sezen\u00ed se slou\u010d\u00ed do jednoho, s \u010dasem zah\u00e1jen\u00ed 00:00:00 a \u010dasem ukon\u010den\u00ed 00:00:15.<\/p>\n<p>Z toho, co jsme probrali v t\u00e9to kapitole, si zapamatujte n\u00e1sleduj\u00edc\u00ed d\u016fle\u017eit\u00e9 skute\u010dnosti:<\/p>\n<ul>\n<li>sezen\u00ed \u2014 nejsou okna pevn\u00e9 velikosti. D\u00e9lka sezen\u00ed je ur\u010dena aktivitou v r\u00e1mci dan\u00e9ho \u010dasov\u00e9ho intervalu;<\/li>\n<li>\u010dasov\u00e9 zna\u010dky v datech ur\u010duj\u00ed, zda ud\u00e1lost spad\u00e1 do existuj\u00edc\u00edho sezen\u00ed nebo do obdob\u00ed ne\u010dinnosti.<\/li>\n<\/ul>\n<p>\nD\u00e1le probereme dal\u0161\u00ed variantu oken \u2014 \u201ekotou\u010dov\u00e1\u201c okna.<\/p>\n<h3>\u201eKotou\u010dov\u00e1\u201c okna<\/h3>\n<p>\n\u201eTumbling\u201c okna zachycuj\u00ed ud\u00e1losti, kter\u00e9 p\u0159ich\u00e1zej\u00ed v ur\u010dit\u00e9m \u010dasov\u00e9m intervalu. P\u0159edstavte si, \u017ee pot\u0159ebujete zachytit v\u0161echny burzovn\u00ed transakce ur\u010dit\u00e9 spole\u010dnosti ka\u017ed\u00fdch 20 sekund, tak\u017ee shroma\u017e\u010fujete v\u0161echny ud\u00e1losti za tento \u010dasov\u00fd \u00fasek. Po uplynut\u00ed 20sekundov\u00e9ho intervalu se okno \u201ep\u0159et\u00e1\u010d\u00ed\u201c a p\u0159ech\u00e1z\u00ed na nov\u00fd 20sekundov\u00fd interval sledov\u00e1n\u00ed. Obr\u00e1zek 5.14 ilustruje tuto situaci.<\/p>\n<p><img decoding=\"async\" alt=\"Kniha \u201eKafka Streams v akci. Aplikace a mikroservisy pro pr\u00e1ci v re\u00e1ln\u00e9m \u010dase\u201c\" src=\"\/wp-content\/uploads\/e90e560d9ddda5e2e524b7c387ad9874.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nJak vid\u00edte, v\u0161echny ud\u00e1losti, kter\u00e9 p\u0159i\u0161ly za posledn\u00edch 20 sekund, jsou zahrnuty do okna. Po uplynut\u00ed tohoto \u010dasov\u00e9ho \u00faseku se vytvo\u0159\u00ed nov\u00e9 okno.<\/p>\n<p>V v\u00fdpisu 5.6 je uveden k\u00f3d, kter\u00fd demonstruje pou\u017eit\u00ed \u201etumbling\u201c oken pro zachyt\u00e1v\u00e1n\u00ed burzovn\u00edch transakc\u00ed ka\u017ed\u00fdch 20 sekund (nach\u00e1z\u00ed se v souboru src\/main\/java\/bbejeck\/chapter_5\/CountingWindowingAndKtableJoinExample.java).<\/p>\n<p><img decoding=\"async\" alt=\"Kniha \u201eKafka Streams v akci. Aplikace a mikroservisy pro pr\u00e1ci v re\u00e1ln\u00e9m \u010dase\u201c\" src=\"\/wp-content\/uploads\/e055bb1b288c7d500b64372fe3fbf064.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nD\u00edky t\u00e9to mal\u00e9 zm\u011bn\u011b v vol\u00e1n\u00ed metody TimeWindows.of je mo\u017en\u00e9 pou\u017e\u00edt \u201etumbling\u201c okno. V tomto p\u0159\u00edkladu nen\u00ed vol\u00e1n\u00ed metody until(), co\u017e znamen\u00e1, \u017ee bude pou\u017eito v\u00fdchoz\u00ed uchov\u00e1vac\u00ed obdob\u00ed, tedy 24 hodin.<\/p>\n<p>Nakonec p\u0159ejdeme k posledn\u00edmu typu oken \u2014 \u201ehopping\u201c (sk\u00e1kac\u00ed) okn\u016fm.<\/p>\n<h3>Klouzav\u00e1 (\u201ehopping\u201c) okna<\/h3>\n<p>\nKlouzav\u00e1\/\u201ehopping\u201c (sliding\/hopping) okna jsou podobn\u00e1 \u201etumbling\u201c okn\u016fm, ale s men\u0161\u00edm rozd\u00edlem. Klouzav\u00e1 okna ne\u010dekaj\u00ed na skon\u010den\u00ed \u010dasov\u00e9ho intervalu, ne\u017e vytvo\u0159\u00ed nov\u00e9 okno pro zpracov\u00e1n\u00ed ned\u00e1vn\u00fdch ud\u00e1lost\u00ed. Nov\u00e9 v\u00fdpo\u010dty spou\u0161t\u011bj\u00ed po intervalu \u010dek\u00e1n\u00ed, kter\u00fd je krat\u0161\u00ed ne\u017e doba okna.<\/p>\n<p>Abychom ilustrovali rozd\u00edly mezi \u201etumbling\u201c a \u201ehopping\u201c okny, vra\u0165me se k p\u0159\u00edkladu s po\u010d\u00edt\u00e1n\u00edm burzovn\u00edch transakc\u00ed. Na\u0161\u00edm c\u00edlem z\u016fst\u00e1v\u00e1 po\u010d\u00edtat po\u010det transakc\u00ed, ale nechceme \u010dekat cel\u00fd \u010dasov\u00fd \u00fasek p\u0159ed aktualizac\u00ed po\u010d\u00edta\u010de. M\u00edsto toho budeme aktualizovat po\u010d\u00edtadlo v krat\u0161\u00edch \u010dasov\u00fdch intervalech. Nap\u0159\u00edklad budeme nad\u00e1le po\u010d\u00edtat po\u010det transakc\u00ed ka\u017ed\u00fdch 20 sekund, ale po\u010d\u00edtadlo budeme aktualizovat ka\u017ed\u00fdch 5 sekund, jak je uk\u00e1z\u00e1no na obr. 5.15. T\u00edmto z\u00edsk\u00e1me t\u0159i v\u00fdsledkov\u00e1 okna s p\u0159ekr\u00fdvaj\u00edc\u00edmi se daty.<\/p>\n<p><img decoding=\"async\" alt=\"Kniha \u201eKafka Streams v akci. Aplikace a mikroservisy pro pr\u00e1ci v re\u00e1ln\u00e9m \u010dase\u201c\" src=\"\/wp-content\/uploads\/415c8cd9f2b60d453a1a01c3bc99331f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nV v\u00fdpisu 5.7 je uveden k\u00f3d pro nastaven\u00ed klouzav\u00fdch oken (nach\u00e1z\u00ed se v souboru src\/main\/java\/bbejeck\/chapter_5\/CountingWindowingAndKtableJoinExample.java).<\/p>\n<p><img decoding=\"async\" alt=\"Kniha \u201eKafka Streams v akci. Aplikace a mikroservisy pro pr\u00e1ci v re\u00e1ln\u00e9m \u010dase\u201c\" src=\"\/wp-content\/uploads\/ab2d1a64380d256d3fb084e16597417c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nOkno \u201esk\u00e1kaj\u00edc\u00ed\u201c lze p\u0159ev\u00e9st na \u201ep\u0159evr\u017een\u00e9\u201c pomoc\u00ed p\u0159id\u00e1n\u00ed vol\u00e1n\u00ed metody advanceBy(). V uveden\u00e9m p\u0159\u00edkladu je interval uchov\u00e1v\u00e1n\u00ed nastaven na 15 minut.<\/p>\n<p>V t\u00e9to \u010d\u00e1sti jste se dozv\u011bd\u011bli, jak omezit v\u00fdsledky agregace \u010dasov\u00fdmi okny. Zejm\u00e9na si zapamatujte z t\u00e9to \u010d\u00e1sti n\u00e1sleduj\u00edc\u00ed t\u0159i v\u011bci:<\/p>\n<ul>\n<li>velikost sezen\u00ed nen\u00ed omezena \u010dasov\u00fdm intervalem, ale aktivitou u\u017eivatel\u016f;<\/li>\n<li>\u201ep\u0159evr\u017een\u00e1\u201c okna poskytuj\u00ed pohled na ud\u00e1losti v r\u00e1mci stanoven\u00e9ho \u010dasov\u00e9ho obdob\u00ed;<\/li>\n<li>doba trv\u00e1n\u00ed \u201esk\u00e1kaj\u00edc\u00edch\u201c oken je pevn\u011b stanovena, ale \u010dasto se aktualizuj\u00ed a mohou obsahovat v r\u016fzn\u00fdch oknech p\u0159ekr\u00fdvaj\u00edc\u00ed se z\u00e1znamy.<\/li>\n<\/ul>\n<p>\nD\u00e1le se dozv\u00edme, jak p\u0159ev\u00e9st KTable zp\u011bt na KStream pro spojen\u00ed.<\/p>\n<h3>5.3.3. Spojen\u00ed objekt\u016f KStream a KTable<\/h3>\n<p>\nV kapitole 4 jsme prob\u00edrali spojen\u00ed dvou objekt\u016f KStream. Nyn\u00ed se mus\u00edme nau\u010dit spojit KTable a KStream. M\u016f\u017ee to b\u00fdt pot\u0159eba z n\u00e1sleduj\u00edc\u00edho jednoduch\u00e9ho d\u016fvodu. KStream je proud z\u00e1znam\u016f, zat\u00edmco KTable je proud aktualizac\u00ed z\u00e1znam\u016f, ale n\u011bkdy m\u016f\u017ee b\u00fdt nutn\u00e9 p\u0159idat dal\u0161\u00ed kontext k proudu z\u00e1znam\u016f pomoc\u00ed aktualizac\u00ed z KTable.<\/p>\n<p>Vezmeme si data o po\u010dtu burzovn\u00edch transakc\u00ed a spoj\u00edme je s burzovn\u00edmi novinkami podle odpov\u00eddaj\u00edc\u00edch pr\u016fmyslov\u00fdch odv\u011btv\u00ed. Tady je to, co mus\u00edme ud\u011blat, abychom toho dos\u00e1hli s ohledem na ji\u017e existuj\u00edc\u00ed k\u00f3d.<\/p>\n<ol>\n<li>P\u0159ev\u00e9st objekt KTable s daty o po\u010dtu burzovn\u00edch transakc\u00ed na KStream, p\u0159i\u010dem\u017e kl\u00ed\u010d nahrad\u00edme kl\u00ed\u010dem, kter\u00fd ozna\u010duje pr\u016fmyslov\u00e9 odv\u011btv\u00ed odpov\u00eddaj\u00edc\u00ed dan\u00e9mu akciov\u00e9mu symbolu.<\/li>\n<li>Vytvo\u0159it objekt KTable, kter\u00fd \u010dte data z t\u00e9matu s burzovn\u00edmi novinkami. Tento nov\u00fd KTable bude kategorizov\u00e1n podle pr\u016fmyslov\u00fdch odv\u011btv\u00ed.<\/li>\n<li>Spojit aktualizace zpr\u00e1v s informacemi o po\u010dtu burzovn\u00edch transakc\u00ed podle pr\u016fmyslov\u00fdch odv\u011btv\u00ed.<\/li>\n<\/ol>\n<p>\nNyn\u00ed se pod\u00edvejme, jak tento pl\u00e1n realizovat.<\/p>\n<h3>P\u0159evod KTable na KStream<\/h3>\n<p>\nPro p\u0159evod KTable na KStream je t\u0159eba u\u010dinit n\u00e1sleduj\u00edc\u00ed.<\/p>\n<ol>\n<li>Zavolat metodu KTable.toStream().<\/li>\n<li>Pomoc\u00ed vol\u00e1n\u00ed metody KStream.map nahradit kl\u00ed\u010d n\u00e1zvem pr\u016fmyslov\u00e9ho odv\u011btv\u00ed a pot\u00e9 extrahovat z instance Windowed objekt TransactionSummary.<\/li>\n<\/ol>\n<p>\nTyto operace z\u0159et\u011bz\u00edme n\u00e1sleduj\u00edc\u00edm zp\u016fsobem (k\u00f3d lze nal\u00e9zt v souboru src\/main\/java\/bbejeck\/chapter_5\/CountingWindowingAndKtableJoinExample.java) (listing 5.8).<\/p>\n<p><img decoding=\"async\" alt=\"Kniha \u201eKafka Streams v akci. Aplikace a mikroservisy pro pr\u00e1ci v re\u00e1ln\u00e9m \u010dase\u201c\" src=\"\/wp-content\/uploads\/0d43c2650f6e66e2816ed383da3a29c2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPokud vykon\u00e1v\u00e1me operaci KStream.map, je op\u011btovn\u00e9 \u010dlen\u011bn\u00ed pro vr\u00e1cen\u00fd instance KStream provedeno automaticky p\u0159i jeho pou\u017eit\u00ed v joinu.<\/p>\n<p>Dokon\u010dili jsme proces transformace, nyn\u00ed mus\u00edme vytvo\u0159it objekt KTable pro \u010dten\u00ed burzovn\u00edch zpr\u00e1v.<\/p>\n<h3>Vytv\u00e1\u0159en\u00ed KTable pro burzovn\u00ed zpr\u00e1vy<\/h3>\n<p>\nNa\u0161t\u011bst\u00ed sta\u010d\u00ed k vytvo\u0159en\u00ed objektu KTable jedin\u00fd \u0159\u00e1dek k\u00f3du (tento k\u00f3d lze nal\u00e9zt v souboru src\/main\/java\/bbejeck\/chapter_5\/CountingWindowingAndKtableJoinExample.java) (v\u00fdpis 5.9).<\/p>\n<p><img decoding=\"async\" alt=\"Kniha \u201eKafka Streams v akci. Aplikace a mikroservisy pro pr\u00e1ci v re\u00e1ln\u00e9m \u010dase\u201c\" src=\"\/wp-content\/uploads\/6e83a393fdc9ab74fda4cbdddddb5213.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nJe t\u0159eba poznamenat, \u017ee nen\u00ed nutn\u00e9 uv\u00e1d\u011bt \u017e\u00e1dn\u00e9 objekty Serde, proto\u017ee v nastaven\u00ed jsou pou\u017eity \u0159et\u011bzcov\u00e9 Serde. D\u00edky pou\u017eit\u00ed enumerace EARLIEST je tabulka pln\u011bna z\u00e1znamy na sam\u00e9m za\u010d\u00e1tku.<\/p>\n<p>Nyn\u00ed se m\u016f\u017eeme p\u0159esunout k posledn\u00edmu kroku \u2014 joinu.<\/p>\n<h3>Spojen\u00ed aktualizac\u00ed zpr\u00e1v s \u00fadaji o po\u010dtu transakc\u00ed<\/h3>\n<p>\nVytvo\u0159en\u00ed spojen\u00ed nen\u00ed nijak slo\u017eit\u00e9. Pou\u017eijeme lev\u00e9 spojen\u00ed pro p\u0159\u00edpad, \u017ee v p\u0159\u00edslu\u0161n\u00e9 oblasti nen\u00ed \u017e\u00e1dn\u00e1 burzovn\u00ed zpr\u00e1va (pot\u0159ebn\u00fd k\u00f3d lze nal\u00e9zt v souboru src\/main\/java\/bbejeck\/chapter_5\/CountingWindowingAndKtableJoinExample.java) (v\u00fdpis 5.10).<\/p>\n<p><img decoding=\"async\" alt=\"Kniha \u201eKafka Streams v akci. Aplikace a mikroservisy pro pr\u00e1ci v re\u00e1ln\u00e9m \u010dase\u201c\" src=\"\/wp-content\/uploads\/92ed70f98927d2f778ad14dbc2a5aa26.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nTento oper\u00e1tor leftJoin je dost jednoduch\u00fd. Na rozd\u00edl od spojen\u00ed z kapitoly 4 se metoda JoinWindow nepou\u017e\u00edv\u00e1, proto\u017ee p\u0159i prov\u00e1d\u011bn\u00ed spojen\u00ed KStream-KTable je pro ka\u017ed\u00fd kl\u00ed\u010d v KTable p\u0159\u00edtomen pouze jeden z\u00e1znam. Toto spojen\u00ed nen\u00ed \u010dasov\u011b omezeno: z\u00e1znam bu\u010f je v KTable, nebo nen\u00ed. Hlavn\u00ed z\u00e1v\u011br: s pomoc\u00ed objekt\u016f KTable lze obohacovat KStream m\u00e9n\u011b \u010dasto aktualizovan\u00fdmi referen\u010dn\u00edmi daty.<\/p>\n<p>A nyn\u00ed se pod\u00edv\u00e1me na efektivn\u011bj\u0161\u00ed zp\u016fsob obohacen\u00ed ud\u00e1lost\u00ed z KStream.<\/p>\n<h3>5.3.4. Objekty GlobalKTable<\/h3>\n<p>\nJak jste pochopili, existuje pot\u0159eba obohacen\u00ed prouden\u00ed ud\u00e1lost\u00ed nebo p\u0159id\u00e1n\u00ed kontextu. V kapitole 4 jste vid\u011bli spojen\u00ed dvou objekt\u016f KStream, a v p\u0159edchoz\u00ed \u010d\u00e1sti spojen\u00ed KStream a KTable. Ve v\u0161ech t\u011bchto p\u0159\u00edpadech je nutn\u00e9 op\u011btovn\u00e9 \u010dlen\u011bn\u00ed datov\u00e9ho proudu p\u0159i mapov\u00e1n\u00ed kl\u00ed\u010d\u016f na nov\u00fd typ nebo hodnotu. N\u011bkdy se op\u011btovn\u00e9 \u010dlen\u011bn\u00ed prov\u00e1d\u00ed explicitn\u011b, jindy to Kafka Streams d\u011bl\u00e1 automaticky. Op\u011btovn\u00e9 \u010dlen\u011bn\u00ed je nutn\u00e9, proto\u017ee kl\u00ed\u010de se zm\u011bnily a z\u00e1znamy mus\u00ed b\u00fdt v nov\u00fdch sekc\u00edch, jinak nebude spojen\u00ed mo\u017en\u00e9 (to bylo diskutov\u00e1no v kapitole 4, v bod\u011b \u201eOp\u011btovn\u00e9 \u010dlen\u011bn\u00ed dat\u201c podkapitoly 4.2.4).<\/p>\n<h3>Opakovan\u00e9 d\u011blen\u00ed m\u00e1 svou cenu<\/h3>\n<p>\nOpakovan\u00e9 d\u011blen\u00ed vy\u017eaduje n\u00e1klady \u2013 dal\u0161\u00ed n\u00e1klady na vytv\u00e1\u0159en\u00ed mezilehl\u00fdch t\u00e9mat, uchov\u00e1v\u00e1n\u00ed duplicitn\u00edch dat v dal\u0161\u00edm t\u00e9matu; tak\u00e9 to znamen\u00e1 zv\u00fd\u0161en\u00ed latence v d\u016fsledku z\u00e1pisu a \u010dten\u00ed z tohoto t\u00e9matu. Krom\u011b toho, pokud je t\u0159eba prov\u00e9st spojen\u00ed na v\u00edce ne\u017e jednom aspektu nebo dimenzi, je nutn\u00e9 uspo\u0159\u00e1dat spojen\u00ed v \u0159et\u011bzci, zobrazit z\u00e1znamy s nov\u00fdmi kl\u00ed\u010di a znovu prov\u00e9st proces opakovan\u00e9ho d\u011blen\u00ed.<\/p>\n<h3>Spojen\u00ed s men\u0161\u00edmi datov\u00fdmi sadami<\/h3>\n<p>\nV n\u011bkter\u00fdch p\u0159\u00edpadech je objem referen\u010dn\u00edch dat, se kter\u00fdmi se pl\u00e1nuje spojen\u00ed, relativn\u011b mal\u00fd, tak\u017ee jejich \u00fapln\u00e9 kopie se mohou pohodln\u011b vej\u00edt lok\u00e1ln\u011b na ka\u017ed\u00e9m z uzl\u016f. Pro takov\u00e9 situace je v Kafka Streams k dispozici t\u0159\u00edda GlobalKTable.<\/p>\n<p>Instanc\u00ed GlobalKTable je unik\u00e1tn\u00ed, proto\u017ee aplikace replikuj\u00ed v\u0161echna data na ka\u017ed\u00fd z uzl\u016f. A proto\u017ee na ka\u017ed\u00e9m z uzl\u016f jsou v\u0161echna data, nen\u00ed nutn\u00e9 d\u011blit tok ud\u00e1lost\u00ed podle kl\u00ed\u010de referen\u010dn\u00edch dat, aby byl dostupn\u00fd v\u0161em sekc\u00edm. Pomoc\u00ed objekt\u016f GlobalKTable lze tak\u00e9 prov\u00e1d\u011bt bezkl\u00ed\u010dov\u00e1 spojen\u00ed. Vra\u0165me se k jednomu z p\u0159edchoz\u00edch p\u0159\u00edklad\u016f, abychom demonstrovali tuto mo\u017enost.<\/p>\n<h3>Spojen\u00ed objekt\u016f KStream s objekty GlobalKTable<\/h3>\n<p>\nV pododd\u00edle 5.3.2 jsme provedli okno agregace burzovn\u00edch transakc\u00ed podle z\u00e1kazn\u00edk\u016f. V\u00fdsledky t\u00e9to agregace vypadaly p\u0159ibli\u017en\u011b takto:<\/p>\n<pre><code class=\"plaintext\">{customerId='074-09-3705', stockTicker='GUTM'}, 17\n{customerId='037-34-5184', stockTicker='CORK'}, 16<\/code><\/pre>\n<p>\nI kdy\u017e tyto v\u00fdsledky odpov\u00eddaly stanoven\u00e9mu c\u00edli, bylo by pohodln\u011bj\u0161\u00ed, kdyby se tak\u00e9 zobrazovalo jm\u00e9no z\u00e1kazn\u00edka a \u00fapln\u00fd n\u00e1zev spole\u010dnosti. Chcete-li p\u0159idat jm\u00e9no z\u00e1kazn\u00edka a n\u00e1zev spole\u010dnosti, m\u016f\u017eete prov\u00e1d\u011bt b\u011b\u017en\u00e1 spojen\u00ed, ale bude t\u0159eba prov\u00e9st dv\u011b mapov\u00e1n\u00ed kl\u00ed\u010d\u016f a opakovan\u00e9 d\u011blen\u00ed. S pomoc\u00ed GlobalKTable lze t\u011bmto n\u00e1klad\u016fm p\u0159edej\u00edt.<\/p>\n<p>K tomu vyu\u017eijeme objekt countStream z v\u00fdpisu 5.11 (p\u0159\u00edslu\u0161n\u00fd k\u00f3d naleznete v souboru src\/main\/java\/bbejeck\/chapter_5\/GlobalKTableExample.java), kter\u00fd spoj\u00edme se dv\u011bma objekty GlobalKTable.<\/p>\n<p><img decoding=\"async\" alt=\"Kniha \u201eKafka Streams v akci. Aplikace a mikroservisy pro pr\u00e1ci v re\u00e1ln\u00e9m \u010dase\u201c\" src=\"\/wp-content\/uploads\/fc4d91bbe062ceb94f5650224840b81e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nO t\u00e9to z\u00e1le\u017eitosti jsme ji\u017e hovo\u0159ili d\u0159\u00edve, tak\u017ee se nebudu opakovat. Ale r\u00e1d bych poznamenal, \u017ee k\u00f3d v funkci toStream().map byl pro lep\u0161\u00ed \u010ditelnost abstrahov\u00e1n do objektu-funkce nam\u00edsto vlo\u017een\u00e9ho lambda v\u00fdrazu.<\/p>\n<p>Dal\u0161\u00edm krokem je deklarace dvou instanc\u00ed GlobalKTable (p\u0159ilo\u017een\u00fd k\u00f3d najdete v souboru src\/main\/java\/bbejeck\/chapter_5\/GlobalKTableExample.java) (listing 5.12).<\/p>\n<p><img decoding=\"async\" alt=\"Kniha \u201eKafka Streams v akci. Aplikace a mikroservisy pro pr\u00e1ci v re\u00e1ln\u00e9m \u010dase\u201c\" src=\"\/wp-content\/uploads\/db3918895f174c8cfb5fc927b55f87a1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>V\u0161imn\u011bte si, \u017ee n\u00e1zvy t\u00e9mat jsou pops\u00e1ny pomoc\u00ed v\u00fd\u010dtov\u00fdch typ\u016f.<\/p>\n<p>Nyn\u00ed, kdy\u017e jsme p\u0159ipravili v\u0161echny komponenty, zb\u00fdv\u00e1 napsat k\u00f3d pro spojen\u00ed (kter\u00fd lze nal\u00e9zt v souboru src\/main\/java\/bbejeck\/chapter_5\/GlobalKTableExample.java) (listing 5.13).<\/p>\n<p><img decoding=\"async\" alt=\"Kniha \u201eKafka Streams v akci. Aplikace a mikroservisy pro pr\u00e1ci v re\u00e1ln\u00e9m \u010dase\u201c\" src=\"\/wp-content\/uploads\/799360cc99f1920c190a61fd4685d4ff.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nI kdy\u017e tento k\u00f3d obsahuje dv\u011b spojen\u00ed, jsou organizov\u00e1na do \u0159et\u011bzce, proto\u017ee ani jeden z jejich v\u00fdsledk\u016f nen\u00ed pou\u017e\u00edv\u00e1n samostatn\u011b. V\u00fdsledky se zobrazuj\u00ed na konci cel\u00e9 operace.<\/p>\n<p>P\u0159i spu\u0161t\u011bn\u00ed v\u00fd\u0161e uveden\u00e9 operace spojen\u00ed z\u00edsk\u00e1te v\u00fdsledky n\u00e1sleduj\u00edc\u00edho druhu:<\/p>\n<pre><code class=\"plaintext\">{customer='Barney, Smith' company=\"Exxon\", transactions= 17}<\/code><\/pre>\n<p>\nPodstata se nezm\u011bnila, ale tyto v\u00fdsledky vypadaj\u00ed mnohem srozumiteln\u011bji.<\/p>\n<p>Pokud po\u010d\u00edt\u00e1te kapitolu 4, ji\u017e jste vid\u011bli n\u011bkolik typ\u016f spojen\u00ed v akci. Jsou uvedeny v tab. 5.2. Tato tabulka zobrazuje mo\u017enosti spojen\u00ed aktu\u00e1ln\u00ed pro verzi 1.0.0 Kafka Streams; v budouc\u00edch vyd\u00e1n\u00edch se m\u016f\u017ee n\u011bco zm\u011bnit.<\/p>\n<p><img decoding=\"async\" alt=\"Kniha \u201eKafka Streams v akci. Aplikace a mikroservisy pro pr\u00e1ci v re\u00e1ln\u00e9m \u010dase\u201c\" src=\"\/wp-content\/uploads\/8e4cf35c64a8431bda43a5e748de275f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNa z\u00e1v\u011br bych cht\u011bl p\u0159ipomenout hlavn\u00ed my\u0161lenku: m\u016f\u017eete spojovat streamy ud\u00e1lost\u00ed (KStream) a streamy aktualizac\u00ed (KTable) pomoc\u00ed lok\u00e1ln\u00edho stavu. Nav\u00edc, pokud nen\u00ed velikost referen\u010dn\u00edch dat p\u0159\u00edli\u0161 velk\u00e1, je mo\u017en\u00e9 vyu\u017e\u00edt objekt GlobalKTable. GlobalKTable replikuje v\u0161echny sekce na ka\u017ed\u00fd uzel aplikace Kafka Streams, co\u017e zaji\u0161\u0165uje dostupnost v\u0161ech dat bez ohledu na to, kter\u00e1 sekce se zpr\u00e1v\u011b odpov\u00edd\u00e1 kl\u00ed\u010d.<\/p>\n<p>D\u00e1le uvid\u00edme mo\u017enost Kafka Streams, kter\u00e1 umo\u017e\u0148uje sledovat zm\u011bny stavu bez spot\u0159eby dat z t\u00e9matu Kafka.<\/p>\n<h3>5.3.5. Dostupn\u00fd stav pro dotazy<\/h3>\n<p>\nJi\u017e jsme provedli n\u011bkolik operac\u00ed se stavem a v\u017edy jsme zobrazovali v\u00fdsledky v konzoli (pro v\u00fdvojov\u00e9 \u00fa\u010dely) nebo je zapisovali do t\u00e9matu (pro pr\u016fmyslov\u00e9 \u00fa\u010dely). P\u0159i z\u00e1pisu v\u00fdsledk\u016f do t\u00e9matu je nutn\u00e9 pou\u017e\u00edt spot\u0159ebitele Kafka pro jejich zobrazen\u00ed.<\/p>\n<p>\u010cten\u00ed dat z t\u011bchto t\u00e9mat lze pova\u017eovat za formu materializovan\u00fdch zobrazen\u00ed. Pro na\u0161e \u00fa\u010dely m\u016f\u017eeme pou\u017e\u00edt definici materializovan\u00e9ho zobrazen\u00ed z \u201eWikipedie\u201c: \u201e\u2026fyzick\u00fd objekt datab\u00e1ze, kter\u00fd obsahuje v\u00fdsledky proveden\u00ed dotazu. Nap\u0159\u00edklad m\u016f\u017ee b\u00fdt lok\u00e1ln\u00ed kopi\u00ed vzd\u00e1len\u00fdch dat, nebo podmno\u017einou \u0159\u00e1dk\u016f a\/nebo sloupc\u016f tabulky \u010di v\u00fdsledk\u016f spojen\u00ed, nebo souhrnnou tabulkou z\u00edskanou pomoc\u00ed agregace\u201c (https:\/\/en.wikipedia.org\/wiki\/Materialized_view).<\/p>\n<p>Kafka Streams tak\u00e9 umo\u017e\u0148uje prov\u00e1d\u011bt interaktivn\u00ed dotazy na \u00falo\u017ei\u0161t\u00edch stavu, co\u017e umo\u017e\u0148uje p\u0159\u00edm\u00e9 \u010dten\u00ed t\u011bchto materializovan\u00fdch zobrazen\u00ed. Je d\u016fle\u017eit\u00e9 poznamenat, \u017ee dotaz na \u00falo\u017ei\u0161t\u011b stavu m\u00e1 charakter operace \u201epouze pro \u010dten\u00ed\u201c. D\u00edky tomu se nemus\u00edte ob\u00e1vat n\u00e1hodn\u00e9ho vzniku nesouladu stavu b\u011bhem zpracov\u00e1n\u00ed dat aplikac\u00ed.<\/p>\n<p>Mo\u017enost p\u0159\u00edm\u00fdch dotaz\u016f na \u00falo\u017ei\u0161t\u011b stavu m\u00e1 velk\u00fd v\u00fdznam. Znamen\u00e1 to, \u017ee lze vytv\u00e1\u0159et aplikace \u2014 informa\u010dn\u00ed panely, ani\u017e by bylo nutn\u00e9 nejprve z\u00edsk\u00e1vat data od spot\u0159ebitele Kafka. Zvy\u0161uje tak\u00e9 efektivitu aplikace d\u00edky tomu, \u017ee nen\u00ed pot\u0159eba znovu zapisovat data:<\/p>\n<ul>\n<li>d\u00edky lokalit\u011b dat k nim lze rychle p\u0159istupovat;<\/li>\n<li>vylu\u010duje se duplicita dat, proto\u017ee se neukl\u00e1daj\u00ed do extern\u00edho \u00falo\u017ei\u0161t\u011b.<\/li>\n<\/ul>\n<p>\nHlavn\u00ed, co bych cht\u011bl, abyste si zapamatovali: dotazy na stav lze prov\u00e1d\u011bt p\u0159\u00edmo z aplikace. Nelze podce\u0148ovat mo\u017enosti, kter\u00e9 v\u00e1m to d\u00e1v\u00e1. M\u00edsto spot\u0159eby dat z Kafka a ukl\u00e1d\u00e1n\u00ed z\u00e1znam\u016f do datab\u00e1ze pro aplikaci m\u016f\u017eete prov\u00e1d\u011bt dotazy na \u00falo\u017ei\u0161t\u011b stavu se stejn\u00fdm v\u00fdsledkem. P\u0159\u00edm\u00e9 dotazy na \u00falo\u017ei\u0161t\u011b stavu znamenaj\u00ed men\u0161\u00ed objem k\u00f3du (\u017e\u00e1dn\u00fd spot\u0159ebitel) a m\u00e9n\u011b softwaru (\u017e\u00e1dn\u00e1 pot\u0159eba tabulky datab\u00e1ze pro ukl\u00e1d\u00e1n\u00ed v\u00fdsledk\u016f).<\/p>\n<p>V t\u00e9to kapitole jsme pokryli zna\u010dn\u00e9 mno\u017estv\u00ed informac\u00ed, proto nyn\u00ed p\u0159eru\u0161\u00edme na\u0161i diskusi o interaktivn\u00edch dotazech na \u00falo\u017ei\u0161t\u011b stavu. Ale nebojte se: v kapitole 9 vytvo\u0159\u00edme jednoduchou aplikaci \u2013 informa\u010dn\u00ed panel s interaktivn\u00edmi dotazy. Krom\u011b toho, \u017ee v n\u011bm budou demonstrov\u00e1ny interaktivn\u00ed dotazy a mo\u017enosti jejich za\u010dlen\u011bn\u00ed do aplikac\u00ed Kafka Streams, budou zde pou\u017eity n\u011bkter\u00e9 p\u0159\u00edklady z t\u00e9to a p\u0159edchoz\u00ed kapitoly.<\/p>\n<h3>Shrnut\u00ed<\/h3>\n<p><\/p>\n<ul>\n<li>Objekty KStream p\u0159edstavuj\u00ed proudy ud\u00e1lost\u00ed, kter\u00e9 se podobaj\u00ed vkl\u00e1d\u00e1n\u00ed do datab\u00e1ze. Objekty KTable p\u0159edstavuj\u00ed proudy aktualizac\u00ed, jsou v\u00edce podobn\u00e9 aktualizac\u00edm v datab\u00e1zi. Velikost objektu KTable se nezvy\u0161uje, star\u00e9 z\u00e1znamy jsou nahrazov\u00e1ny nov\u00fdmi.<\/li>\n<li>Objekty KTable jsou nezbytn\u00e9 pro agregace.<\/li>\n<li>Pomoc\u00ed oknov\u00fdch operac\u00ed je mo\u017en\u00e9 rozd\u011blit agregovan\u00e1 data do \u010dasov\u00fdch kontejn\u00e9r\u016f.<\/li>\n<li>D\u00edky objekt\u016fm GlobalKTable je mo\u017en\u00e9 p\u0159istupovat k referen\u010dn\u00edm dat\u016fm z jak\u00e9hokoli m\u00edsta aplikace, bez ohledu na rozd\u011blen\u00ed podle \u010d\u00e1st\u00ed.<\/li>\n<li>Mo\u017en\u00e1 spojen\u00ed mezi objekty KStream, KTable a GlobalKTable.<\/li>\n<\/ul>\n<p>\nDosud jsme se soust\u0159edili na vytv\u00e1\u0159en\u00ed aplikac\u00ed Kafka Streams pomoc\u00ed vysoce\u00farov\u0148ov\u00e9ho DSL KStream. A\u010dkoli vysoce\u00farov\u0148ov\u00fd p\u0159\u00edstup umo\u017e\u0148uje ps\u00e1t elegantn\u00ed a stru\u010dn\u00e9 programy, jeho pou\u017eit\u00ed p\u0159edstavuje ur\u010ditou kompromis. Pr\u00e1ce s DSL KStream znamen\u00e1 zlep\u0161en\u00ed stru\u010dnosti k\u00f3du na \u00fakor kontroly. V n\u00e1sleduj\u00edc\u00ed kapitole prozkoum\u00e1me n\u00edzko\u00farov\u0148ov\u00e9 API uzl\u016f zpracovatel\u016f a vyzkou\u0161\u00edme dal\u0161\u00ed kompromisy. Programy se stanou del\u0161\u00edmi, ne\u017e byly dosud, ale z\u00edsk\u00e1me mo\u017enost vytv\u00e1\u0159et prakticky jak\u00fdkoli uzel zpracovatele, kter\u00fd budeme pot\u0159ebovat.<\/p>\n<p>\u2192 O knize se lze podrobn\u011bji sezn\u00e1mit na <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/collection\/best\/product\/kafka-streams-v-deystvii-prilozheniya-i-mikroservisy-dlya-raboty-v-realnom-vremeni\">webov\u00fdch str\u00e1nk\u00e1ch vydavatelstv\u00ed<\/a><\/noindex><\/p>\n<p>\u2192 Pro u\u017eivatele Habr slevov\u00fd k\u00f3d 25% \u2014 <b>Kafka Streams<\/b><\/p>\n<p>\u2192 Po \u00fahrad\u011b ti\u0161t\u011bn\u00e9 verze knihy bude na e-mail odesl\u00e1na elektronick\u00e1 kniha.<br \/>\n<br \/>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/piter\/blog\/457756\/\">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\u043e\u0436\u0438\u0442\u0435\u043b\u0438! \u042d\u0442\u0430 \u043a\u043d\u0438\u0433\u0430 \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u043e\u0447\u0435\u0442 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435. \u041f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043b\u0443\u0447\u0448\u0435 \u0438\u0437\u0443\u0447\u0438\u0442\u044c Kafka \u0438 Kafka Streams. \u0411\u044b\u043b\u043e \u0431\u044b \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0437\u043d\u0430\u0442\u044c \u0438 \u0441\u0430\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a Kafka, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e: \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0432\u0430\u043c \u0432\u0441\u0435, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e. \u041e\u043f\u044b\u0442\u043d\u044b\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 Kafka, \u043a\u0430\u043a \u0438 \u043d\u043e\u0432\u0438\u0447\u043a\u0438, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u0439 \u043a\u043d\u0438\u0433\u0435 \u043e\u0441\u0432\u043e\u044f\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-35786","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\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\/kniga-kafka-streams-v-dejstvii-prilozheniya-i-mikroservisy-dlya-raboty-v-realnom-vremeni\" \/>\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\u041a\u043d\u0438\u0433\u0430 \u00abKafka Streams \u0432 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438\u00bb | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/kniga-kafka-streams-v-dejstvii-prilozheniya-i-mikroservisy-dlya-raboty-v-realnom-vremeni\" \/>\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-31T19:06:19+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:06:19+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\udd47Kniha \u201eKafka Streams v akci. Aplikace a mikroslu\u017eby pro re\u00e1ln\u00fd \u010das\u201c | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/kniga-kafka-streams-v-dejstvii-prilozheniya-i-mikroservisy-dlya-raboty-v-realnom-vremeni","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\u041a\u043d\u0438\u0433\u0430 \u00abKafka Streams \u0432 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438\u00bb | ProHoster","og:url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/kniga-kafka-streams-v-dejstvii-prilozheniya-i-mikroservisy-dlya-raboty-v-realnom-vremeni","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-31T19:06:19+00:00","article:modified_time":"2019-10-31T19:06:19+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"35786","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-22 00:45:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:56:32","updated":"2026-01-22 00:45: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\/35786","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=35786"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/35786\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=35786"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=35786"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=35786"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}