Tere, HabrĆŸiteli! See raamat sobib igasugustele arendajatele, kes soovivad mĂ”ista voogude töötlemist. Jagatud programmeerimise mĂ”istmine aitab paremini uurida Kafka ja Kafka Streams'i. Oleks hea, kui teada ka Kafka raamistikku, kuid see pole kohustuslik: ma rÀÀgin teile kĂ”ik, mis vajalik. Kogenud Kafka arendajad, nagu ka algajad, saavad tĂ€nu sellele raamatule omandada oskusi huvitavate rakenduste loomisel voogude töötlemise kaudu Kafka Streams'i raamatukoguga. Keskmise ja kĂ”rge tasemega Java-arendajad, kes on juba tuttavad selliste mĂ”istetega nagu serialiseerimine, Ă”pivad rakenduse loomise oskusi rakendama Kafka Streams'iga. Raamatu lĂ€htekood on kirjutatud Java 8-s ja kasutab oluliselt Java 8 lambda-vĂ€ljendite sĂŒntaksit, seega on kasulik osata töötada lambda-funktsioonidega (isegi kui neid rakendatakse teises programmeerimiskeeles).
LÔik. 5.3. Agregeerimine ja aknaoperatsioonid
Selles jaotises liigume edasi Kafka Streams'i kÔige lootustandvamaid osi uurima. Seni oleme uurinud jÀrgmisi aspekte Kafka Streams'ist:
- töötlemise topoloogia loomine;
- olekute kasutamine voograkendustes;
- voogandmete ĂŒhenduste tĂ€itmine;
- erinevused sĂŒndmuste voogude (KStream) ja vĂ€rskenduste voogude (KTable) vahel.
JĂ€rgmistes nĂ€idetes toome need kĂ”ik elemendid kokku. Tutvute ka aknaoperatsioonidega â veel ĂŒhe suurepĂ€rase voograkenduste funktsionaalsusega. Meie esimene nĂ€ide kĂ€sitleb lihtsat agregatsiooni.
5.3.1. Aktsiate mĂŒĂŒgimahtude agregatsioon tööstusharude kaupa
Agregatsioon ja rĂŒhmitamine on hĂ€davajalikud tööriistad voogandmetega töötamisel. Ăksikute kirje uurimine reaalajas osutub sageli ebapiisavaks. Andmetest tĂ€iendava teabe saamiseks on vajalik nende rĂŒhmitamine ja kombineerimine.
Selles nĂ€ites peate proovima pĂ€evakaubanduse kaupleja kostĂŒĂŒmi, kellel on vaja jĂ€lgida aktsiate mĂŒĂŒgimahte mitmest tööstusharust. EelkĂ”ige huvitavad teid viis ettevĂ”tet, millel on igas tööstusharus kĂ”ige suuremad aktsiate mĂŒĂŒgimahud.
Selle sarnase aggregeerimise jaoks on vajalikud jÀrgmised sammud andmete soovitud vormi tÔlkimiseks (kui rÀÀkida laiemalt).
- Loo allikas, mis pĂ”hineb teemal, mis avaldab töötlemata teavet aktsiakauplemise kohta. Peame kujundama StockTransaction objekti ShareVolume objektiks. Asi on selles, et StockTransaction objekt sisaldab mĂŒĂŒgi metaandmeid, samas kui me vajame vaid andmeid mĂŒĂŒdud aktsiate arvu kohta.
- Grupita ShareVolume andmed aktsia sĂŒmbolite kaupa. PĂ€rast sĂŒmbolite jĂ€rgi grupitamist saab need andmed kokku tĂ”mmata aktsiate mĂŒĂŒgimahu vahepealseteks summadeks. Tuleb mĂ€rkida, et meetod KStream.groupBy tagastab KGroupedStream tĂŒĂŒpi eksemplari. KTable eksemplari saamiseks saab seejĂ€rel kutsuda meetodi KGroupedStream.reduce.
Mis on KGroupedStream liides?
KStream.groupBy ja KStream.groupByKey meetodid tagastavad KGroupedStream'i eksemplari. KGroupedStream on vahepealne esitus sĂŒndmuste voos pĂ€rast gruppimist vĂ”tmete alusel. Seda ei ole mĂ”eldud otseseks töötlemiseks. 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Ă”ik uuendused edastada konveieri kaudu.
KTable.groupBy meetod tagastab sarnase KGroupedTable'i â vahepealse esitus voos, mis on uuendatud vĂ”tme alusel.
Teeme vÀikese pausi ja vaatame joonist 5.9, mis nÀitab, mida oleme saavutanud. See topoloogia peaks olema teile juba tuttav.

Vaatame nĂŒĂŒd koodi selle topoloogia kohta (leiate selle failist src/main/java/bbejeck/chapter_5/AggregationsAndReducingExample.java) (loetelu 5.2).

