{"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\/et\/blog\/administrirovanie\/kniga-kafka-streams-v-dejstvii-prilozheniya-i-mikroservisy-dlya-raboty-v-realnom-vremeni","title":{"rendered":"Raamat \u00abKafka Streams tegevuses. Rakendused ja mikroteenused reaalajas t\u00f6\u00f6tamiseks\u00bb","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=\"Raamat \u00abKafka Streams tegevuses. Rakendused ja mikroteenused reaalajas t\u00f6\u00f6tamiseks\u00bb\" src=\"\/wp-content\/uploads\/6f8bd2b31b87b0c760c1148515893c43.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex> Tere, Habr\u017eiteli! See raamat sobib igasugustele arendajatele, kes soovivad m\u00f5ista voogude t\u00f6\u00f6tlemist. Jagatud programmeerimise m\u00f5istmine aitab paremini uurida Kafka ja Kafka Streams'i. Oleks hea, kui teada ka Kafka raamistikku, kuid see pole kohustuslik: ma r\u00e4\u00e4gin teile k\u00f5ik, mis vajalik. Kogenud Kafka arendajad, nagu ka algajad, saavad t\u00e4nu sellele raamatule omandada oskusi huvitavate rakenduste loomisel voogude t\u00f6\u00f6tlemise kaudu Kafka Streams'i raamatukoguga. Keskmise ja k\u00f5rge tasemega Java-arendajad, kes on juba tuttavad selliste m\u00f5istetega nagu serialiseerimine, \u00f5pivad rakenduse loomise oskusi rakendama Kafka Streams'iga. Raamatu l\u00e4htekood on kirjutatud Java 8-s ja kasutab oluliselt Java 8 lambda-v\u00e4ljendite s\u00fcntaksit, seega on kasulik osata t\u00f6\u00f6tada lambda-funktsioonidega (isegi kui neid rakendatakse teises programmeerimiskeeles).<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>L\u00f5ik. 5.3. Agregeerimine ja aknaoperatsioonid<\/h3>\n<p>\nSelles jaotises liigume edasi Kafka Streams'i k\u00f5ige lootustandvamaid osi uurima. Seni oleme uurinud j\u00e4rgmisi aspekte Kafka Streams'ist:<\/p>\n<ul>\n<li>t\u00f6\u00f6tlemise topoloogia loomine;<\/li>\n<li>olekute kasutamine voograkendustes;<\/li>\n<li>voogandmete \u00fchenduste t\u00e4itmine;<\/li>\n<li>erinevused s\u00fcndmuste voogude (KStream) ja v\u00e4rskenduste voogude (KTable) vahel.<\/li>\n<\/ul>\n<p>\nJ\u00e4rgmistes n\u00e4idetes toome need k\u00f5ik elemendid kokku. Tutvute ka aknaoperatsioonidega \u2014 veel \u00fche suurep\u00e4rase voograkenduste funktsionaalsusega. Meie esimene n\u00e4ide k\u00e4sitleb lihtsat agregatsiooni.<\/p>\n<h3>5.3.1. Aktsiate m\u00fc\u00fcgimahtude agregatsioon t\u00f6\u00f6stusharude kaupa<\/h3>\n<p>\nAgregatsioon ja r\u00fchmitamine on h\u00e4davajalikud t\u00f6\u00f6riistad voogandmetega t\u00f6\u00f6tamisel. \u00dcksikute kirje uurimine reaalajas osutub sageli ebapiisavaks. Andmetest t\u00e4iendava teabe saamiseks on vajalik nende r\u00fchmitamine ja kombineerimine.<\/p>\n<p>Selles n\u00e4ites peate proovima p\u00e4evakaubanduse kaupleja kost\u00fc\u00fcmi, kellel on vaja j\u00e4lgida aktsiate m\u00fc\u00fcgimahte mitmest t\u00f6\u00f6stusharust. Eelk\u00f5ige huvitavad teid viis ettev\u00f5tet, millel on igas t\u00f6\u00f6stusharus k\u00f5ige suuremad aktsiate m\u00fc\u00fcgimahud.<\/p>\n<p>Selle sarnase aggregeerimise jaoks on vajalikud j\u00e4rgmised sammud andmete soovitud vormi t\u00f5lkimiseks (kui r\u00e4\u00e4kida laiemalt).<\/p>\n<ol>\n<li>Loo allikas, mis p\u00f5hineb teemal, mis avaldab t\u00f6\u00f6tlemata teavet aktsiakauplemise kohta. Peame kujundama StockTransaction objekti ShareVolume objektiks. Asi on selles, et StockTransaction objekt sisaldab m\u00fc\u00fcgi metaandmeid, samas kui me vajame vaid andmeid m\u00fc\u00fcdud aktsiate arvu kohta.<\/li>\n<li>Grupita ShareVolume andmed aktsia s\u00fcmbolite kaupa. P\u00e4rast s\u00fcmbolite j\u00e4rgi grupitamist saab need andmed kokku t\u00f5mmata aktsiate m\u00fc\u00fcgimahu vahepealseteks summadeks. Tuleb m\u00e4rkida, et meetod KStream.groupBy tagastab KGroupedStream t\u00fc\u00fcpi eksemplari. KTable eksemplari saamiseks saab seej\u00e4rel kutsuda meetodi KGroupedStream.reduce.<\/li>\n<\/ol>\n<p><\/p>\n<blockquote><p><b>Mis on KGroupedStream liides?<\/b><\/p>\n<p>KStream.groupBy ja KStream.groupByKey meetodid tagastavad KGroupedStream'i eksemplari. KGroupedStream on vahepealne esitus s\u00fcndmuste voos p\u00e4rast gruppimist v\u00f5tmete alusel. Seda ei ole m\u00f5eldud otseseks t\u00f6\u00f6tlemiseks. Selle asemel kasutatakse KGroupedStream'i kogumise operatsioonides, mille tulemus on alati KTable. Kuna kogumise operatsioonide tulemus on KTable ja neis kasutatakse olekuhoidlat, ei pruugi k\u00f5ik uuendused edastada konveieri kaudu.<\/p>\n<p>KTable.groupBy meetod tagastab sarnase KGroupedTable'i \u2014 vahepealse esitus voos, mis on uuendatud v\u00f5tme alusel.<\/p><\/blockquote>\n<p>\nTeeme v\u00e4ikese pausi ja vaatame joonist 5.9, mis n\u00e4itab, mida oleme saavutanud. See topoloogia peaks olema teile juba tuttav.<\/p>\n<p><img decoding=\"async\" alt=\"Raamat \u00abKafka Streams tegevuses. Rakendused ja mikroteenused reaalajas t\u00f6\u00f6tamiseks\u00bb\" src=\"\/wp-content\/uploads\/9fd61317cde376362adcaeec72908919.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nVaatame n\u00fc\u00fcd koodi selle topoloogia kohta (leiate selle failist src\/main\/java\/bbejeck\/chapter_5\/AggregationsAndReducingExample.java) (loetelu 5.2).<\/p>\n<p><img decoding=\"async\" alt=\"Raamat \u00abKafka Streams tegevuses. Rakendused ja mikroteenused reaalajas t\u00f6\u00f6tamiseks\u00bb\" src=\"\/wp-content\/uploads\/f937287e448295fbd467c283ceca316a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEsitatud kood eristub l\u00fchiduse ja mitme tegevuse samaaegse k\u00e4ivitamise suure mahuga. Esimeses parameetris meetodil builder.stream v\u00f5ite m\u00e4rgata midagi uut: loetletud t\u00fc\u00fcbi AutoOffsetReset.EARLIEST v\u00e4\u00e4rtus (olemas on ka LATEST), mille m\u00e4\u00e4rab meetod Consumed.withOffsetResetPolicy. Selle loetletud t\u00fc\u00fcbi abil saab m\u00e4\u00e4rata nihke l\u00e4htestamise strateegiat iga KStream v\u00f5i KTable jaoks, mis on prioriteediga k\u00f5rgem kui konfigureeritud l\u00e4htestamise parameeter.<\/p>\n<blockquote><p><b>GroupByKey ja GroupBy<\/b><\/p>\n<p>KStream liideses on kaks meetodit kirjegruppideks: GroupByKey ja GroupBy. M\u00f5lemad tagastavad KGroupedTable'i, mist\u00f5ttu v\u00f5ib tekkida loogiline k\u00fcsimus: milles seisneb nende erinevus ja millal kasutada \u00fchte v\u00f5i teist?<\/p>\n<p>Meetodit GroupByKey kasutatakse, kui KStreami v\u00f5tmed on juba ei ole t\u00fchjad. Veelgi enam, lipp \u201en\u00f5uab \u00fcmberjaotamist\u201d pole kunagi seadistatud.<\/p>\n<p>Meetod GroupBy eeldab, et olete v\u00f5tmed grupiseerimiseks muutnud, mist\u00f5ttu on \u00fcmberjaotamise lipp seadistatud v\u00e4\u00e4rtusele true. Meetodi GroupBy j\u00e4rel toimunud liitmine, agregatsioon jne toob automaatselt kaasa \u00fcmberjaotamise.<br \/>\nKokkuv\u00f5te: tuleks iga v\u00f5imaluse korral kasutada GroupByKey, mitte GroupBy.<\/p><\/blockquote>\n<p>\nMida teevad meetodid mapValues ja groupBy \u2014 see on selge, nii et vaatame meetodit sum() (seda v\u00f5ib leida failist src\/main\/java\/bbejeck\/model\/ShareVolume.java) (loetelu 5.3).<\/p>\n<p><img decoding=\"async\" alt=\"Raamat \u00abKafka Streams tegevuses. Rakendused ja mikroteenused reaalajas t\u00f6\u00f6tamiseks\u00bb\" src=\"\/wp-content\/uploads\/8e9a6f873594f9b5fef9a96c42353a61.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nMeetod ShareVolume.sum tagastab vahepealse aktsiate m\u00fc\u00fcgi mahu summa ning kogu arvutuste ahela tulemus on objekt KTable. N\u00fc\u00fcd m\u00f5istate, milline roll on KTable'il. Kui objekti ShareVolume andmed saabuvad, salvestatakse vastavas KTable objekti viimased kehtivad uuendused. Oluline on meeles pidada, et k\u00f5ik uuendused kajastuvad eelnevas shareVolumeKTable'is, kuid mitte k\u00f5ik edastatakse edasi.<\/p>\n<p>Seej\u00e4rel kasutame selle KTable abil agregatsiooni (m\u00fc\u00fcdud aktsiate arvu j\u00e4rgi), et saada viis ettev\u00f5tet, millel on suurim aktsiate m\u00fc\u00fcgimahu iga t\u00f6\u00f6stusharu puhul. Meie tegevus on sarnane esimese agregatsiooni tegevusele.<\/p>\n<ol>\n<li>Tehke veel \u00fcks groupBy operatsioon, et grupeerida eraldi ShareVolume objekte t\u00f6\u00f6stusharude kaupa.<\/li>\n<li>Alustage ShareVolume objektide kokkuv\u00f5tmiseks. Seekord on agregatsiooni objektiks prioriteetsete fikseeritud suurusega j\u00e4rjekord. Sellises fikseeritud suurusega j\u00e4rjekorras talletatakse ainult viis ettev\u00f5tet, kellel on k\u00f5ige rohkem m\u00fc\u00fcdud aktsiaid.<\/li>\n<li>Kuvage eelnevas punktis olevad j\u00e4rjekorrad s\u00f5nes ja tagastage viis k\u00f5ige rohkem m\u00fc\u00fcdud aktsiat t\u00f6\u00f6stusharude kaupa.<\/li>\n<li>Salvestage tulemused s\u00f5na kujul teemasse.<\/li>\n<\/ol>\n<p>\nKujutisel 5.10 on kujutatud andmeedastuse topoloogia graafikut. Nagu n\u00e4ete, on teise t\u00f6\u00f6tlemise ring piisavalt lihtne.<\/p>\n<p><img decoding=\"async\" alt=\"Raamat \u00abKafka Streams tegevuses. Rakendused ja mikroteenused reaalajas t\u00f6\u00f6tamiseks\u00bb\" src=\"\/wp-content\/uploads\/dabd1507eee267038edb7f8d76d8d8ae.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nN\u00fc\u00fcd, olles selgelt m\u00f5istnud selle teise t\u00f6\u00f6tlemise ringi struktuuri, saame tutvuda selle l\u00e4htefailiga (leiate selle failist src\/main\/java\/bbejeck\/chapter_5\/AggregationsAndReducingExample.java) (loend 5.4).<\/p>\n<p>K\u00e4esolevas initsialiseerijas on muutuja fixedQueue. See on kasutajaobjekt \u2013 adapter java.util.TreeSet jaoks, mida kasutatakse N suurima tulemuse j\u00e4lgimiseks m\u00fc\u00fcdud aktsiate arvu j\u00e4rgi.<\/p>\n<p><img decoding=\"async\" alt=\"Raamat \u00abKafka Streams tegevuses. Rakendused ja mikroteenused reaalajas t\u00f6\u00f6tamiseks\u00bb\" src=\"\/wp-content\/uploads\/488b072b0d91b81c925ca72291e69e48.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nOlete juba tutvunud groupBy ja mapValues v\u00e4ljakutsetega, seega ei peatume nende kallal (kutsume v\u00e4lja meetodi KTable.toStream, kuna meetodit KTable.print peetakse aegunuks). Kuid te ei ole veel n\u00e4inud KTable versiooni meetodist aggregate(), seega kulutame natuke aega selle arutamiseks.<\/p>\n<p>Kuidas te m\u00e4letate, eristab KTable seda, et sama v\u00f5tmega salvestusi k\u00e4sitletakse uuendustena. KTable asendab vana salvestuse uuega. Agregeerimine toimub sarnaselt: kogutakse viimaseid salvestusi sama v\u00f5tmega. Kui salvestus saabub, lisatakse see klassi FixedSizePriorityQueue eksemplari l\u00e4bi summuti (teine parameeter meetodi aggregate kutses), kuid kui sama v\u00f5tmega salvestus juba eksisteerib, siis eemaldatakse vana salvestus l\u00e4bi lahutaja (kolmas parameeter meetodi aggregate kutses).<\/p>\n<p>See t\u00e4hendab, et meie agregaat, FixedSizePriorityQueue, ei koguge k\u00f5iki v\u00e4\u00e4rtusi \u00fchte v\u00f5tmesse, vaid hoiab  N k\u00f5ige m\u00fc\u00fcdava aktsia liiki l\u00e4biva summa. Igas sisenevas kirjes on kogu m\u00fc\u00fcdud aktsiate arv. KTable annab teile teavet selle kohta, milliste ettev\u00f5tete aktsiaid praegu k\u00f5ige rohkem m\u00fc\u00fcakse, ja iga v\u00e4rskenduse libisev agregatsioon pole vajalik.<\/p>\n<p>Oleme \u00f5ppinud tegema kahte olulist asja:<\/p>\n<ul>\n<li>gruppima KTable v\u00e4\u00e4rtusi nende \u00fchiselt v\u00f5tmega;<\/li>\n<li>tegema nende grupeeritud v\u00e4\u00e4rtuste \u00fcle kasulikke operatsioone, nagu kokkuliitmine ja agregatsioon.<\/li>\n<\/ul>\n<p>\nNende operatsioonide teostamise oskus on oluline, et m\u00f5ista andmete t\u00e4hendust, mis liikuvad l\u00e4bi Kafka Streams rakenduse ning v\u00e4lja selgitada, millist teavet need endaga kaasa toovad.<\/p>\n<p>Oleme samuti kokku viinud m\u00f5ned varem selle raamatu k\u00e4igus arutlusele tulnud peamised m\u00f5isted. 4. peat\u00fckis r\u00e4\u00e4kisime, kui oluline on voogedastusrakenduse jaoks usaldusv\u00e4\u00e4rne, lokaalne seisund. Esimene n\u00e4ide sellest peat\u00fckist n\u00e4itas, miks lokaalne seisund on nii oluline \u2014 see v\u00f5imaldab j\u00e4lgida, millist teavet olete juba n\u00e4inud. Lokaalne juurdep\u00e4\u00e4s aitab v\u00e4ltida v\u00f5rgu viivitusi, mist\u00f5ttu rakendus muutub efektiivsemaks ja vigu taluvamaks.<\/p>\n<p>Kogu s\u00f5lme v\u00f5i kogumise operatsiooni teostamisel on vaja n\u00e4idata seisundipoe nime. S\u00f5lme ja kogumise operatsioonid tagastavad KTable'i eksemplari, ning KTable kasutab seisundipood, et asendada vanad tulemused uutega. Nagu n\u00e4gite, ei saadeta k\u00f5ik v\u00e4rskendused edasi toru kaudu, ja see on oluline, kuna kogumise operatsioonid on m\u00f5eldud l\u00f5ppinformatsiooni saamiseks. Kui lokaalset seisundit ei kasutata, saadab KTable edasi k\u00f5ik kogumise ja s\u00f5lmimise tulemused.<\/p>\n<p>J\u00e4rgmisena vaatame, kuidas teostada selliseid tehinguid nagu aggregeerimine konkreetse ajaintervali piires \u2014 nn aknaoperatsioone (windowing operations).<\/p>\n<h3>5.3.2. Aknaoperatsioonid<\/h3>\n<p>\nEelmises jaotises tutvusime \u201eliuguvate\u201c kokkusurve ja aggregeerimisega. Rakendus teostas pidevat m\u00fc\u00fcgimahtude kokkusurvet ning seej\u00e4rel aggregeeris viit k\u00f5ige rohkem b\u00f6rsil m\u00fc\u00fcdud aktsiat.<\/p>\n<p>M\u00f5nikord on sellised pidevad aggregeerimine ja tulemuste kokkusurve vajalikud. Teistel juhtudel tuleb operatsioone teostada ainult m\u00e4\u00e4ratud ajavahemiku jooksul. N\u00e4iteks arvutada, kui palju b\u00f6rsitehinguid on toimunud konkreetse ettev\u00f5tte aktsiatega viimase 10 minuti jooksul. V\u00f5i kui palju kasutajaid klikkis uuele reklaamb\u00e4nnerile viimase 15 minuti jooksul. Rakendus v\u00f5ib selliseid operatsioone mitmeid kordi teostada, kuid ainult m\u00e4\u00e4ratud ajavahemike (ajakenade) tulemuste jaoks.<\/p>\n<h3>B\u00f6rsiterminite arvestamine ostjap\u00f5hiselt<\/h3>\n<p>\nJ\u00e4rgnevas n\u00e4ites keskendume b\u00f6rsitehingute j\u00e4lgimisele mitme kaupleja \u2014 kas suurte organisatsioonide v\u00f5i nutikate \u00fcksikfinantseerijate \u2014 osas.<\/p>\n<p>On kaks v\u00f5imalikku p\u00f5hjust selliseks j\u00e4lgimiseks. \u00dcks neist on vajadus teada, mida turu juhid ostavad\/m\u00fc\u00fcdavad. Kui need suured m\u00e4ngijad ja kogenud investorid n\u00e4evad avanemas v\u00f5imalusi, on m\u00f5istlik j\u00e4rgida nende strateegiaid. Teine p\u00f5hjus on soov m\u00e4rgata mingeid v\u00f5imalikud ebaseaduslikke tehingute m\u00e4rke, mis kasutavad siseinfot. Selleks peate anal\u00fc\u00fcsima suurte m\u00fc\u00fcgipuhangute korrelatsiooni oluliste pressiteadete jaoks.<\/p>\n<p>Selline j\u00e4lgimine koosneb j\u00e4rgmistest etappidest:<\/p>\n<ul>\n<li>looda voog, et lugeda teemast stock-transactions;<\/li>\n<li>sisendandmete r\u00fchmitamine ostja ID ja aktsia s\u00fcmboli j\u00e4rgi. meetodi groupBy kutsumine tagastab KGroupedStream klassi eksemplari;<\/li>\n<li>KGroupedStream.windowedBy meetodi abil tagastatakse ajaliniku poolest piiratud andmevoog, mis v\u00f5imaldab akna agregatsiooni teostamist. Aknat\u00fc\u00fcbi j\u00e4rgi tagastatakse kas TimeWindowedKStream v\u00f5i SessionWindowedKStream;<\/li>\n<li>tehingute arvestamine agregatsioonitegevuse jaoks. Aken andmevoos m\u00e4\u00e4rab, kas konkreetne kirje arvestatakse;<\/li>\n<li>tulemuste salvestamine teemasse v\u00f5i nende v\u00e4ljastamine konsoolis arendamise ajal.<\/li>\n<\/ul>\n<p>\nSelle rakenduse topoloogia on lihtne, kuid oleks kasulik n\u00e4ha selle visuaalit. Vaadake joonist 5.11.<\/p>\n<p>J\u00e4rgnevalt vaatleme aknaoperatsioonide funktsionaalsust ja vastavat koodi.<\/p>\n<p><img decoding=\"async\" alt=\"Raamat \u00abKafka Streams tegevuses. Rakendused ja mikroteenused reaalajas t\u00f6\u00f6tamiseks\u00bb\" src=\"\/wp-content\/uploads\/67d9d8d8acb1370a7c7fe5cd9a8b6aa7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Aknat\u00fc\u00fcbid<\/h3>\n<p>\nKafka Streams'is on kolm aknat\u00fc\u00fcpi:<\/p>\n<ul>\n<li>seansilised;<\/li>\n<li>\u00abkuvurdavad\u00bb (tumbling);<\/li>\n<li>libisevad\/\u00abh\u00fcppavad\u00bb (sliding\/hopping).<\/li>\n<\/ul>\n<p>\nValik s\u00f5ltub \u00e4ri n\u00f5udmistest. \u201eKohati h\u00fcplevaid\u201c ja \u201ekeerlevaid\u201c aknaid piiratakse ajaliselt, samas kui sessiooni piirm\u00e4\u00e4rad on seotud kasutaja tegevustega \u2014 sessiooni (de) kestus m\u00e4\u00e4ratakse ainult selle j\u00e4rgi, kui aktiivselt kasutaja k\u00e4itub. Peaasi on meeles pidada, et k\u00f5ik aknat\u00fc\u00fcbid p\u00f5hinevad kirje kuup\u00e4eva\/kellaaja m\u00e4rkidel, mitte s\u00fcsteemi ajast.<\/p>\n<p>J\u00e4rgmisena rakendame meie topoloogia iga aknat\u00fc\u00fcbiga. T\u00e4ielik kood tuuakse esimeses n\u00e4ites, muu aknat\u00fc\u00fcpide puhul ei muutu midagi, v\u00e4lja arvatud akna operatsiooni t\u00fc\u00fcp.<\/p>\n<h3>Sessiooni aknad<\/h3>\n<p>\nSessiooni aknad erinevad oluliselt teistest aknat\u00fc\u00fcpidest. Need ei piirdu mitte niiv\u00f5rd ajaga, kuiv\u00f5rd kasutaja aktiivsusega (v\u00f5i selle tegevuse aktiivsusega, mida soovite j\u00e4lgida). Sessiooni aknad eristuvad tegevusetuse perioodide j\u00e4rgi.<\/p>\n<p>Joon 5.12 illustreerib seanssiakna m\u00f5istet. V\u00e4iksem seanss sulandub tema vasakul asuva seansiga. Paremal asuv seanss j\u00e4\u00e4b aga eraldi, kuna sellele eelneb pikk vaikuseperiood. Seanssiaken p\u00f5hineb kasutajate tegevusel, kuid kasutab kuup\u00e4eva\/kellaaja tunnuseid kirjetest, et m\u00e4\u00e4rata, millise seansiga seondub \u00fcks v\u00f5i teine kirje.<\/p>\n<p><img decoding=\"async\" alt=\"Raamat \u00abKafka Streams tegevuses. Rakendused ja mikroteenused reaalajas t\u00f6\u00f6tamiseks\u00bb\" src=\"\/wp-content\/uploads\/d39a5db7af7d6aa2194802622b2b47fd.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Seanssiakende kasutamine b\u00f6rsitehingute j\u00e4lgimiseks<\/h3>\n<p>\nKasutame seanssiaken, et koguda teavet b\u00f6rsitehingute kohta. Seanssiakna rakendus on n\u00e4idatud loendis 5.5 (mida saab leida failist src\/main\/java\/bbejeck\/chapter_5\/CountingWindowingAndKTableJoinExample.java).<\/p>\n<p><img decoding=\"async\" alt=\"Raamat \u00abKafka Streams tegevuses. Rakendused ja mikroteenused reaalajas t\u00f6\u00f6tamiseks\u00bb\" src=\"\/wp-content\/uploads\/2dcbd9a36baec0e746aad165121451b3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEnamik selle topoloogia operatsioone on teile juba tuttavad, nii et pole m\u00f5tet neid siinkohal uuesti arutada. Siiski on siin m\u00f5ned uued elemendid, mida me kohe arutame.<\/p>\n<p>Iga groupBy operatsiooni puhul tehakse tavaliselt mingi agregatsiooni operatsioon (agregatsioon, kokkuliitmine v\u00f5i loendamine). Saate teha kas kumulatiivset agregatsiooni jooksva summa alusel v\u00f5i aknaalusel agregatsiooni, kus arvestatakse kirjeid m\u00e4\u00e4ratud ajavahemiku jooksul.<\/p>\n<p>Kood, mis on esitatud loendis 5.5, arvutab sessioonide aknas toimuva tehingute arvu. Joonisel 5.13 anal\u00fc\u00fcsitakse neid toiminguid samm-sammult.<\/p>\n<p>Kasutades k\u00e4sku windowedBy(SessionWindows.with(twentySeconds).until(fifteenMinutes)), loome seansiaugu, mille inaktiivsuse intervall on 20 sekundit ja s\u00e4ilitamisinterval 15 minutit. 20-sekundiline inaktiivsuse intervall t\u00e4hendab, et rakendus h\u00f5lmab k\u00f5iki kirjeid, mis saabuvad 20 sekundi jooksul p\u00e4rast praeguse seansi l\u00f5ppu v\u00f5i algust, aktiivsesse seanssi.<\/p>\n<p><img decoding=\"async\" alt=\"Raamat \u00abKafka Streams tegevuses. Rakendused ja mikroteenused reaalajas t\u00f6\u00f6tamiseks\u00bb\" src=\"\/wp-content\/uploads\/9bd47b04698086872fd135b4c67eb938.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSeej\u00e4rel t\u00e4psustame, millist agregatsioonitegevust tuleb seansiaugus teostada \u2014 antud juhul count. Kui sisenev kirje \u00fcletab inaktiivsuse intervalli (millisel pool ka ei j\u00e4\u00e4ks ajatempli), loob rakendus uue seansi. S\u00e4ilitamisinterval t\u00e4hendab seansi hoidmist kindla aja jooksul ja v\u00f5imaldab hilinenud andmeid, mis \u00fcletavad seansi inaktiivsuse perioodi, kuid v\u00f5ivad siiski liituda. Lisaks sellele vastavad uue seansi algus ja l\u00f5pp, mis on saadud liitmise tulemusena, k\u00f5ige varasemale ja k\u00f5ige hilisemale ajatempli.<\/p>\n<p>Vaatame m\u00f5ningaid kirjeid meetodist count, et n\u00e4ha, kuidas sessioonid t\u00f6\u00f6tavad (vt tabel 5.1).<\/p>\n<p><img decoding=\"async\" alt=\"Raamat \u00abKafka Streams tegevuses. Rakendused ja mikroteenused reaalajas t\u00f6\u00f6tamiseks\u00bb\" src=\"\/wp-content\/uploads\/ec04aae466d88c2d2349474069c8d541.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKirjeid vastu v\u00f5tades otsime juba olemasolevaid sessioone sama v\u00f5tme, l\u00f5puajam\u00e4rgi all, mis on v\u00e4iksem praegusest kuup\u00e4evast\/aeg-m\u00e4rgist \u2014 inaktiivsuse intervall ja algusaeg m\u00e4rgiga suurem kui praegune kuup\u00e4ev\/aeg + inaktiivsuse intervall. Selle arvesse v\u00f5ttes sulanduvad tabelis 5.1 neli kirjet \u00fchte sessiooni j\u00e4rgmiselt.<\/p>\n<p>1. Esimesena saabub kiri 1, nii et algusaeg on sama kui l\u00f5pu aeg ja see on 00:00:00.<\/p>\n<p>2. J\u00e4rgmisena saabub kiri 2, ning otsime sessioone, mis l\u00f5ppevad mitte enne 23:59:55 ja algavad mitte hiljem kui 00:00:35. Leiame kirje 1 ja \u00fchendame sessioonid 1 ja 2. V\u00f5tame sessiooni 1 algusaja (varasema) ja sessiooni 2 l\u00f5puaja (hilisema), nii et meie uus sessioon algab 00:00:00 ja l\u00f5peb 00:00:15.<\/p>\n<p>3. Saabub kiri 3, otsime sessioone ajavahemikus 00:00:30 kuni 00:01:10 ja ei leia \u00fchtegi. Lisame teise sessiooni v\u00f5tme 123-345-654,FFBE jaoks, mis algab ja l\u00f5ppeb 00:00:50.<\/p>\n<p>4. Saabub sissekanne 4, ja me otsime seansse ajavahemikus 23:59:45 kuni 00:00:25. Seekord leitud m\u00f5lemad seansid \u2014 1 ja 2. K\u00f5ik kolm seanssi \u00fchendatakse \u00fcheks, algusajaga 00:00:00 ja l\u00f5ppaeg 00:00:15.<\/p>\n<p>Selles osas r\u00e4\u00e4gitust tasub meelde j\u00e4tta j\u00e4rgmised olulised n\u00fcansid:<\/p>\n<ul>\n<li>seansid \u2014 ei ole fikseeritud suurusega aknad. Seansi kestus m\u00e4\u00e4ratakse antud ajavahemiku jooksul toimuva aktiivsuse j\u00e4rgi;<\/li>\n<li>kuup\u00e4eva\/aegade m\u00e4rgid andmetes m\u00e4\u00e4ravad, kas s\u00fcndmus langeb olemasolevasse seanssi v\u00f5i passiivsuse perioodi.<\/li>\n<\/ul>\n<p>\nJ\u00e4rgmine, millest me r\u00e4\u00e4gime, on j\u00e4rgmine akende t\u00fc\u00fcp \u2014 \"rulluvad\" aknad.<\/p>\n<h3>\"Rulluvad\" aknad<\/h3>\n<p>\n\"Rulluvad\" (tumbling) aknad haaravad s\u00fcndmusi, mis langevad kindlasse ajavahemikku. Kujutage ette, et peate haarama k\u00f5ik b\u00f6rsitransaktsioonid mingi ettev\u00f5tte kohta iga 20 sekundi tagant, nii et kogute k\u00f5ik s\u00fcndmused selle ajavahemiku jooksul. P\u00e4rast 20-sekundilist vahemikku akna \"rullub\" ja liigub uuele 20-sekundilisele j\u00e4lgimisintervallile. Kujutis 5.14 illustreerib seda olukorda.<\/p>\n<p><img decoding=\"async\" alt=\"Raamat \u00abKafka Streams tegevuses. Rakendused ja mikroteenused reaalajas t\u00f6\u00f6tamiseks\u00bb\" src=\"\/wp-content\/uploads\/e90e560d9ddda5e2e524b7c387ad9874.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNagu n\u00e4ete, on k\u00f5ik viimase 20 sekundi jooksul toimunud s\u00fcndmused aknas. Selle ajavahemiku l\u00f5ppedes luuakse uusaken.<\/p>\n<p>Loendis 5.6 on esitatud kood, mis demonstreerib \u201eh\u00fcppavate\u201d akende kasutamist b\u00f6rsietehingute igak\u00fcmne sekundi jooksul j\u00e4\u00e4dvustamiseks (seda leiab failist src\/main\/java\/bbejeck\/chapter_5\/CountingWindowingAndKtableJoinExample.java).<\/p>\n<p><img decoding=\"async\" alt=\"Raamat \u00abKafka Streams tegevuses. Rakendused ja mikroteenused reaalajas t\u00f6\u00f6tamiseks\u00bb\" src=\"\/wp-content\/uploads\/e055bb1b288c7d500b64372fe3fbf064.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSelle v\u00e4ikese muudatuse t\u00f5ttu meetodi TimeWindows.of kutsumises saab kasutada \u201eh\u00fcppavat\u201d akent. Antud n\u00e4ites ei ole meetodi until() kutsumist, mist\u00f5ttu kasutatakse vaikimisi salvestusintervalle, mis on 24 tundi.<\/p>\n<p>L\u00f5puks on aeg liikuda viimase aknat\u00fc\u00fcbi juurde \u2014 \u201eh\u00fcppavad\u201d aknad.<\/p>\n<h3>Libisevad (\u201eh\u00fcppavad\u201d) aknad<\/h3>\n<p>\nLibisevad\/\u201eh\u00fcppavad\u201d aknad on sarnased \u201eh\u00fcppavatele\u201d, kuid v\u00e4ikese erinevusega. Libisevad aknad ei oota ajavahemiku l\u00f5ppu enne uue akna loomist hiljutiste s\u00fcndmuste t\u00f6\u00f6tlemiseks. Nad k\u00e4ivitavad uued arvutused p\u00e4rast ooteperioodi, mis on l\u00fchem kui akna kestus.<\/p>\n<p>Erinevuste illustreerimiseks \u00abveerlevate\u00bb ja \u00abh\u00fcppavate\u00bb akende vahel naaseme n\u00e4ite juurde b\u00f6rsitehingute arvestamisest. Meie eesm\u00e4rk on endiselt tehingute arvu arvestamine, kuid me ei soovi oodata kogu ajavahemikku enne arvesti uuendamist. Selle asemel uuendame arvestit l\u00fchemate ajavahemike j\u00e4rel. N\u00e4iteks arvestame tehingute arvu endiselt iga 20 sekundi j\u00e4rel, kuid uuendame arvestit iga 5 sekundi j\u00e4rel, nagu on kujutatud joonisel 5.15. Sellega saame kolme tulemuse akna, millel on kattuvad andmed.<\/p>\n<p><img decoding=\"async\" alt=\"Raamat \u00abKafka Streams tegevuses. Rakendused ja mikroteenused reaalajas t\u00f6\u00f6tamiseks\u00bb\" src=\"\/wp-content\/uploads\/415c8cd9f2b60d453a1a01c3bc99331f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nLoendis 5.7 on toodud kood liugakende m\u00e4\u00e4ramiseks (selle leiab failist src\/main\/java\/bbejeck\/chapter_5\/CountingWindowingAndKtableJoinExample.java).<\/p>\n<p><img decoding=\"async\" alt=\"Raamat \u00abKafka Streams tegevuses. Rakendused ja mikroteenused reaalajas t\u00f6\u00f6tamiseks\u00bb\" src=\"\/wp-content\/uploads\/ab2d1a64380d256d3fb084e16597417c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u00abVeerlev\u00bb aken saab muuta \u00abh\u00fcppavaks\u00bb, lisades meetodi advanceBy() kutsumise. Antud n\u00e4ites on s\u00e4ilitamise periood 15 minutit.<\/p>\n<p>Selles jaos n\u00e4gite, kuidas piirata kokkupanemise tulemusi ajavahemikega. Eriti sooviksin, et m\u00e4lestaksite sellest jaost kolme asja:<\/p>\n<ul>\n<li>sessioonide suuruse piirang ei s\u00f5ltu mitte ajavahemikust, vaid kasutajate aktiivsusest;<\/li>\n<li>\"veerevad\" aknad annavad \u00fclevaate s\u00fcndmustest m\u00e4\u00e4ratud ajavahemikus;<\/li>\n<li>\"h\u00fcppavate\" akende t\u00f6\u00f6 kestus on fikseeritud, kuid need uuendatakse sageli ja v\u00f5ivad sisaldada k\u00f5igis akendes kattuvaid kirjeid.<\/li>\n<\/ul>\n<p>\nJ\u00e4rgmises osas saame teada, kuidas muuta KTable taas KStreamiks \u00fchendamiseks.<\/p>\n<h3>5.3.3. KStreami ja KTable'i \u00fchendamine<\/h3>\n<p>\n4. peat\u00fckis arutasime kahe KStreami objekti \u00fchendamist. N\u00fc\u00fcd peame \u00f5ppima, kuidas KTable'i ja KStreami \u00fchendamine toimub. Seda v\u00f5ib olla vajalik teha j\u00e4rgmistel lihtsatel p\u00f5hjustel. KStream on kirjete voog, samas kui KTable on kirjete uuenduste voog, kuid m\u00f5nikord v\u00f5ib osutuda vajalikuks lisada kirjete voole t\u00e4iendav kontekst KTable'i uuenduste kaudu.<\/p>\n<p>V\u00f5tame andmed b\u00f6rsitehingute arvu kohta ja \u00fchendame need b\u00f6rsiuudistega vastavate t\u00f6\u00f6stusharude kohta. Siin on, mida tuleb teha, et seda olemasoleva koodi arvesse v\u00f5ttes saavutada.<\/p>\n<ol>\n<li>Muutame KTable'i, kus on andmed b\u00f6rsitehingute arvu kohta, KStream'iks, asendades seej\u00e4rel v\u00f5tme p\u00f5hitegevuse valdkonna v\u00f5tmega, mis vastab antud aktsias\u00fcmbolile.<\/li>\n<li>Loome KTable'i objekti, mis loeb andmeid b\u00f6rsiuudiste teemast. See uus KTable kategoriseeritakse t\u00f6\u00f6stusharude j\u00e4rgi.<\/li>\n<li>Seome uudiste uuendused teabe kogustega b\u00f6rsitehingute alusel t\u00f6\u00f6stusharude kohta.<\/li>\n<\/ol>\n<p>\nN\u00fc\u00fcd vaatame, kuidas ellu viia seda tegevuskava.<\/p>\n<h3>KTable'i konverteerimine KStream'iks<\/h3>\n<p>\nKTable'i konverteerimiseks KStream'iks tuleb teha j\u00e4rgmist.<\/p>\n<ol>\n<li>K\u00e4ivitage meetod KTable.toStream().<\/li>\n<li>Kasutades meetodi KStream.map kutsumist, asendage v\u00f5tta t\u00f6\u00f6stusharu nimega ja seej\u00e4rel v\u00f5tke Windowed objekti TransactionSummary eksemplar.<\/li>\n<\/ol>\n<p>\nSeome need operatsioonid ahelana j\u00e4rgmiselt (kood on saadaval failis src\/main\/java\/bbejeck\/chapter_5\/CountingWindowingAndKtableJoinExample.java) (loend 5.8).<\/p>\n<p><img decoding=\"async\" alt=\"Raamat \u00abKafka Streams tegevuses. Rakendused ja mikroteenused reaalajas t\u00f6\u00f6tamiseks\u00bb\" src=\"\/wp-content\/uploads\/0d43c2650f6e66e2816ed383da3a29c2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKuna t\u00e4idame operatsiooni KStream.map, toimub KStream'i tagastatud eksemplari p\u00f5hi\u00fclesanne automaatselt, kui seda kasutatakse \u00fchenduses.<\/p>\n<p>Oleme l\u00f5petanud konverteerimisprotsessi, n\u00fc\u00fcd peame looma KTable objekti b\u00f6rsitarvete lugemiseks.<\/p>\n<h3>KTable'i loomine b\u00f6rsitarvete jaoks<\/h3>\n<p>\n\u00d5nneks on KTable objekti loomiseks piisav vaid \u00fcks koodirida (see kood on saadaval failis src\/main\/java\/bbejeck\/chapter_5\/CountingWindowingAndKtableJoinExample.java) (loend 5.9).<\/p>\n<p><img decoding=\"async\" alt=\"Raamat \u00abKafka Streams tegevuses. Rakendused ja mikroteenused reaalajas t\u00f6\u00f6tamiseks\u00bb\" src=\"\/wp-content\/uploads\/6e83a393fdc9ab74fda4cbdddddb5213.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nOn oluline m\u00e4rkida, et Serde objekte ei pea m\u00e4\u00e4rama, kuna seadistustes kasutatakse stringiserde. Samuti t\u00e4nu ENUM'i EARLIEST kasutamisele t\u00e4idetakse tabel algsete kantidega.<\/p>\n<p>N\u00fc\u00fcd saame liikuda viimase sammu juurde \u2014 \u00fchendamine.<\/p>\n<h3>Uudiste uuenduste \u00fchendamine tehingute arvu andmetega<\/h3>\n<p>\n\u00dchenduse loomine ei sea mingeid keerukusi. Kasutame vasakut \u00fchendust, et juhul kui vastavas t\u00f6\u00f6stusharus ei ole b\u00f6rsitarbeid (vajalik kood on saadaval failis src\/main\/java\/bbejeck\/chapter_5\/CountingWindowingAndKtableJoinExample.java) (loend 5.10).<\/p>\n<p><img decoding=\"async\" alt=\"Raamat \u00abKafka Streams tegevuses. Rakendused ja mikroteenused reaalajas t\u00f6\u00f6tamiseks\u00bb\" src=\"\/wp-content\/uploads\/92ed70f98927d2f778ad14dbc2a5aa26.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSee operaator leftJoin on piisavalt lihtne. Erinevalt peat\u00fckist 4, ei kasutata Meetodi JoinWindow puhul, kuna KStream-KTable \u00fchendamise k\u00e4igus on KTable iga v\u00f5tme jaoks ainult \u00fcks kirje. See \u00fchendamine ei ole ajaliselt piiratud: kirje on KTable'is olemas v\u00f5i puudub. Peamine j\u00e4reldus: KTable objektide abil saab KStream'i rikastada harvemini uuendatavate viidatud andmetega.<\/p>\n<p>Ja n\u00fc\u00fcd vaatame t\u00f5husamat viisi KStream'i s\u00fcndmuste rikastamiseks.<\/p>\n<h3>5.3.4. GlobalKTable objektid<\/h3>\n<p>\nNagu m\u00f5istsite, on vajalik s\u00fcndmustevoolude rikastamine v\u00f5i nendele konteksti lisamine. 4. peat\u00fckis n\u00e4gite kahte KStream'i objekti \u00fchendamist ning eelnevas osas KStream'i ja KTable'i \u00fchendamist. K\u00f5igis nendes juhtumites on vajalik andmevoogude uuesti sektsioonideks jagamine, et kaardistada v\u00f5tmed uue t\u00fc\u00fcbi v\u00f5i v\u00e4\u00e4rtuse juurde. M\u00f5nikord toimub uuesti sektsioonideks jagamine selgelt, teinekord teeb Kafka Streams seda automaatselt. Uuesti sektsioonideks jagamine on vajalik, kuna v\u00f5tmed on muutunud ja kirjed peavad olema uutes sektsioonides, vastasel juhul ei ole \u00fchendamine v\u00f5imalik (sellest r\u00e4\u00e4kisime 4. peat\u00fckis, l\u00f5igus \u201eAndmete uuesti sektsioonideks jagamine\u201c alal 4.2.4).<\/p>\n<h3>Uuesti sektsioonideks jagamine on kulukas<\/h3>\n<p>\nUuesti partitsioneerimine n\u00f5uab kulutusi \u2014 lisakulusid ressursside suurendamiseks vahepealsete teemade loomisel, dubleeritud andmete s\u00e4ilitamisel veel \u00fches teemasse; see toob kaasa ka viivituse suurenemise, kuna andmeid salvestatakse ja loetakse sellest teemast. Lisaks, kui on vajalik teostada \u00fchendusi rohkem kui \u00fche aspekti v\u00f5i m\u00f5\u00f5tme osas, tuleb korraldada \u00fchendused ahelana, kuvada kirjed uute v\u00f5tmetega ja uuesti k\u00e4ivitada partitsioneerimise protsess.<\/p>\n<h3>\u00dchendus v\u00e4iksemate andmehulkadega<\/h3>\n<p>\nM\u00f5nel juhul on viidatud andmehulkade maht suhteliselt v\u00e4ike, nii et nende t\u00e4iskopeerimist on v\u00f5imalik iga s\u00f5lme kohapeal hoida. Selliste olukordade jaoks on Kafka Streams'is ette n\u00e4htud klass GlobalKTable.<\/p>\n<p>GlobalKTable'i eksemplarid on unikaalsed, kuna rakendus replitseerib k\u00f5ik andmed igas s\u00f5lmes. Kuna igas s\u00f5lmes on k\u00f5ik andmed, ei ole vaja s\u00fcndmuste voogu jagada andmeviidendi v\u00f5tme j\u00e4rgi, et see oleks k\u00f5igile osakondadele kergesti k\u00e4ttesaadav. GlobalKTable'i objektide abil on v\u00f5imalik teostada ka v\u00f5tmeta \u00fchendusi. Vaatame tagasi \u00fchele varasemale n\u00e4itele, et demonstreerida seda v\u00f5imalust.<\/p>\n<h3>KStream'i objektide \u00fchendamine GlobalKTable'i objektidega<\/h3>\n<p>\nAlamjaotises 5.3.2 tegime akna agregatsiooni b\u00f6rsitehingute p\u00f5hjal ostjate l\u00f5ikes. Selle agregatsiooni tulemused n\u00e4gid v\u00e4lja umbes j\u00e4rgmised:<\/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>\nKuigi need tulemused vastasid seatud eesm\u00e4rgile, oleks mugavam, kui kliendi nimi ja ettev\u00f5tte t\u00e4isnimi oleksid ka v\u00e4ljundis. Ostja nime ja ettev\u00f5tte nime lisamiseks saab teostada tavalisi \u00fchendusi, kuid lahtise v\u00f5tme ja uuesti jaotamise tegemine on vajalik. GlobalKTable'i abil on v\u00f5imalik selliste toimingute kulusid v\u00e4ltida.<\/p>\n<p>Kasutame selleks objekti countStream, mis on loendis 5.11 (vastav kood on saadaval failis src\/main\/java\/bbejeck\/chapter_5\/GlobalKTableExample.java), \u00fchendades selle kahe GlobalKTable objektiga.<\/p>\n<p><img decoding=\"async\" alt=\"Raamat \u00abKafka Streams tegevuses. Rakendused ja mikroteenused reaalajas t\u00f6\u00f6tamiseks\u00bb\" src=\"\/wp-content\/uploads\/fc4d91bbe062ceb94f5650224840b81e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nOleme seda juba varem arutanud, seega ei hakka kordama. T\u00e4iendavalt mainin, et toStream().map funktsiooni kood on lugemise mugavuse huvides abstrakteeritud objekti funktsiooniks, mitte sisseehitatud lambda-v\u00e4ljendiks.<\/p>\n<p>J\u00e4rgmine etapp on kahe GlobalKTable eksemplari kuulutamine (antud kood on saadaval failis src\/main\/java\/bbejeck\/chapter_5\/GlobalKTableExample.java) (loendis 5.12).<\/p>\n<p><img decoding=\"async\" alt=\"Raamat \u00abKafka Streams tegevuses. Rakendused ja mikroteenused reaalajas t\u00f6\u00f6tamiseks\u00bb\" src=\"\/wp-content\/uploads\/db3918895f174c8cfb5fc927b55f87a1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>M\u00e4rkusena: teemasid kirjeldatakse loetletud t\u00fc\u00fcpide abil.<\/p>\n<p>N\u00fc\u00fcd, kui oleme k\u00f5ik komponendid ette valmistanud, tuleb kirjutada kood \u00fchendamiseks (mida leiate failist src\/main\/java\/bbejeck\/chapter_5\/GlobalKTableExample.java) (loendis 5.13).<\/p>\n<p><img decoding=\"async\" alt=\"Raamat \u00abKafka Streams tegevuses. Rakendused ja mikroteenused reaalajas t\u00f6\u00f6tamiseks\u00bb\" src=\"\/wp-content\/uploads\/799360cc99f1920c190a61fd4685d4ff.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKuigi selles koodis on kaks \u00fchendust, on need korraldatud ahelana, kuna eraldi nende tulemusi ei kasutata. Tulemused kuvatakse kogu operatsiooni l\u00f5pus.<\/p>\n<p>Kui k\u00e4itate eeltoodud \u00fchendusoperatsiooni, saate tulemused j\u00e4rgmise kujul:<\/p>\n<pre><code class=\"plaintext\">{customer='Barney, Smith' company=\"Exxon\", transactions= 17}<\/code><\/pre>\n<p>\nSisu ei ole muutunud, kuid need tulemused n\u00e4evad n\u00fc\u00fcd arusaadavamad v\u00e4lja.<\/p>\n<p>Kui arvestada peat\u00fckki 4, olete juba n\u00e4inud mitmeid \u00fchendust\u00fc\u00fcpe tegutsemas. Need on loetletud tabelis 5.2. See tabel peegeldab \u00fchendamise v\u00f5imalusi, mis on kehtivad versioonile 1.0.0 Kafka Streams; tulevastes v\u00e4ljalasetel v\u00f5ib midagi muutuda.<\/p>\n<p><img decoding=\"async\" alt=\"Raamat \u00abKafka Streams tegevuses. Rakendused ja mikroteenused reaalajas t\u00f6\u00f6tamiseks\u00bb\" src=\"\/wp-content\/uploads\/8e4cf35c64a8431bda43a5e748de275f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKokkuv\u00f5tteks meenutan peamist: saate siduda s\u00fcndmuste vooge (KStream) ja uuenduste vooge (KTable) kohaliku olekuga. Lisaks, kui viidata isenduse suurus ei ole liiga suur, saate kasutada objekti GlobalKTable. GlobalKTable replitseerib k\u00f5ik sektsioonid iga Kafka Streams rakenduse s\u00f5lme, tagades seel\u00e4bi k\u00f5ikide andmete k\u00e4ttesaadavuse s\u00f5ltumata sellest, millisele sektsioonile key vastab.<\/p>\n<p>Edasi n\u00e4eme Kafka Streams'i v\u00f5imalust, mis v\u00f5imaldab j\u00e4lgida olekumuutusi ilma andmete tarbimiseta Kafka teemas.<\/p>\n<h3>5.3.5. K\u00fcsimiseks saadaval olek<\/h3>\n<p>\nOleme juba teinud mitu toimingut, mis h\u00f5lmavad olekuteavet, ja oleme alati tulemused konsoolile edastanud (arenduseesm\u00e4rkidel) v\u00f5i salvestanud need teemale (t\u00f6\u00f6stuslikuks kasutamiseks). Tulemuste teemasse salvestamisel tuleb kasutada Kafka tarbijat nende vaatamiseks.<\/p>\n<p>Andmete lugemist nendest teemadest v\u00f5ib pidada materialiseeritud vaadete variandiks. Meie vajaduste jaoks saame kasutada materialiseeritud vaate m\u00e4\u00e4ratlust \u201eWikipediast\u201d: \u201e\u2026andmebaasi f\u00fc\u00fcsiline objekt, mis sisaldab p\u00e4ringu t\u00e4itmise tulemusi. N\u00e4iteks v\u00f5ib see olla kaugandmete kohalik koopia, v\u00f5i ridade ja \/ v\u00f5i veergude alamhulk tabelis, v\u00f5i \u00fchendamise tulemuste alusel koostatud kokkuv\u00f5tte tabel.\u201d (https:\/\/en.wikipedia.org\/wiki\/Materialized_view)<\/p>\n<p>Kafka Streams v\u00f5imaldab ka interaktiivsete p\u00e4ringute (interactive queries) tegemist olekute salvestustele, mis annab v\u00f5imaluse nende materialiseeritud vaadete otse lugemiseks. Oluline on m\u00e4rkida, et p\u00e4ring olekute salvestusele on \u00abainult lugemise\u00bb operatsioon. See t\u00e4hendab, et te ei pea kartma, et juhuslikult muudate oleku koosk\u00f5las andmete t\u00f6\u00f6tlemisel rakenduses.<\/p>\n<p>Olekute salvestustele otse tehtavad p\u00e4ringud on v\u00e4ga olulised. Need v\u00f5imaldavad luua rakendusi \u2014 informatiivseid paneele, ilma et oleks esmalt vaja andmeid Kafka tarbijalt hankida. Samuti suurendab see rakenduse t\u00f5husust, kuna andmeid pole vaja uuesti salvestada:<\/p>\n<ul>\n<li>andmete lokaliteeduse t\u00f5ttu on neile kiire ligip\u00e4\u00e4s;<\/li>\n<li>v\u00e4listatakse andmete dubleerimine, kuna neid ei salvestata v\u00e4listesse salvestustesse.<\/li>\n<\/ul>\n<p>\nPeamine, mida soovin, et sa meeles peaksid: saate otse rakendusest teha p\u00e4ringuid olekuteavet. Selle v\u00f5imaluste \u00fcle ei saa \u00fcle hinnata. Selle asemel, et tarbida andmeid Kafka'st ja salvestada kirjeid rakenduse andmebaasi, saate teha p\u00e4ringuid olekuhoidlatele sama tulemuse saavutamiseks. Otsesed p\u00e4ringud olekuhoidlatele t\u00e4hendavad v\u00e4hem koodi (tarbijat pole) ja v\u00e4hem tarkvara (puudub vajadus andmetabeli j\u00e4rele tulemuste salvestamiseks).<\/p>\n<p>Oleme k\u00e4esolevas peat\u00fckis k\u00e4sitlenud suurt hulka teavet, seega l\u00f5petame n\u00fc\u00fcd interaktiivsete p\u00e4ringute arutelu olekuhoidlatele. Kuid \u00e4rge muretsege: peat\u00fckis 9 loome lihtsa rakenduse \u2014 infopaneeli interaktiivsete p\u00e4ringutega. Interaktiivsete p\u00e4ringute ja nende rakendustesse lisamise v\u00f5imaluste demonstreerimiseks kasutatakse seal m\u00f5ningaid selle ja eelnevate peat\u00fckkide n\u00e4iteid.<\/p>\n<h3>Kokkuv\u00f5te<\/h3>\n<p><\/p>\n<ul>\n<li>KStream objektid esindavad s\u00fcndmuste vooge, mis on sarnased andmebaasi sisestustele. KTable objektid esindavad uuenduste vooge ja need sarnanevad rohkem andmebaasi uuendustega. KTable objekti suurus ei kasva, vana teave asendatakse uuega.<\/li>\n<li>KTable objektid on vajalikud aggregatsioonioperatsioonide jaoks.<\/li>\n<li>Aknate operatsioonide abil on v\u00f5imalik jagada kogutud andmed ajavahemike kaupa.<\/li>\n<li>GlobalKTable objektide kaudu on v\u00f5imalik juurde p\u00e4\u00e4seda k\u00e4siraamatutele igas rakenduse kohas, olenemata osade jaotamisest.<\/li>\n<li>KStream, KTable ja GlobalKTable objektide omavaheline \u00fchendamine on v\u00f5imalik.<\/li>\n<\/ul>\n<p>\nSiiani oleme keskendunud Kafka Streams'i rakenduste loomisele, kasutades k\u00f5rgetasemelist DSL KStream. Kuigi k\u00f5rgetasemeline l\u00e4henemine v\u00f5imaldab luua selgeid ja l\u00fchikesi programme, toob selle kasutamine kaasa teatud kompromissi. DSL KStream'i kasutamine suurendab koodi l\u00fchidust, kuid v\u00e4hendab kontrolli taset. J\u00e4rgmisel peat\u00fckil uurime madalama taseme API t\u00f6\u00f6tlemismooduleid ja proovime muid kompromisse. Programmid saavad olema pikemad kui seni, kuid see annab meile v\u00f5imaluse luua praktiliselt igasuguseid t\u00f6\u00f6tlemismooduleid, mis v\u00f5ivad osutuda vajalikuks.<\/p>\n<p>\u2192 Raamatuga saab l\u00e4hemalt tutvuda <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/collection\/best\/product\/kafka-streams-v-deystvii-prilozheniya-i-mikroservisy-dlya-raboty-v-realnom-vremeni\">v\u00e4ljaandja veebisaidil<\/a><\/noindex><\/p>\n<p>\u2192 Habr'i kasutajatele 25% allahindlus kupongiga \u2014 <b>Kafka Streams<\/b><\/p>\n<p>\u2192 P\u00e4rast f\u00fc\u00fcsilise raamatu tasumist saadetakse elektrooniline raamat e-posti aadressile.<br \/>\n<br \/>Allikas: <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 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\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\" \/>\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\/et\/blog\/administrirovanie\/kniga-kafka-streams-v-dejstvii-prilozheniya-i-mikroservisy-dlya-raboty-v-realnom-vremeni\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\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:description\" content=\"\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\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/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\udd47Raamat \u201eKafka Streams tegevuses. Rakendused ja mikroteenused reaalajas t\u00f6\u00f6tamiseks\u201d | ProHoster","description":"Tere, Habrilased! See raamat sobib igale arendajale, kes soovib s\u00fcveneda voogude t\u00f6\u00f6tlemisse. Jaotatud programmeerimise m\u00f5istmine aitab paremini tundma \u00f5ppida Kafka ja Kafka Streams'i. Oluline oleks ka raamistik Kafka tunda, kuid see pole vajalik: ma r\u00e4\u00e4gin teile k\u00f5ik, mida peate teadma. Kogenud Kafka arendajad ja algajad saavad selle raamatu kaudu luua huvitavaid rakendusi.","canonical_url":"https:\/\/prohoster.info\/et\/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":"et_EE","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:description":"\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","og:url":"https:\/\/prohoster.info\/et\/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"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/35786","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=35786"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/35786\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=35786"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=35786"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=35786"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}