Esitatud kood eristub lĂŒhiduse ja mitme tegevuse samaaegse kĂ€ivitamise suure mahuga. Esimeses parameetris meetodil builder.stream vĂ”ite mĂ€rgata midagi uut: loetletud tĂŒĂŒbi AutoOffsetReset.EARLIEST vÀÀrtus (olemas on ka LATEST), mille mÀÀrab meetod Consumed.withOffsetResetPolicy. Selle loetletud tĂŒĂŒbi abil saab mÀÀrata nihke lĂ€htestamise strateegiat iga KStream vĂ”i KTable jaoks, mis on prioriteediga kĂ”rgem kui konfigureeritud lĂ€htestamise parameeter.
GroupByKey ja GroupBy
KStream liideses on kaks meetodit kirjegruppideks: GroupByKey ja GroupBy. MĂ”lemad tagastavad KGroupedTable'i, mistĂ”ttu vĂ”ib tekkida loogiline kĂŒsimus: milles seisneb nende erinevus ja millal kasutada ĂŒhte vĂ”i teist?
Meetodit GroupByKey kasutatakse, kui KStreami vĂ”tmed on juba ei ole tĂŒhjad. Veelgi enam, lipp ânĂ”uab ĂŒmberjaotamistâ pole kunagi seadistatud.
Meetod GroupBy eeldab, et olete vĂ”tmed grupiseerimiseks muutnud, mistĂ”ttu on ĂŒmberjaotamise lipp seadistatud vÀÀrtusele true. Meetodi GroupBy jĂ€rel toimunud liitmine, agregatsioon jne toob automaatselt kaasa ĂŒmberjaotamise.
KokkuvÔte: tuleks iga vÔimaluse korral kasutada GroupByKey, mitte GroupBy.
Mida teevad meetodid mapValues ja groupBy â see on selge, nii et vaatame meetodit sum() (seda vĂ”ib leida failist src/main/java/bbejeck/model/ShareVolume.java) (loetelu 5.3).

Meetod ShareVolume.sum tagastab vahepealse aktsiate mĂŒĂŒgi mahu summa ning kogu arvutuste ahela tulemus on objekt KTable. NĂŒĂŒd mĂ”istate, milline roll on KTable'il. Kui objekti ShareVolume andmed saabuvad, salvestatakse vastavas KTable objekti viimased kehtivad uuendused. Oluline on meeles pidada, et kĂ”ik uuendused kajastuvad eelnevas shareVolumeKTable'is, kuid mitte kĂ”ik edastatakse edasi.
SeejĂ€rel kasutame selle KTable abil agregatsiooni (mĂŒĂŒdud aktsiate arvu jĂ€rgi), et saada viis ettevĂ”tet, millel on suurim aktsiate mĂŒĂŒgimahu iga tööstusharu puhul. Meie tegevus on sarnane esimese agregatsiooni tegevusele.
- Tehke veel ĂŒks groupBy operatsioon, et grupeerida eraldi ShareVolume objekte tööstusharude kaupa.
- Alustage ShareVolume objektide kokkuvĂ”tmiseks. Seekord on agregatsiooni objektiks prioriteetsete fikseeritud suurusega jĂ€rjekord. Sellises fikseeritud suurusega jĂ€rjekorras talletatakse ainult viis ettevĂ”tet, kellel on kĂ”ige rohkem mĂŒĂŒdud aktsiaid.
- Kuvage eelnevas punktis olevad jĂ€rjekorrad sĂ”nes ja tagastage viis kĂ”ige rohkem mĂŒĂŒdud aktsiat tööstusharude kaupa.
- Salvestage tulemused sÔna kujul teemasse.
Kujutisel 5.10 on kujutatud andmeedastuse topoloogia graafikut. Nagu nÀete, on teise töötlemise ring piisavalt lihtne.

NĂŒĂŒd, olles selgelt mĂ”istnud selle teise töötlemise ringi struktuuri, saame tutvuda selle lĂ€htefailiga (leiate selle failist src/main/java/bbejeck/chapter_5/AggregationsAndReducingExample.java) (loend 5.4).
KĂ€esolevas initsialiseerijas on muutuja fixedQueue. See on kasutajaobjekt â adapter java.util.TreeSet jaoks, mida kasutatakse N suurima tulemuse jĂ€lgimiseks mĂŒĂŒdud aktsiate arvu jĂ€rgi.

Olete juba tutvunud groupBy ja mapValues vÀljakutsetega, seega ei peatume nende kallal (kutsume vÀlja meetodi KTable.toStream, kuna meetodit KTable.print peetakse aegunuks). Kuid te ei ole veel nÀinud KTable versiooni meetodist aggregate(), seega kulutame natuke aega selle arutamiseks.
Kuidas te mÀletate, eristab KTable seda, et sama vÔtmega salvestusi kÀsitletakse uuendustena. KTable asendab vana salvestuse uuega. Agregeerimine toimub sarnaselt: kogutakse viimaseid salvestusi sama vÔtmega. Kui salvestus saabub, lisatakse see klassi FixedSizePriorityQueue eksemplari lÀbi summuti (teine parameeter meetodi aggregate kutses), kuid kui sama vÔtmega salvestus juba eksisteerib, siis eemaldatakse vana salvestus lÀbi lahutaja (kolmas parameeter meetodi aggregate kutses).
See tĂ€hendab, et meie agregaat, FixedSizePriorityQueue, ei koguge kĂ”iki vÀÀrtusi ĂŒhte vĂ”tmesse, vaid hoiab N kĂ”ige mĂŒĂŒdava aktsia liiki lĂ€biva summa. Igas sisenevas kirjes on kogu mĂŒĂŒdud aktsiate arv. KTable annab teile teavet selle kohta, milliste ettevĂ”tete aktsiaid praegu kĂ”ige rohkem mĂŒĂŒakse, ja iga vĂ€rskenduse libisev agregatsioon pole vajalik.
Oleme Ôppinud tegema kahte olulist asja:
- gruppima KTable vÀÀrtusi nende ĂŒhiselt vĂ”tmega;
- tegema nende grupeeritud vÀÀrtuste ĂŒle kasulikke operatsioone, nagu kokkuliitmine ja agregatsioon.
Nende operatsioonide teostamise oskus on oluline, et mÔista andmete tÀhendust, mis liikuvad lÀbi Kafka Streams rakenduse ning vÀlja selgitada, millist teavet need endaga kaasa toovad.
Oleme samuti kokku viinud mĂ”ned varem selle raamatu kĂ€igus arutlusele tulnud peamised mĂ”isted. 4. peatĂŒkis rÀÀkisime, kui oluline on voogedastusrakenduse jaoks usaldusvÀÀrne, lokaalne seisund. Esimene nĂ€ide sellest peatĂŒkist nĂ€itas, miks lokaalne seisund on nii oluline â see vĂ”imaldab jĂ€lgida, millist teavet olete juba nĂ€inud. Lokaalne juurdepÀÀs aitab vĂ€ltida vĂ”rgu viivitusi, mistĂ”ttu rakendus muutub efektiivsemaks ja vigu taluvamaks.
Kogu sÔlme vÔi kogumise operatsiooni teostamisel on vaja nÀidata seisundipoe nime. SÔlme ja kogumise operatsioonid tagastavad KTable'i eksemplari, ning KTable kasutab seisundipood, et asendada vanad tulemused uutega. Nagu nÀgite, ei saadeta kÔik vÀrskendused edasi toru kaudu, ja see on oluline, kuna kogumise operatsioonid on mÔeldud lÔppinformatsiooni saamiseks. Kui lokaalset seisundit ei kasutata, saadab KTable edasi kÔik kogumise ja sÔlmimise tulemused.
JĂ€rgmisena vaatame, kuidas teostada selliseid tehinguid nagu aggregeerimine konkreetse ajaintervali piires â nn aknaoperatsioone (windowing operations).
5.3.2. Aknaoperatsioonid
Eelmises jaotises tutvusime âliuguvateâ kokkusurve ja aggregeerimisega. Rakendus teostas pidevat mĂŒĂŒgimahtude kokkusurvet ning seejĂ€rel aggregeeris viit kĂ”ige rohkem börsil mĂŒĂŒdud aktsiat.
MÔnikord on sellised pidevad aggregeerimine ja tulemuste kokkusurve vajalikud. Teistel juhtudel tuleb operatsioone teostada ainult mÀÀratud ajavahemiku jooksul. NÀiteks arvutada, kui palju börsitehinguid on toimunud konkreetse ettevÔtte aktsiatega viimase 10 minuti jooksul. VÔi kui palju kasutajaid klikkis uuele reklaambÀnnerile viimase 15 minuti jooksul. Rakendus vÔib selliseid operatsioone mitmeid kordi teostada, kuid ainult mÀÀratud ajavahemike (ajakenade) tulemuste jaoks.
Börsiterminite arvestamine ostjapÔhiselt
JĂ€rgnevas nĂ€ites keskendume börsitehingute jĂ€lgimisele mitme kaupleja â kas suurte organisatsioonide vĂ”i nutikate ĂŒksikfinantseerijate â osas.
On kaks vĂ”imalikku pĂ”hjust selliseks jĂ€lgimiseks. Ăks neist on vajadus teada, mida turu juhid ostavad/mĂŒĂŒdavad. Kui need suured mĂ€ngijad ja kogenud investorid nĂ€evad avanemas vĂ”imalusi, on mĂ”istlik jĂ€rgida nende strateegiaid. Teine pĂ”hjus on soov mĂ€rgata mingeid vĂ”imalikud ebaseaduslikke tehingute mĂ€rke, mis kasutavad siseinfot. Selleks peate analĂŒĂŒsima suurte mĂŒĂŒgipuhangute korrelatsiooni oluliste pressiteadete jaoks.
Selline jÀlgimine koosneb jÀrgmistest etappidest:
- looda voog, et lugeda teemast stock-transactions;
- sisendandmete rĂŒhmitamine ostja ID ja aktsia sĂŒmboli jĂ€rgi. meetodi groupBy kutsumine tagastab KGroupedStream klassi eksemplari;
- KGroupedStream.windowedBy meetodi abil tagastatakse ajaliniku poolest piiratud andmevoog, mis vĂ”imaldab akna agregatsiooni teostamist. AknatĂŒĂŒbi jĂ€rgi tagastatakse kas TimeWindowedKStream vĂ”i SessionWindowedKStream;
- tehingute arvestamine agregatsioonitegevuse jaoks. Aken andmevoos mÀÀrab, kas konkreetne kirje arvestatakse;
- tulemuste salvestamine teemasse vÔi nende vÀljastamine konsoolis arendamise ajal.
Selle rakenduse topoloogia on lihtne, kuid oleks kasulik nÀha selle visuaalit. Vaadake joonist 5.11.
JĂ€rgnevalt vaatleme aknaoperatsioonide funktsionaalsust ja vastavat koodi.

AknatĂŒĂŒbid
Kafka Streams'is on kolm aknatĂŒĂŒpi:
- seansilised;
- «kuvurdavad» (tumbling);
- libisevad/«hĂŒppavad» (sliding/hopping).
Valik sĂ”ltub Ă€ri nĂ”udmistest. âKohati hĂŒplevaidâ ja âkeerlevaidâ aknaid piiratakse ajaliselt, samas kui sessiooni piirmÀÀrad on seotud kasutaja tegevustega â sessiooni (de) kestus mÀÀratakse ainult selle jĂ€rgi, kui aktiivselt kasutaja kĂ€itub. Peaasi on meeles pidada, et kĂ”ik aknatĂŒĂŒbid pĂ”hinevad kirje kuupĂ€eva/kellaaja mĂ€rkidel, mitte sĂŒsteemi ajast.
JĂ€rgmisena rakendame meie topoloogia iga aknatĂŒĂŒbiga. TĂ€ielik kood tuuakse esimeses nĂ€ites, muu aknatĂŒĂŒpide puhul ei muutu midagi, vĂ€lja arvatud akna operatsiooni tĂŒĂŒp.
Sessiooni aknad
Sessiooni aknad erinevad oluliselt teistest aknatĂŒĂŒpidest. Need ei piirdu mitte niivĂ”rd ajaga, kuivĂ”rd kasutaja aktiivsusega (vĂ”i selle tegevuse aktiivsusega, mida soovite jĂ€lgida). Sessiooni aknad eristuvad tegevusetuse perioodide jĂ€rgi.
Joon 5.12 illustreerib seanssiakna mĂ”istet. VĂ€iksem seanss sulandub tema vasakul asuva seansiga. Paremal asuv seanss jÀÀb aga eraldi, kuna sellele eelneb pikk vaikuseperiood. Seanssiaken pĂ”hineb kasutajate tegevusel, kuid kasutab kuupĂ€eva/kellaaja tunnuseid kirjetest, et mÀÀrata, millise seansiga seondub ĂŒks vĂ”i teine kirje.

Seanssiakende kasutamine börsitehingute jÀlgimiseks
Kasutame seanssiaken, et koguda teavet börsitehingute kohta. Seanssiakna rakendus on nÀidatud loendis 5.5 (mida saab leida failist src/main/java/bbejeck/chapter_5/CountingWindowingAndKTableJoinExample.java).

Enamik selle topoloogia operatsioone on teile juba tuttavad, nii et pole mÔtet neid siinkohal uuesti arutada. Siiski on siin mÔned uued elemendid, mida me kohe arutame.
Iga groupBy operatsiooni puhul tehakse tavaliselt mingi agregatsiooni operatsioon (agregatsioon, kokkuliitmine vÔi loendamine). Saate teha kas kumulatiivset agregatsiooni jooksva summa alusel vÔi aknaalusel agregatsiooni, kus arvestatakse kirjeid mÀÀratud ajavahemiku jooksul.
Kood, mis on esitatud loendis 5.5, arvutab sessioonide aknas toimuva tehingute arvu. Joonisel 5.13 analĂŒĂŒsitakse neid toiminguid samm-sammult.
Kasutades kÀsku windowedBy(SessionWindows.with(twentySeconds).until(fifteenMinutes)), loome seansiaugu, mille inaktiivsuse intervall on 20 sekundit ja sÀilitamisinterval 15 minutit. 20-sekundiline inaktiivsuse intervall tÀhendab, et rakendus hÔlmab kÔiki kirjeid, mis saabuvad 20 sekundi jooksul pÀrast praeguse seansi lÔppu vÔi algust, aktiivsesse seanssi.

SeejĂ€rel tĂ€psustame, millist agregatsioonitegevust tuleb seansiaugus teostada â antud juhul count. Kui sisenev kirje ĂŒletab inaktiivsuse intervalli (millisel pool ka ei jÀÀks ajatempli), loob rakendus uue seansi. SĂ€ilitamisinterval tĂ€hendab seansi hoidmist kindla aja jooksul ja vĂ”imaldab hilinenud andmeid, mis ĂŒletavad seansi inaktiivsuse perioodi, kuid vĂ”ivad siiski liituda. Lisaks sellele vastavad uue seansi algus ja lĂ”pp, mis on saadud liitmise tulemusena, kĂ”ige varasemale ja kĂ”ige hilisemale ajatempli.
Vaatame mÔningaid kirjeid meetodist count, et nÀha, kuidas sessioonid töötavad (vt tabel 5.1).

Kirjeid vastu vĂ”tades otsime juba olemasolevaid sessioone sama vĂ”tme, lĂ”puajamĂ€rgi all, mis on vĂ€iksem praegusest kuupĂ€evast/aeg-mĂ€rgist â inaktiivsuse intervall ja algusaeg mĂ€rgiga suurem kui praegune kuupĂ€ev/aeg + inaktiivsuse intervall. Selle arvesse vĂ”ttes sulanduvad tabelis 5.1 neli kirjet ĂŒhte sessiooni jĂ€rgmiselt.
1. Esimesena saabub kiri 1, nii et algusaeg on sama kui lÔpu aeg ja see on 00:00:00.
2. JĂ€rgmisena saabub kiri 2, ning otsime sessioone, mis lĂ”ppevad mitte enne 23:59:55 ja algavad mitte hiljem kui 00:00:35. Leiame kirje 1 ja ĂŒhendame sessioonid 1 ja 2. VĂ”tame sessiooni 1 algusaja (varasema) ja sessiooni 2 lĂ”puaja (hilisema), nii et meie uus sessioon algab 00:00:00 ja lĂ”peb 00:00:15.
3. Saabub kiri 3, otsime sessioone ajavahemikus 00:00:30 kuni 00:01:10 ja ei leia ĂŒhtegi. Lisame teise sessiooni vĂ”tme 123-345-654,FFBE jaoks, mis algab ja lĂ”ppeb 00:00:50.
4. Saabub sissekanne 4, ja me otsime seansse ajavahemikus 23:59:45 kuni 00:00:25. Seekord leitud mĂ”lemad seansid â 1 ja 2. KĂ”ik kolm seanssi ĂŒhendatakse ĂŒheks, algusajaga 00:00:00 ja lĂ”ppaeg 00:00:15.
Selles osas rÀÀgitust tasub meelde jĂ€tta jĂ€rgmised olulised nĂŒansid:
- seansid â ei ole fikseeritud suurusega aknad. Seansi kestus mÀÀratakse antud ajavahemiku jooksul toimuva aktiivsuse jĂ€rgi;
- kuupĂ€eva/aegade mĂ€rgid andmetes mÀÀravad, kas sĂŒndmus langeb olemasolevasse seanssi vĂ”i passiivsuse perioodi.
JĂ€rgmine, millest me rÀÀgime, on jĂ€rgmine akende tĂŒĂŒp â "rulluvad" aknad.
"Rulluvad" aknad
"Rulluvad" (tumbling) aknad haaravad sĂŒndmusi, mis langevad kindlasse ajavahemikku. Kujutage ette, et peate haarama kĂ”ik börsitransaktsioonid mingi ettevĂ”tte kohta iga 20 sekundi tagant, nii et kogute kĂ”ik sĂŒndmused selle ajavahemiku jooksul. PĂ€rast 20-sekundilist vahemikku akna "rullub" ja liigub uuele 20-sekundilisele jĂ€lgimisintervallile. Kujutis 5.14 illustreerib seda olukorda.

Nagu nĂ€ete, on kĂ”ik viimase 20 sekundi jooksul toimunud sĂŒndmused aknas. Selle ajavahemiku lĂ”ppedes luuakse uusaken.
Loendis 5.6 on esitatud kood, mis demonstreerib âhĂŒppavateâ akende kasutamist börsietehingute igakĂŒmne sekundi jooksul jÀÀdvustamiseks (seda leiab failist src/main/java/bbejeck/chapter_5/CountingWindowingAndKtableJoinExample.java).

Selle vĂ€ikese muudatuse tĂ”ttu meetodi TimeWindows.of kutsumises saab kasutada âhĂŒppavatâ akent. Antud nĂ€ites ei ole meetodi until() kutsumist, mistĂ”ttu kasutatakse vaikimisi salvestusintervalle, mis on 24 tundi.
LĂ”puks on aeg liikuda viimase aknatĂŒĂŒbi juurde â âhĂŒppavadâ aknad.
Libisevad (âhĂŒppavadâ) aknad
Libisevad/âhĂŒppavadâ aknad on sarnased âhĂŒppavateleâ, kuid vĂ€ikese erinevusega. Libisevad aknad ei oota ajavahemiku lĂ”ppu enne uue akna loomist hiljutiste sĂŒndmuste töötlemiseks. Nad kĂ€ivitavad uued arvutused pĂ€rast ooteperioodi, mis on lĂŒhem kui akna kestus.
Erinevuste illustreerimiseks «veerlevate» ja «hĂŒppavate» akende vahel naaseme nĂ€ite juurde börsitehingute arvestamisest. Meie eesmĂ€rk on endiselt tehingute arvu arvestamine, kuid me ei soovi oodata kogu ajavahemikku enne arvesti uuendamist. Selle asemel uuendame arvestit lĂŒhemate ajavahemike jĂ€rel. NĂ€iteks arvestame tehingute arvu endiselt iga 20 sekundi jĂ€rel, kuid uuendame arvestit iga 5 sekundi jĂ€rel, nagu on kujutatud joonisel 5.15. Sellega saame kolme tulemuse akna, millel on kattuvad andmed.

Loendis 5.7 on toodud kood liugakende mÀÀramiseks (selle leiab failist src/main/java/bbejeck/chapter_5/CountingWindowingAndKtableJoinExample.java).

«Veerlev» aken saab muuta «hĂŒppavaks», lisades meetodi advanceBy() kutsumise. Antud nĂ€ites on sĂ€ilitamise periood 15 minutit.
Selles jaos nÀgite, kuidas piirata kokkupanemise tulemusi ajavahemikega. Eriti sooviksin, et mÀlestaksite sellest jaost kolme asja:
- sessioonide suuruse piirang ei sÔltu mitte ajavahemikust, vaid kasutajate aktiivsusest;
- "veerevad" aknad annavad ĂŒlevaate sĂŒndmustest mÀÀratud ajavahemikus;
- "hĂŒppavate" akende töö kestus on fikseeritud, kuid need uuendatakse sageli ja vĂ”ivad sisaldada kĂ”igis akendes kattuvaid kirjeid.
JĂ€rgmises osas saame teada, kuidas muuta KTable taas KStreamiks ĂŒhendamiseks.
5.3.3. KStreami ja KTable'i ĂŒhendamine
4. peatĂŒkis arutasime kahe KStreami objekti ĂŒhendamist. NĂŒĂŒd peame Ă”ppima, kuidas KTable'i ja KStreami ĂŒhendamine toimub. Seda vĂ”ib olla vajalik teha jĂ€rgmistel lihtsatel pĂ”hjustel. KStream on kirjete voog, samas kui KTable on kirjete uuenduste voog, kuid mĂ”nikord vĂ”ib osutuda vajalikuks lisada kirjete voole tĂ€iendav kontekst KTable'i uuenduste kaudu.
VĂ”tame andmed börsitehingute arvu kohta ja ĂŒhendame need börsiuudistega vastavate tööstusharude kohta. Siin on, mida tuleb teha, et seda olemasoleva koodi arvesse vĂ”ttes saavutada.
- Muutame KTable'i, kus on andmed börsitehingute arvu kohta, KStream'iks, asendades seejĂ€rel vĂ”tme pĂ”hitegevuse valdkonna vĂ”tmega, mis vastab antud aktsiasĂŒmbolile.
- Loome KTable'i objekti, mis loeb andmeid börsiuudiste teemast. See uus KTable kategoriseeritakse tööstusharude jÀrgi.
- Seome uudiste uuendused teabe kogustega börsitehingute alusel tööstusharude kohta.
NĂŒĂŒd vaatame, kuidas ellu viia seda tegevuskava.
KTable'i konverteerimine KStream'iks
KTable'i konverteerimiseks KStream'iks tuleb teha jÀrgmist.
- KĂ€ivitage meetod KTable.toStream().
- Kasutades meetodi KStream.map kutsumist, asendage vÔtta tööstusharu nimega ja seejÀrel vÔtke Windowed objekti TransactionSummary eksemplar.
Seome need operatsioonid ahelana jÀrgmiselt (kood on saadaval failis src/main/java/bbejeck/chapter_5/CountingWindowingAndKtableJoinExample.java) (loend 5.8).

Kuna tĂ€idame operatsiooni KStream.map, toimub KStream'i tagastatud eksemplari pĂ”hiĂŒlesanne automaatselt, kui seda kasutatakse ĂŒhenduses.
Oleme lĂ”petanud konverteerimisprotsessi, nĂŒĂŒd peame looma KTable objekti börsitarvete lugemiseks.
KTable'i loomine börsitarvete jaoks
Ănneks on KTable objekti loomiseks piisav vaid ĂŒks koodirida (see kood on saadaval failis src/main/java/bbejeck/chapter_5/CountingWindowingAndKtableJoinExample.java) (loend 5.9).

On oluline mÀrkida, et Serde objekte ei pea mÀÀrama, kuna seadistustes kasutatakse stringiserde. Samuti tÀnu ENUM'i EARLIEST kasutamisele tÀidetakse tabel algsete kantidega.
NĂŒĂŒd saame liikuda viimase sammu juurde â ĂŒhendamine.
Uudiste uuenduste ĂŒhendamine tehingute arvu andmetega
Ăhenduse loomine ei sea mingeid keerukusi. Kasutame vasakut ĂŒhendust, et juhul kui vastavas tööstusharus ei ole börsitarbeid (vajalik kood on saadaval failis src/main/java/bbejeck/chapter_5/CountingWindowingAndKtableJoinExample.java) (loend 5.10).

See operaator leftJoin on piisavalt lihtne. Erinevalt peatĂŒkist 4, ei kasutata Meetodi JoinWindow puhul, kuna KStream-KTable ĂŒhendamise kĂ€igus on KTable iga vĂ”tme jaoks ainult ĂŒks kirje. See ĂŒhendamine ei ole ajaliselt piiratud: kirje on KTable'is olemas vĂ”i puudub. Peamine jĂ€reldus: KTable objektide abil saab KStream'i rikastada harvemini uuendatavate viidatud andmetega.
Ja nĂŒĂŒd vaatame tĂ”husamat viisi KStream'i sĂŒndmuste rikastamiseks.
5.3.4. GlobalKTable objektid
Nagu mĂ”istsite, on vajalik sĂŒndmustevoolude rikastamine vĂ”i nendele konteksti lisamine. 4. peatĂŒkis nĂ€gite kahte KStream'i objekti ĂŒhendamist ning eelnevas osas KStream'i ja KTable'i ĂŒhendamist. KĂ”igis nendes juhtumites on vajalik andmevoogude uuesti sektsioonideks jagamine, et kaardistada vĂ”tmed uue tĂŒĂŒbi vĂ”i vÀÀrtuse juurde. MĂ”nikord toimub uuesti sektsioonideks jagamine selgelt, teinekord teeb Kafka Streams seda automaatselt. Uuesti sektsioonideks jagamine on vajalik, kuna vĂ”tmed on muutunud ja kirjed peavad olema uutes sektsioonides, vastasel juhul ei ole ĂŒhendamine vĂ”imalik (sellest rÀÀkisime 4. peatĂŒkis, lĂ”igus âAndmete uuesti sektsioonideks jagamineâ alal 4.2.4).
Uuesti sektsioonideks jagamine on kulukas
Uuesti partitsioneerimine nĂ”uab kulutusi â lisakulusid ressursside suurendamiseks vahepealsete teemade loomisel, dubleeritud andmete sĂ€ilitamisel veel ĂŒhes teemasse; see toob kaasa ka viivituse suurenemise, kuna andmeid salvestatakse ja loetakse sellest teemast. Lisaks, kui on vajalik teostada ĂŒhendusi rohkem kui ĂŒhe aspekti vĂ”i mÔÔtme osas, tuleb korraldada ĂŒhendused ahelana, kuvada kirjed uute vĂ”tmetega ja uuesti kĂ€ivitada partitsioneerimise protsess.
Ăhendus vĂ€iksemate andmehulkadega
MÔnel juhul on viidatud andmehulkade maht suhteliselt vÀike, nii et nende tÀiskopeerimist on vÔimalik iga sÔlme kohapeal hoida. Selliste olukordade jaoks on Kafka Streams'is ette nÀhtud klass GlobalKTable.
GlobalKTable'i eksemplarid on unikaalsed, kuna rakendus replitseerib kĂ”ik andmed igas sĂ”lmes. Kuna igas sĂ”lmes on kĂ”ik andmed, ei ole vaja sĂŒndmuste voogu jagada andmeviidendi vĂ”tme jĂ€rgi, et see oleks kĂ”igile osakondadele kergesti kĂ€ttesaadav. GlobalKTable'i objektide abil on vĂ”imalik teostada ka vĂ”tmeta ĂŒhendusi. Vaatame tagasi ĂŒhele varasemale nĂ€itele, et demonstreerida seda vĂ”imalust.
KStream'i objektide ĂŒhendamine GlobalKTable'i objektidega
Alamjaotises 5.3.2 tegime akna agregatsiooni börsitehingute pÔhjal ostjate lÔikes. Selle agregatsiooni tulemused nÀgid vÀlja umbes jÀrgmised:
{customerId='074-09-3705', stockTicker='GUTM'}, 17
{customerId='037-34-5184', stockTicker='CORK'}, 16Kuigi need tulemused vastasid seatud eesmĂ€rgile, oleks mugavam, kui kliendi nimi ja ettevĂ”tte tĂ€isnimi oleksid ka vĂ€ljundis. Ostja nime ja ettevĂ”tte nime lisamiseks saab teostada tavalisi ĂŒhendusi, kuid lahtise vĂ”tme ja uuesti jaotamise tegemine on vajalik. GlobalKTable'i abil on vĂ”imalik selliste toimingute kulusid vĂ€ltida.
Kasutame selleks objekti countStream, mis on loendis 5.11 (vastav kood on saadaval failis src/main/java/bbejeck/chapter_5/GlobalKTableExample.java), ĂŒhendades selle kahe GlobalKTable objektiga.

Oleme seda juba varem arutanud, seega ei hakka kordama. TÀiendavalt mainin, et toStream().map funktsiooni kood on lugemise mugavuse huvides abstrakteeritud objekti funktsiooniks, mitte sisseehitatud lambda-vÀljendiks.
JĂ€rgmine etapp on kahe GlobalKTable eksemplari kuulutamine (antud kood on saadaval failis src/main/java/bbejeck/chapter_5/GlobalKTableExample.java) (loendis 5.12).

MĂ€rkusena: teemasid kirjeldatakse loetletud tĂŒĂŒpide abil.
NĂŒĂŒd, kui oleme kĂ”ik komponendid ette valmistanud, tuleb kirjutada kood ĂŒhendamiseks (mida leiate failist src/main/java/bbejeck/chapter_5/GlobalKTableExample.java) (loendis 5.13).

Kuigi selles koodis on kaks ĂŒhendust, on need korraldatud ahelana, kuna eraldi nende tulemusi ei kasutata. Tulemused kuvatakse kogu operatsiooni lĂ”pus.
Kui kĂ€itate eeltoodud ĂŒhendusoperatsiooni, saate tulemused jĂ€rgmise kujul:
{customer='Barney, Smith' company="Exxon", transactions= 17}Sisu ei ole muutunud, kuid need tulemused nĂ€evad nĂŒĂŒd arusaadavamad vĂ€lja.
Kui arvestada peatĂŒkki 4, olete juba nĂ€inud mitmeid ĂŒhendustĂŒĂŒpe tegutsemas. Need on loetletud tabelis 5.2. See tabel peegeldab ĂŒhendamise vĂ”imalusi, mis on kehtivad versioonile 1.0.0 Kafka Streams; tulevastes vĂ€ljalasetel vĂ”ib midagi muutuda.

KokkuvĂ”tteks meenutan peamist: saate siduda sĂŒndmuste vooge (KStream) ja uuenduste vooge (KTable) kohaliku olekuga. Lisaks, kui viidata isenduse suurus ei ole liiga suur, saate kasutada objekti GlobalKTable. GlobalKTable replitseerib kĂ”ik sektsioonid iga Kafka Streams rakenduse sĂ”lme, tagades seelĂ€bi kĂ”ikide andmete kĂ€ttesaadavuse sĂ”ltumata sellest, millisele sektsioonile key vastab.
Edasi nÀeme Kafka Streams'i vÔimalust, mis vÔimaldab jÀlgida olekumuutusi ilma andmete tarbimiseta Kafka teemas.
5.3.5. KĂŒsimiseks saadaval olek
Oleme juba teinud mitu toimingut, mis hÔlmavad olekuteavet, ja oleme alati tulemused konsoolile edastanud (arenduseesmÀrkidel) vÔi salvestanud need teemale (tööstuslikuks kasutamiseks). Tulemuste teemasse salvestamisel tuleb kasutada Kafka tarbijat nende vaatamiseks.
Andmete lugemist nendest teemadest vĂ”ib pidada materialiseeritud vaadete variandiks. Meie vajaduste jaoks saame kasutada materialiseeritud vaate mÀÀratlust âWikipediastâ: ââŠandmebaasi fĂŒĂŒsiline objekt, mis sisaldab pĂ€ringu tĂ€itmise tulemusi. NĂ€iteks vĂ”ib see olla kaugandmete kohalik koopia, vĂ”i ridade ja / vĂ”i veergude alamhulk tabelis, vĂ”i ĂŒhendamise tulemuste alusel koostatud kokkuvĂ”tte tabel.â (https://en.wikipedia.org/wiki/Materialized_view)
Kafka Streams vÔimaldab ka interaktiivsete pÀringute (interactive queries) tegemist olekute salvestustele, mis annab vÔimaluse nende materialiseeritud vaadete otse lugemiseks. Oluline on mÀrkida, et pÀring olekute salvestusele on «ainult lugemise» operatsioon. See tÀhendab, et te ei pea kartma, et juhuslikult muudate oleku kooskÔlas andmete töötlemisel rakenduses.
Olekute salvestustele otse tehtavad pĂ€ringud on vĂ€ga olulised. Need vĂ”imaldavad luua rakendusi â informatiivseid paneele, ilma et oleks esmalt vaja andmeid Kafka tarbijalt hankida. Samuti suurendab see rakenduse tĂ”husust, kuna andmeid pole vaja uuesti salvestada:
- andmete lokaliteeduse tÔttu on neile kiire ligipÀÀs;
- vÀlistatakse andmete dubleerimine, kuna neid ei salvestata vÀlistesse salvestustesse.
Peamine, mida soovin, et sa meeles peaksid: saate otse rakendusest teha pĂ€ringuid olekuteavet. Selle vĂ”imaluste ĂŒle ei saa ĂŒle hinnata. Selle asemel, et tarbida andmeid Kafka'st ja salvestada kirjeid rakenduse andmebaasi, saate teha pĂ€ringuid olekuhoidlatele sama tulemuse saavutamiseks. Otsesed pĂ€ringud olekuhoidlatele tĂ€hendavad vĂ€hem koodi (tarbijat pole) ja vĂ€hem tarkvara (puudub vajadus andmetabeli jĂ€rele tulemuste salvestamiseks).
Oleme kĂ€esolevas peatĂŒkis kĂ€sitlenud suurt hulka teavet, seega lĂ”petame nĂŒĂŒd interaktiivsete pĂ€ringute arutelu olekuhoidlatele. Kuid Ă€rge muretsege: peatĂŒkis 9 loome lihtsa rakenduse â infopaneeli interaktiivsete pĂ€ringutega. Interaktiivsete pĂ€ringute ja nende rakendustesse lisamise vĂ”imaluste demonstreerimiseks kasutatakse seal mĂ”ningaid selle ja eelnevate peatĂŒkkide nĂ€iteid.
KokkuvÔte
- KStream objektid esindavad sĂŒndmuste 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.
- KTable objektid on vajalikud aggregatsioonioperatsioonide jaoks.
- Aknate operatsioonide abil on vÔimalik jagada kogutud andmed ajavahemike kaupa.
- GlobalKTable objektide kaudu on vÔimalik juurde pÀÀseda kÀsiraamatutele igas rakenduse kohas, olenemata osade jaotamisest.
- KStream, KTable ja GlobalKTable objektide omavaheline ĂŒhendamine on vĂ”imalik.
Siiani oleme keskendunud Kafka Streams'i rakenduste loomisele, kasutades kĂ”rgetasemelist DSL KStream. Kuigi kĂ”rgetasemeline lĂ€henemine vĂ”imaldab luua selgeid ja lĂŒhikesi programme, toob selle kasutamine kaasa teatud kompromissi. DSL KStream'i kasutamine suurendab koodi lĂŒhidust, kuid vĂ€hendab kontrolli taset. JĂ€rgmisel peatĂŒkil uurime madalama taseme API töötlemismooduleid ja proovime muid kompromisse. Programmid saavad olema pikemad kui seni, kuid see annab meile vĂ”imaluse luua praktiliselt igasuguseid töötlemismooduleid, mis vĂ”ivad osutuda vajalikuks.
â Raamatuga saab lĂ€hemalt tutvuda
â Habr'i kasutajatele 25% allahindlus kupongiga â Kafka Streams
â PĂ€rast fĂŒĂŒsilise raamatu tasumist saadetakse elektrooniline raamat e-posti aadressile.
Allikas: habr.com
