{"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\/sq\/blog\/administrirovanie\/kniga-kafka-streams-v-dejstvii-prilozheniya-i-mikroservisy-dlya-raboty-v-realnom-vremeni","title":{"rendered":"Libri \u00abKafka Streams n\u00eb veprim. Aplikacione dhe mikrosherbime p\u00ebr pun\u00eb n\u00eb koh\u00eb reale\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=\"Libri \u00abKafka Streams n\u00eb veprim. Aplikacione dhe mikrosherbime p\u00ebr pun\u00eb n\u00eb koh\u00eb reale\u00bb\" src=\"\/wp-content\/uploads\/6f8bd2b31b87b0c760c1148515893c43.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex> P\u00ebrsh\u00ebndetje, Hajrosh! Kjo lib\u00ebr \u00ebsht\u00eb e p\u00ebrshtatshme p\u00ebr \u00e7do zhvillues q\u00eb d\u00ebshiron t\u00eb kuptoj\u00eb trajtimin e rrjedhave. Kuptimi i programimit t\u00eb shp\u00ebrndar\u00eb do t\u00eb ndihmoj\u00eb n\u00eb studimin m\u00eb t\u00eb mir\u00eb t\u00eb Kafka dhe Kafka Streams. Do t\u00eb ishte mir\u00eb t\u00eb njihni edhe vet\u00eb framework-un Kafka, por kjo nuk \u00ebsht\u00eb e domosdoshme: un\u00eb do t'ju them gjith\u00e7ka q\u00eb duhet. Zhvilluesit e p\u00ebrvoj\u00ebs n\u00eb Kafka, ashtu si dhe ata t\u00eb rinjt\u00eb, do t\u00eb m\u00ebsojn\u00eb t\u00eb krijojn\u00eb aplikacione interesante p\u00ebr trajtimin e rrjedhave me bibliotek\u00ebn Kafka Streams fal\u00eb k\u00ebtij libri. Zhvilluesit Java t\u00eb nivelit t\u00eb mes\u00ebm dhe t\u00eb lart\u00eb, t\u00eb cil\u00ebt jan\u00eb tashm\u00eb t\u00eb njohur me koncepte si serializimi, do t\u00eb m\u00ebsojn\u00eb t\u00eb aplikojn\u00eb aft\u00ebsit\u00eb e tyre p\u00ebr krijimin e aplikacioneve Kafka Streams. Kodi burimor i librit \u00ebsht\u00eb shkruar n\u00eb Java 8 dhe ndihmon thelb\u00ebsisht n\u00eb p\u00ebrdorimin e sintaks\u00ebs s\u00eb shprehjeve lambda n\u00eb Java 8, k\u00ebshtu q\u00eb aft\u00ebsia p\u00ebr t\u00eb punuar me funksionet lambda (edhe n\u00eb nj\u00eb gjuh\u00eb tjet\u00ebr programimi) do t'ju ndihmoj\u00eb.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Fragment. 5.3. Agregimi dhe operacionet e dritareve<\/h3>\n<p>\nN\u00eb k\u00ebt\u00eb seksion do t\u00eb kalojm\u00eb n\u00eb studimin e pjes\u00ebve m\u00eb premtuese t\u00eb Kafka Streams. Deri tani kemi shqyrtuar aspektet e m\u00ebposhtme t\u00eb Kafka Streams:<\/p>\n<ul>\n<li>krijimi i topologjis\u00eb s\u00eb trajtimit;<\/li>\n<li>p\u00ebrdorimi i gjendjes n\u00eb aplikacionet e rrjedhave;<\/li>\n<li>kryerja e lidhjeve t\u00eb rrjedhave t\u00eb t\u00eb dh\u00ebnave;<\/li>\n<li>dallimet midis rrjedhave t\u00eb ngjarjeve (KStream) dhe rrjedhave t\u00eb p\u00ebrdit\u00ebsimeve (KTable).<\/li>\n<\/ul>\n<p>\nN\u00eb shembujt e ardhsh\u00ebm ne do t\u00eb mbledhim t\u00eb gjitha k\u00ebto elemente s\u00eb bashku. P\u00ebr m\u00eb tep\u00ebr, do t\u00eb njihni operacionet e dritareve \u2014 nj\u00eb tjet\u00ebr mund\u00ebsi t\u00eb shk\u00eblqyer p\u00ebr aplikacionet e rrjedhave. Shembulli yn\u00eb i par\u00eb do t\u00eb jet\u00eb agregimi i thjesht\u00eb.<\/p>\n<h3>5.3.1. Agregimi i volumit t\u00eb shitjeve t\u00eb aksioneve sipas sektor\u00ebve t\u00eb industris\u00eb<\/h3>\n<p>\nAgregimi dhe grupimi jan\u00eb mjete jet\u00ebsore kur punoni me t\u00eb dh\u00ebna t\u00eb rrjedhave. K\u00ebrkimi i regjistrimeve t\u00eb ve\u00e7anta n\u00eb momentin e marrjes shpesh nuk \u00ebsht\u00eb i mjaftuesh\u00ebm. P\u00ebr t\u00eb nxjerr\u00eb informacione shtes\u00eb nga t\u00eb dh\u00ebnat, nevojitet grupimi dhe kombinimi i tyre.<\/p>\n<p>N\u00eb k\u00ebt\u00eb shembull do t\u00eb duhet t\u00eb vishni kostumin e nj\u00eb tregtari intraditar, i cili duhet t\u00eb ndjek\u00eb volumet e shitjeve t\u00eb aksioneve t\u00eb kompanive n\u00eb disa sektor\u00eb t\u00eb industris\u00eb. N\u00eb ve\u00e7anti, do t'ju interesojn\u00eb pes\u00eb kompanit\u00eb me volumin m\u00eb t\u00eb madh t\u00eb shitjeve t\u00eb aksioneve n\u00eb secilin nga sektor\u00ebt e industris\u00eb.<\/p>\n<p>P\u00ebr nj\u00eb agregim t\u00eb till\u00eb do t\u00eb nevojiten disa hapa n\u00eb p\u00ebrkthimin e t\u00eb dh\u00ebnave n\u00eb formatin e duhur (n\u00ebse flasim n\u00eb terma t\u00eb p\u00ebrgjithsh\u00ebm).<\/p>\n<ol>\n<li>Krijo nj\u00eb burim bazuar n\u00eb tem\u00ebn q\u00eb publikojn\u00eb informacionin e pap\u00ebrpunuar mbi tregtin\u00eb e aksioneve. Ne do t\u00eb duhet t\u00eb shfaqim nj\u00eb objekt t\u00eb llojit StockTransaction n\u00eb nj\u00eb objekt t\u00eb llojit ShareVolume. Problemi \u00ebsht\u00eb se objekti StockTransaction p\u00ebrmban informacionin mbi shitjet, nd\u00ebrsa ne na duhen vet\u00ebm t\u00eb dh\u00ebnat p\u00ebr numrin e aksioneve t\u00eb shitura.<\/li>\n<li>Gruponi t\u00eb dh\u00ebnat ShareVolume sipas simboleve t\u00eb aksioneve. Pas grupimit sipas simboleve, k\u00ebto t\u00eb dh\u00ebna mund t\u00eb shkurtohen n\u00eb shuma t\u00eb p\u00ebrkohshme t\u00eb volumit t\u00eb shitjeve t\u00eb aksioneve. Vlen t\u00eb theksohet se metoda KStream.groupBy kthen nj\u00eb instanc\u00eb t\u00eb llojit KGroupedStream. Nd\u00ebrsa p\u00ebr t\u00eb marr\u00eb nj\u00eb instanc\u00eb t\u00eb KTable, mund t\u00eb th\u00ebrrisni m\u00eb pas metod\u00ebn KGroupedStream.reduce.<\/li>\n<\/ol>\n<p><\/p>\n<blockquote><p><b>\u00c7far\u00eb \u00ebsht\u00eb interfaca KGroupedStream<\/b><\/p>\n<p>Metodat KStream.groupBy dhe KStream.groupByKey kthejn\u00eb nj\u00eb instanc\u00eb KGroupedStream. KGroupedStream \u00ebsht\u00eb nj\u00eb p\u00ebrfaq\u00ebsim p\u00ebrkoh\u00ebs i rrjedh\u00ebs s\u00eb ngjarjeve pas grupimit sipas \u00e7el\u00ebsave. Ai nuk \u00ebsht\u00eb n\u00eb t\u00eb v\u00ebrtet\u00eb i destinuar p\u00ebr t'u punuar drejtp\u00ebrdrejt me t\u00eb. N\u00eb vend t\u00eb k\u00ebsaj, KGroupedStream p\u00ebrdoret p\u00ebr operacionet e agregimit, rezultati i t\u00eb cilave gjithmon\u00eb \u00ebsht\u00eb nj\u00eb KTable. Dhe pasi rezultatet e operacioneve t\u00eb agregimit jan\u00eb nj\u00eb KTable dhe n\u00eb to aplikohet nj\u00eb depo e gjendjes, ndoshta nuk t\u00eb gjitha p\u00ebrdit\u00ebsimet e rezultateve d\u00ebrgohen m\u00eb tutje n\u00eb tub.<\/p>\n<p>Metoda KTable.groupBy kthen nj\u00eb KGroupedTable t\u00eb ngjash\u00ebm \u2014 nj\u00eb p\u00ebrfaq\u00ebsim p\u00ebrkoh\u00ebs t\u00eb rrjedh\u00ebs s\u00eb p\u00ebrdit\u00ebsimeve, t\u00eb ribashkuara sipas \u00e7el\u00ebsit.<\/p><\/blockquote>\n<p>\nLe t\u00eb b\u00ebjm\u00eb nj\u00eb pushim t\u00eb vog\u00ebl dhe t\u00eb shikojm\u00eb fig. 5.9, e cila tregon at\u00eb q\u00eb arrit\u00ebm. Kjo topologji duhet t\u00eb jet\u00eb e njohur p\u00ebr ju tashm\u00eb.<\/p>\n<p><img decoding=\"async\" alt=\"Libri \u00abKafka Streams n\u00eb veprim. Aplikacione dhe mikrosherbime p\u00ebr pun\u00eb n\u00eb koh\u00eb reale\u00bb\" src=\"\/wp-content\/uploads\/9fd61317cde376362adcaeec72908919.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nTani, le t\u00eb shikojm\u00eb kodin p\u00ebr k\u00ebt\u00eb topologji (mund ta gjeni n\u00eb skedarin src\/main\/java\/bbejeck\/chapter_5\/AggregationsAndReducingExample.java) (listing 5.2).<\/p>\n<p><img decoding=\"async\" alt=\"Libri \u00abKafka Streams n\u00eb veprim. Aplikacione dhe mikrosherbime p\u00ebr pun\u00eb n\u00eb koh\u00eb reale\u00bb\" src=\"\/wp-content\/uploads\/f937287e448295fbd467c283ceca316a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKodi i dh\u00ebn\u00eb \u00ebsht\u00eb i shkurt\u00ebr dhe p\u00ebrmban shumic\u00ebn e veprimeve t\u00eb realizuara n\u00eb disa rreshta. N\u00eb parametrin e par\u00eb t\u00eb metod\u00ebs builder.stream mund t\u00eb vini re di\u00e7ka t\u00eb re p\u00ebr ju: vlera e enumerimit AutoOffsetReset.EARLIEST (ekziston gjithashtu dhe LATEST), e cila p\u00ebrcaktohet nga metoda Consumed.withOffsetResetPolicy. Me k\u00ebt\u00eb enumerim mund t\u00eb p\u00ebrcaktoni strategjin\u00eb e riciklimit t\u00eb offseteve p\u00ebr \u00e7do KStream ose KTable, e cila ka prioritet mbi parametrin e riciklimit t\u00eb offseteve nga konfigurimi.<\/p>\n<blockquote><p><b>GroupByKey dhe GroupBy<\/b><\/p>\n<p>N\u00eb interfes\u00ebn KStream ka dy metoda p\u00ebr t\u00eb grupuar regjistrat: GroupByKey dhe GroupBy. T\u00eb dyja kthejn\u00eb nj\u00eb KGroupedTable, k\u00ebshtu q\u00eb mund t\u00eb keni nj\u00eb pyetje t\u00eb natyrshme: \u00e7far\u00eb \u00ebsht\u00eb ndryshimi midis tyre dhe kur t\u00eb p\u00ebrdorni cilin nga ato?<\/p>\n<p>Metoda GroupByKey aplikohet kur \u00e7el\u00ebsat n\u00eb KStream jan\u00eb tashm\u00eb t\u00eb plot\u00eb. M\u00eb e r\u00ebnd\u00ebsishmja, flagu 'k\u00ebrkon ripjes\u00ebzimin' nuk \u00ebsht\u00eb vendosur asnj\u00ebher\u00eb.<\/p>\n<p>Metoda GroupBy supozon se keni ndryshuar \u00e7el\u00ebsat p\u00ebr grupimin, k\u00ebshtu q\u00eb flagu i ripjes\u00ebzimit \u00ebsht\u00eb vendosur n\u00eb true. Ekzekutimi pas metod\u00ebs GroupBy i bashkimeve, agregimeve dhe t\u00eb tjerave do t\u00eb \u00e7oj\u00eb n\u00eb ripjes\u00ebzim automatik.<br \/>\nP\u00ebrmbledhje: duhet t\u00eb p\u00ebrdorni GroupByKey sa her\u00eb q\u00eb \u00ebsht\u00eb e mundur dhe jo GroupBy.<\/p><\/blockquote>\n<p>\n\u00c7far\u00eb b\u00ebjn\u00eb metodat mapValues dhe groupBy \u00ebsht\u00eb e qart\u00eb, k\u00ebshtu q\u00eb le t\u00eb shikojm\u00eb metod\u00ebn sum() (mund ta gjeni n\u00eb skedarin src\/main\/java\/bbejeck\/model\/ShareVolume.java) (lista 5.3).<\/p>\n<p><img decoding=\"async\" alt=\"Libri \u00abKafka Streams n\u00eb veprim. Aplikacione dhe mikrosherbime p\u00ebr pun\u00eb n\u00eb koh\u00eb reale\u00bb\" src=\"\/wp-content\/uploads\/8e9a6f873594f9b5fef9a96c42353a61.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nMetoda ShareVolume.sum kthehet shumen e nd\u00ebrmjetme t\u00eb v\u00ebllimit t\u00eb tregtis\u00eb s\u00eb aksioneve, dhe rezultati i gjith\u00eb zinxhirit t\u00eb llogaritjeve paraqet nj\u00eb objekt KTable. Tani e kuptoni se \u00e7far\u00eb roli luan KTable. Kur objekto ShareVolume arrijn\u00eb, p\u00ebrdit\u00ebsimi m\u00eb i fundit ruhet n\u00eb objektin p\u00ebrkat\u00ebs KTable. \u00cbsht\u00eb e r\u00ebnd\u00ebsishme t\u00eb mos harrohet se t\u00eb gjitha p\u00ebrdit\u00ebsimet reflektohen n\u00eb shareVolumeKTable t\u00eb m\u00ebparsh\u00ebm, por jo t\u00eb gjitha d\u00ebrgohen m\u00eb tutje.<\/p>\n<p>M\u00eb pas, me k\u00ebt\u00eb KTable kryejm\u00eb agregimin (sip\u00ebr sasis\u00eb s\u00eb aksioneve t\u00eb shitur), p\u00ebr t\u00eb marr\u00eb pes\u00eb kompanit\u00eb me v\u00ebllimet m\u00eb t\u00eb m\u00ebdha t\u00eb tregtis\u00eb s\u00eb aksioneve n\u00eb \u00e7do industri. Veprimet tona do t\u00eb jen\u00eb t\u00eb ngjashme me veprimet n\u00eb agregimin e par\u00eb.<\/p>\n<ol>\n<li>Kryeni nj\u00eb operacion m\u00eb t\u00eb grupimit p\u00ebr t\u00eb grupuar objektet ShareVolume sipas industrive.<\/li>\n<li>Vazhdoni me shumimin e objekteve ShareVolume. K\u00ebsaj here, objekti i agregimit \u00ebsht\u00eb nj\u00eb radh\u00eb me prioritet t\u00eb madh\u00ebsis\u00eb fikse. N\u00eb k\u00ebt\u00eb radh\u00eb me madh\u00ebsi fikse ruhet vet\u00ebm pes\u00eb kompanit\u00eb me sasin\u00eb m\u00eb t\u00eb madhe t\u00eb aksioneve t\u00eb shitura.<\/li>\n<li>Shfaqni radh\u00ebn e m\u00ebparshme n\u00eb nj\u00eb vler\u00eb string dhe ktheni pes\u00eb aksionet m\u00eb t\u00eb shitura sipas sasis\u00eb p\u00ebr industrin\u00eb.<\/li>\n<li>Shkruani rezultatet n\u00eb formatin e stringut n\u00eb tem\u00ebn.<\/li>\n<\/ol>\n<p>\nN\u00eb figur\u00ebn 5.10 shfaqet grafiku i topologjis\u00eb s\u00eb l\u00ebvizjes s\u00eb t\u00eb dh\u00ebnave. Si\u00e7 e shihni, cikli i dyt\u00eb i p\u00ebrpunimit \u00ebsht\u00eb mjaft i thjesht\u00eb.<\/p>\n<p><img decoding=\"async\" alt=\"Libri \u00abKafka Streams n\u00eb veprim. Aplikacione dhe mikrosherbime p\u00ebr pun\u00eb n\u00eb koh\u00eb reale\u00bb\" src=\"\/wp-content\/uploads\/dabd1507eee267038edb7f8d76d8d8ae.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nTani, duke e kuptuar qart\u00eb struktur\u00ebn e k\u00ebtij cikli t\u00eb dyt\u00eb t\u00eb p\u00ebrpunimit, mund t\u00eb referoheni n\u00eb kodin e tij burimor (do ta gjeni n\u00eb skedarin src\/main\/java\/bbejeck\/chapter_5\/AggregationsAndReducingExample.java) (lista 5.4).<\/p>\n<p>N\u00eb k\u00ebt\u00eb inicializues ka nj\u00eb variabl\u00eb fixedQueue. Ky \u00ebsht\u00eb nj\u00eb objekt personal - nj\u00eb adapter p\u00ebr java.util.TreeSet, i cili p\u00ebrdoret p\u00ebr t\u00eb ndjekur N rezultatet m\u00eb t\u00eb m\u00ebdha n\u00eb rend n\u00eb r\u00ebnie t\u00eb numrit t\u00eb aksioneve t\u00eb shitura.<\/p>\n<p><img decoding=\"async\" alt=\"Libri \u00abKafka Streams n\u00eb veprim. Aplikacione dhe mikrosherbime p\u00ebr pun\u00eb n\u00eb koh\u00eb reale\u00bb\" src=\"\/wp-content\/uploads\/488b072b0d91b81c925ca72291e69e48.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nJu tashm\u00eb keni hasur me thirrjet groupBy dhe mapValues, k\u00ebshtu q\u00eb nuk do t\u00eb ndalemi te to (ne th\u00ebrrasim metod\u00ebn KTable.toStream, pasi metoda KTable.print \u00ebsht\u00eb e vjet\u00ebr). Por ende nuk keni par\u00eb versionin KTable t\u00eb metod\u00ebs aggregate(), k\u00ebshtu q\u00eb do t\u00eb kalojm\u00eb pak koh\u00eb p\u00ebr ta diskutuar at\u00eb.<\/p>\n<p>Si\u00e7 e mbani mend, KTable karakterizohet nga fakti se regjistrimet me \u00e7el\u00ebsa t\u00eb nj\u00ebjt\u00eb konsiderohen si p\u00ebrdit\u00ebsime. KTable z\u00ebvend\u00ebson regjistrimin e vjet\u00ebr me nj\u00eb t\u00eb re. Agregimi ndodh n\u00eb nj\u00eb m\u00ebnyr\u00eb t\u00eb ngjashme: regjistrimet e fundit me nj\u00eb \u00e7el\u00ebs agregohen. Kur nj\u00eb regjistrim arrin, ai shtohet n\u00eb instanc\u00ebn e klas\u00ebs FixedSizePriorityQueue me ndihm\u00ebsin (parametri i dyt\u00eb n\u00eb thirrjen e metod\u00ebs aggregate), por n\u00ebse tashm\u00eb ekziston nj\u00eb regjistrim tjet\u00ebr me t\u00eb nj\u00ebjtin \u00e7el\u00ebs, regjistrimi i vjet\u00ebr fshihet me ndihm\u00ebsin (parametri i tret\u00eb n\u00eb thirrjen e metod\u00ebs aggregate).<\/p>\n<p>Kjo do t\u00eb thot\u00eb se agregatori yn\u00eb, FixedSizePriorityQueue, n\u00eb t\u00eb v\u00ebrtet\u00eb nuk agregon t\u00eb gjitha vlerat me nj\u00eb \u00e7el\u00ebs t\u00eb vet\u00ebm, por ruan shum\u00ebn l\u00ebshuese t\u00eb sasis\u00eb N t\u00eb llojeve t\u00eb aksioneve m\u00eb t\u00eb shitura. N\u00eb \u00e7do regjistrim q\u00eb arrin, p\u00ebrmban shum\u00ebn totale t\u00eb aksioneve t\u00eb shitura deri tani. KTable do t'ju jap\u00eb informacion se cilat kompani kan\u00eb aksionet m\u00eb t\u00eb shitura n\u00eb k\u00ebt\u00eb moment, dhe agregimi l\u00ebshuese i \u00e7do p\u00ebrdit\u00ebsimi nuk nevojitet.<\/p>\n<p>Ne m\u00ebsuam t\u00eb b\u00ebjm\u00eb dy gj\u00ebra t\u00eb r\u00ebnd\u00ebsishme:<\/p>\n<ul>\n<li>t\u00eb grumbullojm\u00eb vlerat n\u00eb KTable sipas nj\u00eb \u00e7el\u00ebsi t\u00eb p\u00ebrbashk\u00ebt;<\/li>\n<li>t\u00eb kryejm\u00eb operacione t\u00eb dobishme si shkrirje dhe agregim mbi k\u00ebto vlera t\u00eb grumbulluara.<\/li>\n<\/ul>\n<p>\nT\u00eb qenit n\u00eb gjendje t\u00eb kryejm\u00eb k\u00ebto operacione \u00ebsht\u00eb e r\u00ebnd\u00ebsishme p\u00ebr t\u00eb kuptuar kuptimin e t\u00eb dh\u00ebnave q\u00eb l\u00ebvizin p\u00ebrmes aplikacionit Kafka Streams dhe p\u00ebr t\u00eb zbuluar informacionin e q\u00eb ata bartin.<\/p>\n<p>Ne kemi bashkuar gjithashtu disa nga konceptet ky\u00e7e q\u00eb u diskutuan m\u00eb par\u00eb n\u00eb k\u00ebt\u00eb lib\u00ebr. N\u00eb kapitullin 4, ne fol\u00ebm p\u00ebr r\u00ebnd\u00ebsin\u00eb e gjendjes lokale p\u00ebr aplikacionet e transmetimit. Shembulli i par\u00eb n\u00eb k\u00ebt\u00eb kapitull demonstroi pse gjendja lokale \u00ebsht\u00eb kaq e r\u00ebnd\u00ebsishme \u2014 ajo mund\u00ebson ndjekjen e informacionit q\u00eb keni par\u00eb tashm\u00eb. Qasja lokale ndihmon p\u00ebr t\u00eb evituar vonesat e rrjetit, duke i b\u00ebr\u00eb aplikacionet m\u00eb t\u00eb shpejta dhe m\u00eb t\u00eb q\u00ebndrueshme ndaj gabimeve.<\/p>\n<p>Kur kryeni \u00e7do operacion t\u00eb p\u00ebrmbledhjes ose agregat\u00ebs, duhet t\u00eb especificoni emrin e depozit\u00ebs s\u00eb gjendjes. Operacionet e p\u00ebrmbledhjes dhe agregat\u00ebs kthejn\u00eb nj\u00eb ekzemplar KTable, dhe KTable p\u00ebrdor depozit\u00ebn e gjendjes p\u00ebr t\u00eb z\u00ebvend\u00ebsuar rezultatet e vjetra me t\u00eb rejat. Si\u00e7 keni par\u00eb, jo t\u00eb gjitha p\u00ebrdit\u00ebsimet d\u00ebrgohen p\u00ebrpara n\u00eb p\u00ebrpunim, dhe kjo \u00ebsht\u00eb e r\u00ebnd\u00ebsishme, pasi operacionet e agregat\u00ebs jan\u00eb t\u00eb destinuara p\u00ebr t\u00eb marr\u00eb informacionin p\u00ebrfundimtar. N\u00ebse nuk p\u00ebrdoret gjendja lokale, KTable do t\u00eb d\u00ebrgoj\u00eb p\u00ebrpara t\u00eb gjitha rezultatet e agregat\u00ebs dhe p\u00ebrmbledhjes.<\/p>\n<p>M\u00eb tej do t\u00eb shqyrtojm\u00eb kryerjen e operacioneve si agregata brenda nj\u00eb intervali t\u00eb caktuar \u2014 ato q\u00eb quhen operacione dritare (windowing operations).<\/p>\n<h3>5.3.2. Operacione dritare<\/h3>\n<p>\nN\u00eb seksionin e m\u00ebparsh\u00ebm u njoh\u00ebm me p\u00ebrmbledhjen dhe agregat\u00ebn \"l\u00ebviz\u00ebse\". Aplikacioni kryente nj\u00eb p\u00ebrmbledhje t\u00eb vazhdueshme t\u00eb v\u00ebllimit t\u00eb shitjeve t\u00eb aksioneve me nj\u00eb agregat\u00eb t\u00eb pes\u00eb aksioneve m\u00eb t\u00eb shitura n\u00eb burs\u00eb.<\/p>\n<p>Ndonj\u00ebher\u00eb, k\u00ebto agregata dhe p\u00ebrmbledhje t\u00eb vazhdueshme jan\u00eb t\u00eb nevojshme. Dhe ndonj\u00ebher\u00eb, duhet t\u00eb kryhen operacione vet\u00ebm mbi nj\u00eb interval t\u00eb caktuar kohor. P\u00ebr shembull, t\u00eb llogarisim se sa operacione jan\u00eb kryer mbi aksionet e nj\u00eb kompanie t\u00eb caktuar n\u00eb 10 minutat e fundit. Ose sa p\u00ebrdorues kan\u00eb klikuar mbi nj\u00eb banderola t\u00eb re reklamuese n\u00eb 15 minutat e fundit. Aplikacioni mund t\u00eb kryej\u00eb k\u00ebto operacione shum\u00eb her\u00eb, por me rezultate q\u00eb i p\u00ebrkasin vet\u00ebm intervaleve t\u00eb caktuara (dritareve t\u00eb koh\u00ebs).<\/p>\n<h3>Num\u00ebrimi i transaksioneve t\u00eb burs\u00ebs sipas bler\u00ebsit<\/h3>\n<p>\nN\u00eb shembullin e ardhsh\u00ebm ne do t\u00eb angazhohemi n\u00eb ndjekjen e transaksioneve t\u00eb burs\u00ebs p\u00ebr disa tregtar\u00eb \u2014 ose organizata t\u00eb m\u00ebdha, ose financist\u00eb t\u00eb men\u00e7ur individual\u00eb.<\/p>\n<p>Ka jan\u00eb dy arsye t\u00eb mundshme p\u00ebr nj\u00eb ndjekje t\u00eb till\u00eb. Nj\u00ebra prej tyre \u00ebsht\u00eb nevoja p\u00ebr t\u00eb ditur se \u00e7far\u00eb blejn\u00eb\/shesin lider\u00ebt e tregut. N\u00ebse k\u00ebta lojtar\u00eb t\u00eb m\u00ebdhenj dhe investitor\u00eb t\u00eb njohur shohin mund\u00ebsi q\u00eb hapen p\u00ebr ta, ka kuptim t\u00eb ndjekin strategjit\u00eb e tyre. Arsyeja tjet\u00ebr \u00ebsht\u00eb d\u00ebshira p\u00ebr t\u00eb v\u00ebrejtur \u00e7do shenj\u00eb t\u00eb mundshme t\u00eb transaksioneve t\u00eb paligjshme duke p\u00ebrdorur informacionin e brendsh\u00ebm. P\u00ebr k\u00ebt\u00eb, do t\u00eb nevojitet t\u00eb analizoni korrelacionin mes shp\u00ebrthimeve t\u00eb m\u00ebdha t\u00eb shitjeve dhe njoftimeve t\u00eb r\u00ebnd\u00ebsishme p\u00ebr shtyp.<\/p>\n<p>Kjo ndjekje p\u00ebrb\u00ebhet nga faza t\u00eb tilla si:<\/p>\n<ul>\n<li>krijimi i nj\u00eb rrjedhe p\u00ebr lexim nga tema stock-transactions;<\/li>\n<li>grupimi i regjistrimeve t\u00eb ardhura sipas identifikuesit t\u00eb bler\u00ebsit dhe simbolit t\u00eb aksionit. Thirrja e metod\u00ebs groupBy kthen nj\u00eb instanc\u00eb t\u00eb klas\u00ebs KGroupedStream;<\/li>\n<li>kthimi me metod\u00ebn KGroupedStream.windowedBy t\u00eb nj\u00eb rrjedhe t\u00eb dh\u00ebnash t\u00eb kufizuar nga nj\u00eb dritare kohore, e cila lejon kryerjen e agregimit t\u00eb dritareve. Sipas llojit t\u00eb dritares, kthehet ose TimeWindowedKStream ose SessionWindowedKStream;<\/li>\n<li>num\u00ebrimi i transaksioneve p\u00ebr operacionin e agregimit. Rrjedha e dh\u00ebnash t\u00eb dritares p\u00ebrcakton n\u00ebse regjistrimi konkret p\u00ebrfshihet n\u00eb k\u00ebt\u00eb num\u00ebrim;<\/li>\n<li>sh\u00ebnimi i rezultateve n\u00eb tem\u00eb ose dalja e tyre n\u00eb konsol n\u00eb koh\u00ebn e zhvillimit.<\/li>\n<\/ul>\n<p>\nTopologjia e k\u00ebtij aplikacioni \u00ebsht\u00eb e thjesht\u00eb, por nj\u00eb pamje vizuale e saj nuk do t\u00eb ishte e panevojshme. Le t\u00eb shikojm\u00eb n\u00eb figur\u00ebn 5.11.<\/p>\n<p>M\u00eb pas, do t\u00eb shqyrtojm\u00eb funksionalitetin e operacioneve t\u00eb dritareve dhe kodin p\u00ebrkat\u00ebs.<\/p>\n<p><img decoding=\"async\" alt=\"Libri \u00abKafka Streams n\u00eb veprim. Aplikacione dhe mikrosherbime p\u00ebr pun\u00eb n\u00eb koh\u00eb reale\u00bb\" src=\"\/wp-content\/uploads\/67d9d8d8acb1370a7c7fe5cd9a8b6aa7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Llojet e dritareve<\/h3>\n<p>\nN\u00eb Kafka Streams ekzistojn\u00eb tri lloje dritare:<\/p>\n<ul>\n<li>dritare sesionale;<\/li>\n<li>dritare 'tumbling' (kufizuese);<\/li>\n<li>dritare t\u00eb l\u00ebvizshme\/'hopping' (sliding\/hopping).<\/li>\n<\/ul>\n<p>\nCila t\u00eb zgjidhet \u2014 varet nga k\u00ebrkesat biznesore. Dritaret 'tumbling' dhe 'hopping' kufizohen n\u00eb koh\u00eb, nd\u00ebrsa kufizimet e dritareve sesionale lidhen me veprimet e p\u00ebrdoruesve \u2014 gjat\u00ebsi e sesioneve (n\u00eb) p\u00ebrcaktohet ekskluzivisht nga sa aktiv \u00ebsht\u00eb p\u00ebrdoruesi. E r\u00ebnd\u00ebsishme \u00ebsht\u00eb t\u00eb mos harrosh se t\u00eb gjitha llojet e dritareve bazohen n\u00eb etiketat e dat\u00ebs\/koh\u00ebs s\u00eb regjistrimeve, dhe jo n\u00eb koh\u00ebn e sistemit.<\/p>\n<p>M\u00eb pas, do t\u00eb implementojm\u00eb topologjin\u00eb ton\u00eb me \u00e7do lloj t\u00eb dritareve. Kodi i plot\u00eb do t\u00eb jepet vet\u00ebm n\u00eb shembullin e par\u00eb, p\u00ebr llojet e tjera t\u00eb dritareve nuk do t\u00eb ket\u00eb asgj\u00eb t\u00eb ndryshuar, p\u00ebrve\u00e7 llojit t\u00eb operacionit t\u00eb dritareve.<\/p>\n<h3>Dritaret sesionale<\/h3>\n<p>\nDritaret e seancave dallojn\u00eb shum\u00eb nga t\u00eb gjitha llojet e tjera t\u00eb dritareve. Ato kufizohen jo aq shum\u00eb nga koha, sa nga aktiviteti i p\u00ebrdoruesit (ose aktiviteti i asaj entiteti q\u00eb do t\u00eb d\u00ebshironit t\u00eb ndiqni). Dritaret e seancave ndahen n\u00eb periudha pasiviteti.<\/p>\n<p>Figura 5.12 ilustron konceptin e dritareve t\u00eb seancave. Nj\u00eb seanc\u00eb m\u00eb e vog\u00ebl do t\u00eb shp\u00ebrndaj\u00eb me seanc\u00ebn n\u00eb t\u00eb majt\u00eb t\u00eb saj. Nd\u00ebrsa seanca n\u00eb t\u00eb djatht\u00eb do t\u00eb jet\u00eb e ve\u00e7ant\u00eb, pasi ndjek nj\u00eb periudh\u00eb t\u00eb gjat\u00eb pasiviteti. Dritaret e seancave bazohen n\u00eb veprimet e p\u00ebrdoruesve, por p\u00ebrdorin etiketat e dat\u00ebs \/ or\u00ebs nga regjistrimet p\u00ebr t\u00eb p\u00ebrcaktuar se kujt seance i p\u00ebrket regjistrimi.<\/p>\n<p><img decoding=\"async\" alt=\"Libri \u00abKafka Streams n\u00eb veprim. Aplikacione dhe mikrosherbime p\u00ebr pun\u00eb n\u00eb koh\u00eb reale\u00bb\" src=\"\/wp-content\/uploads\/d39a5db7af7d6aa2194802622b2b47fd.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>P\u00ebrdorimi i dritareve t\u00eb seancave p\u00ebr ndjekjen e transaksioneve t\u00eb burs\u00ebs<\/h3>\n<p>\nLe t\u00eb p\u00ebrdorim dritaret e seancave p\u00ebr t\u00eb kapur informacionin mbi transaksionet e burs\u00ebs. Zbatimi i dritareve t\u00eb seancave \u00ebsht\u00eb i paraqitur n\u00eb listimin 5.5 (i cili mund t\u00eb gjendet n\u00eb skedarin src\/main\/java\/bbejeck\/chapter_5\/CountingWindowingAndKTableJoinExample.java).<\/p>\n<p><img decoding=\"async\" alt=\"Libri \u00abKafka Streams n\u00eb veprim. Aplikacione dhe mikrosherbime p\u00ebr pun\u00eb n\u00eb koh\u00eb reale\u00bb\" src=\"\/wp-content\/uploads\/2dcbd9a36baec0e746aad165121451b3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nShumica e operacioneve t\u00eb k\u00ebsaj topologjie ju kan\u00eb takuar tashm\u00eb, k\u00ebshtu q\u00eb nuk ka nevoj\u00eb t\u00eb shqyrtojm\u00eb ato p\u00ebrs\u00ebri k\u00ebtu. Por ka disa elemente t\u00eb reja k\u00ebtu, t\u00eb cilat do t'i diskutojm\u00eb tani.<\/p>\n<p>Me \u00e7do operacion groupBy zakonisht kryhet ndonj\u00eb operacion agregimi (agregim, p\u00ebrmbledhje ose num\u00ebrim). Mund t\u00eb kryhet ose aggregim akumulativ me rezultat t\u00eb akumuluar, ose agregim dritareje, ku merren parasysh regjistrimet brenda nj\u00eb dritareje t\u00eb caktuar kohore.<\/p>\n<p>Kodi nga listimi 5.5 kryen num\u00ebrimin e transaksioneve brenda dritareve t\u00eb seancave. N\u00eb fig. 5.13 k\u00ebto veprime analizohen hap pas hapi.<\/p>\n<p>Me thirrjen windowedBy(SessionWindows.with(twentySeconds).until(fifteenMinutes)) krijojm\u00eb nj\u00eb dritare seance me nj\u00eb interval pasiviteti prej 20 sekondash dhe nj\u00eb interval ruajtjeje prej 15 minutash. Intervali i pasivitetit prej 20 sekondash do t\u00eb thot\u00eb q\u00eb aplikacioni do t\u00eb p\u00ebrfshij\u00eb \u00e7do regjistrim q\u00eb vjen brenda 20 sekondave nga fundi ose fillimi i seanc\u00ebs aktuale n\u00eb seanc\u00ebn aktuale (aktive).<\/p>\n<p><img decoding=\"async\" alt=\"Libri \u00abKafka Streams n\u00eb veprim. Aplikacione dhe mikrosherbime p\u00ebr pun\u00eb n\u00eb koh\u00eb reale\u00bb\" src=\"\/wp-content\/uploads\/9bd47b04698086872fd135b4c67eb938.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nM\u00eb pas, ne tregojm\u00eb se cil\u00ebn operacion agregimi duhet t\u00eb kryejm\u00eb n\u00eb dritaren e seanc\u00ebs \u2014 n\u00eb k\u00ebt\u00eb rast, count. N\u00ebse regjistrimi i ardhsh\u00ebm kalon jasht\u00eb kufijve t\u00eb intervalit t\u00eb papun\u00ebsis\u00eb (n\u00eb nj\u00ebra an\u00eb nga marka e dat\u00ebs\/ora), aplikacioni krijon nj\u00eb seanc\u00eb t\u00eb re. Intervali i ruajtjes n\u00ebnkupton mbajtjen e seanc\u00ebs p\u00ebr nj\u00eb periudh\u00eb t\u00eb caktuar kohore dhe lejon t\u00eb dh\u00ebna t\u00eb vonuara q\u00eb kalojn\u00eb jasht\u00eb periudh\u00ebs s\u00eb papun\u00ebsis\u00eb s\u00eb seanc\u00ebs, por q\u00eb ende mund t\u00eb bashkohen. P\u00ebr m\u00eb tep\u00ebr, fillimi dhe p\u00ebrfundimi i seanc\u00ebs s\u00eb re, t\u00eb krijuar nga bashkimi, korrespondon me mark\u00ebn m\u00eb t\u00eb hershme dhe m\u00eb t\u00eb von\u00eb t\u00eb dat\u00ebs\/ora.<\/p>\n<p>Le t\u00eb shqyrtojm\u00eb disa regjistrime nga metoda count, p\u00ebr t\u00eb par\u00eb si funksionojn\u00eb seancat (tabela 5.1).<\/p>\n<p><img decoding=\"async\" alt=\"Libri \u00abKafka Streams n\u00eb veprim. Aplikacione dhe mikrosherbime p\u00ebr pun\u00eb n\u00eb koh\u00eb reale\u00bb\" src=\"\/wp-content\/uploads\/ec04aae466d88c2d2349474069c8d541.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKur regjistrimet mb\u00ebrrijn\u00eb, ne k\u00ebrkojm\u00eb seancat ekzistuese me t\u00eb nj\u00ebjtin \u00e7el\u00ebs, me koh\u00ebn e p\u00ebrfundimit t\u00eb m\u00ebparshme se marka aktuale e dat\u00ebs\/ora \u2014 intervali i papun\u00ebsis\u00eb dhe me koh\u00ebn fillestare t\u00eb m\u00ebvonshme se marka aktuale e dat\u00ebs\/ora + intervali i papun\u00ebsis\u00eb. Duke e konsideruar k\u00ebt\u00eb, kat\u00ebr regjistrimet nga tabela 5.1 bashkohen n\u00eb nj\u00eb seanc\u00eb t\u00eb vetme n\u00eb k\u00ebt\u00eb m\u00ebnyr\u00eb.<\/p>\n<p>1. Regjistrimi 1 mb\u00ebrrin i pari, k\u00ebshtu q\u00eb koha fillestare \u00ebsht\u00eb e barabart\u00eb me koh\u00ebn e p\u00ebrfundimit dhe \u00ebsht\u00eb e barabart\u00eb me 00:00:00.<\/p>\n<p>2. M\u00eb pas mb\u00ebrrin regjistrimi 2, dhe ne k\u00ebrkojm\u00eb seancat q\u00eb p\u00ebrfundojn\u00eb jo m\u00eb her\u00ebt se 23:59:55 dhe fillojn\u00eb jo m\u00eb von\u00eb se 00:00:35. Gjejm\u00eb regjistrimin 1 dhe bashkojm\u00eb seancat 1 dhe 2. Marrim koh\u00ebn fillestare t\u00eb seanc\u00ebs 1 (m\u00eb t\u00eb hershme) dhe koh\u00ebn e p\u00ebrfundimit t\u00eb seanc\u00ebs 2 (m\u00eb t\u00eb von\u00eb), k\u00ebshtu q\u00eb seanca jon\u00eb e re fillon n\u00eb 00:00:00 dhe p\u00ebrfundon n\u00eb 00:00:15.<\/p>\n<p>3. M\u00eb mb\u00ebrrin regjistrimi 3, ne k\u00ebrkojm\u00eb seancat midis 00:00:30 dhe 00:01:10 dhe nuk gjejm\u00eb asnj\u00ebr\u00ebn. Shtojm\u00eb seanc\u00ebn e dyt\u00eb p\u00ebr \u00e7el\u00ebsin 123-345-654,FFBE, q\u00eb fillon dhe p\u00ebrfundon n\u00eb 00:00:50.<\/p>\n<p>4. M\u00eb mb\u00ebrrin regjistrimi 4, dhe ne k\u00ebrkojm\u00eb seancat midis 23:59:45 dhe 00:00:25. K\u00ebt\u00eb her\u00eb gjenden t\u00eb dyja seancat \u2014 1 dhe 2. T\u00eb gjitha tre seancat bashkohen n\u00eb nj\u00eb, me koh\u00ebn fillestare 00:00:00 dhe koh\u00ebn e p\u00ebrfundimit 00:00:15.<\/p>\n<p>Nga ajo q\u00eb u tha n\u00eb k\u00ebt\u00eb seksion, duhen mbajtur mend k\u00ebto detaje t\u00eb r\u00ebnd\u00ebsishme:<\/p>\n<ul>\n<li>seancat \u2014 nuk jan\u00eb dritare me p\u00ebrmasa fikse. Zgjatja e seanc\u00ebs p\u00ebrcaktohet nga aktiviteti brenda nj\u00eb intervali t\u00eb caktuar kohor;<\/li>\n<li>markat e dat\u00ebs\/ora n\u00eb t\u00eb dh\u00ebna p\u00ebrcaktojn\u00eb n\u00ebse nj\u00eb ngjarje bie n\u00eb nj\u00eb seanc\u00eb ekzistuese ose n\u00eb nj\u00eb periudh\u00eb papun\u00ebsie.<\/li>\n<\/ul>\n<p>\nM\u00eb pas do t\u00eb diskutojm\u00eb llojin tjet\u00ebr t\u00eb dritareve \u2014 \"rrotulluese\".<\/p>\n<h3>\"Rrotulluese\" dritare<\/h3>\n<p>\nDritaret \"tumblluese\" kapin ngjarjet q\u00eb bie n\u00eb nj\u00eb interval t\u00eb caktuar kohor. Imagjinoni se duhet t\u00eb kapni t\u00eb gjitha transaksionet bursore t\u00eb nj\u00eb kompanie \u00e7do 20 sekonda, k\u00ebshtu q\u00eb mbledhni t\u00eb gjitha ngjarjet p\u00ebr k\u00ebt\u00eb koh\u00eb. Pas skadimit t\u00eb intervalit 20-sekondor, dritarja \"tumbllohet\" dhe kalon n\u00eb nj\u00eb interval t\u00eb ri 20-sekondor t\u00eb v\u00ebzhgimit. Figura 5.14 ilustron k\u00ebt\u00eb situat\u00eb.<\/p>\n<p><img decoding=\"async\" alt=\"Libri \u00abKafka Streams n\u00eb veprim. Aplikacione dhe mikrosherbime p\u00ebr pun\u00eb n\u00eb koh\u00eb reale\u00bb\" src=\"\/wp-content\/uploads\/e90e560d9ddda5e2e524b7c387ad9874.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSi\u00e7 mund ta shihni, t\u00eb gjitha ngjarjet e pranuara p\u00ebr 20 sekondat e fundit jan\u00eb t\u00eb p\u00ebrfshira n\u00eb dritare. Pas skadimit t\u00eb k\u00ebtij intervali, krijohet nj\u00eb dritare e re.<\/p>\n<p>N\u00eb list\u00ebn 5.6 \u00ebsht\u00eb dh\u00ebn\u00eb kodi q\u00eb demonstron p\u00ebrdorimin e dritareve \"tumblluese\" p\u00ebr t\u00eb kapur \u00e7do 20 sekonda transaksionet bursore (e gjeni n\u00eb skedarin src\/main\/java\/bbejeck\/chapter_5\/CountingWindowingAndKtableJoinExample.java).<\/p>\n<p><img decoding=\"async\" alt=\"Libri \u00abKafka Streams n\u00eb veprim. Aplikacione dhe mikrosherbime p\u00ebr pun\u00eb n\u00eb koh\u00eb reale\u00bb\" src=\"\/wp-content\/uploads\/e055bb1b288c7d500b64372fe3fbf064.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nFal\u00eb k\u00ebtij ndryshimi t\u00eb vog\u00ebl n\u00eb thirrjen e metod\u00ebs TimeWindows.of, mund t\u00eb p\u00ebrdoret dritarja \"tumblluese\". N\u00eb k\u00ebt\u00eb shembull nuk ka thirrje p\u00ebr metod\u00ebn until(), duke p\u00ebrdorur k\u00ebshtu intervalin e ruajtjes me default, 24 or\u00eb.<\/p>\n<p>N\u00eb fund, \u00ebsht\u00eb koha t\u00eb kalojm\u00eb n\u00eb opsionin e fundit t\u00eb dritareve \u2014 dritaret \"hopping\".<\/p>\n<h3>Dritaret l\u00ebviz\u00ebse (\"hopping\")<\/h3>\n<p>\nDritaret l\u00ebviz\u00ebse\/\"hopping\" (sliding\/hopping) jan\u00eb t\u00eb ngjashme me dritaret \"tumblluese\", por me nj\u00eb ndryshim t\u00eb vog\u00ebl. Dritaret l\u00ebviz\u00ebse nuk presin skadimin e intervalit kohor p\u00ebr t\u00eb krijuar nj\u00eb dritare t\u00eb re p\u00ebr p\u00ebrpunimin e ngjarjeve t\u00eb fundit. Ato fillojn\u00eb llogaritjet e reja pas nj\u00eb intervali pritej, q\u00eb \u00ebsht\u00eb m\u00eb i vog\u00ebl se koh\u00ebzgjatja e dritares.<\/p>\n<p>P\u00ebr t\u00eb ilustruar diferencat nd\u00ebrmjet dritareve \"tumblluese\" dhe \"hopping\", le t\u00eb kthehemi n\u00eb shembullin e llogaritjes s\u00eb transaksioneve bursore. Q\u00ebllimi yn\u00eb mbetet t\u00eb llogarit\u00eb numrin e transaksioneve, por nuk do t\u00eb donim t\u00eb prisnim t\u00eb gjith\u00eb intervalin para se t\u00eb p\u00ebrdit\u00ebsojm\u00eb num\u00ebruesin. N\u00eb vend t\u00eb k\u00ebsaj, do t\u00eb p\u00ebrdit\u00ebsojm\u00eb num\u00ebruesin \u00e7do 5 sekonda, duke llogaritur ende numrin e transaksioneve \u00e7do 20 sekonda, si\u00e7 tregohet n\u00eb fig. 5.15. K\u00ebshtu, ne kemi tre dritare rezultate me t\u00eb dh\u00ebna t\u00eb mbivendosura.<\/p>\n<p><img decoding=\"async\" alt=\"Libri \u00abKafka Streams n\u00eb veprim. Aplikacione dhe mikrosherbime p\u00ebr pun\u00eb n\u00eb koh\u00eb reale\u00bb\" src=\"\/wp-content\/uploads\/415c8cd9f2b60d453a1a01c3bc99331f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nN\u00eb list\u00ebn 5.7 \u00ebsht\u00eb dh\u00ebn\u00eb kodi p\u00ebr caktimin e dritareve l\u00ebviz\u00ebse (e gjeni n\u00eb skedarin src\/main\/java\/bbejeck\/chapter_5\/CountingWindowingAndKtableJoinExample.java).<\/p>\n<p><img decoding=\"async\" alt=\"Libri \u00abKafka Streams n\u00eb veprim. Aplikacione dhe mikrosherbime p\u00ebr pun\u00eb n\u00eb koh\u00eb reale\u00bb\" src=\"\/wp-content\/uploads\/ab2d1a64380d256d3fb084e16597417c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\"Kuvyrkayushchiesya\" okno mund t\u00eb transformohet n\u00eb \"prijgajues\" duke shtuar thirrjen e metod\u00ebs advanceBy(). N\u00eb shembullin e dh\u00ebn\u00eb, intervali i ruajtjes \u00ebsht\u00eb 15 minuta.<\/p>\n<p>Keni par\u00eb n\u00eb k\u00ebt\u00eb seksion se si t\u00eb kufizoni rezultatet e agregatimit me dritare kohore. N\u00eb ve\u00e7anti, do t\u00eb donim q\u00eb t\u00eb mbani mend nga ky seksion tre gj\u00ebra t\u00eb m\u00ebposhtme:<\/p>\n<ul>\n<li>sizmi i dritareve t\u00eb sesioneve kufizohet nga aktiviteti i p\u00ebrdoruesve, jo nga periudha kohore;<\/li>\n<li>\"kuvyrkayushchiesya\" dritaret japin nj\u00eb pamje t\u00eb ngjarjeve brenda nj\u00eb periudhe t\u00eb caktuar kohore;<\/li>\n<li>zgjatja e pun\u00ebs s\u00eb \"prijgajuesve\" \u00ebsht\u00eb fiksuar, por ato rifreskohen shpesh dhe mund t\u00eb p\u00ebrmbajn\u00eb regjistrime t\u00eb mbivendosura n\u00eb t\u00eb gjith\u00eb dritaret.<\/li>\n<\/ul>\n<p>\nM\u00eb pas do t\u00eb m\u00ebsojm\u00eb se si t\u00eb kthejm\u00eb KTable p\u00ebrs\u00ebri n\u00eb KStream p\u00ebr lidhje.<\/p>\n<h3>5.3.3. Lidhja e objekteve KStream dhe KTable<\/h3>\n<p>\nN\u00eb kapitullin 4 diskutuam lidhjen e dy objekteve KStream. Tani na nevojitet t\u00eb m\u00ebsojm\u00eb se si t\u00eb lidhim KTable me KStream. Kjo mund t\u00eb jet\u00eb e nevojshme p\u00ebr nj\u00eb arsye t\u00eb thjesht\u00eb. KStream \u00ebsht\u00eb nj\u00eb rrjedh\u00eb regjistrimesh, nd\u00ebrsa KTable \u00ebsht\u00eb nj\u00eb rrjedh\u00eb azhurnimesh regjistrimesh, por ndonj\u00ebher\u00eb mund t\u00eb jet\u00eb e nevojshme t\u00eb shtoni kontekst shtes\u00eb n\u00eb rrjedh\u00ebn e regjistrimeve p\u00ebrmes azhurnimeve nga KTable.<\/p>\n<p>T\u00eb marrim t\u00eb dh\u00ebnat p\u00ebr numrin e transaksioneve t\u00eb aksioneve dhe t'i lidhim ato me lajmet e aksioneve sipas industrive p\u00ebrkat\u00ebse. Ja se \u00e7far\u00eb duhet t\u00eb b\u00ebni, duke marr\u00eb parasysh kodin e tash\u00ebm.<\/p>\n<ol>\n<li>Transformoni objektin KTable me t\u00eb dh\u00ebnat p\u00ebr numrin e transaksioneve t\u00eb aksioneve n\u00eb KStream duke ndryshuar \u00e7el\u00ebsin me nj\u00eb \u00e7el\u00ebs q\u00eb p\u00ebrfaq\u00ebson industrin\u00eb e p\u00ebrkatshme p\u00ebr k\u00ebt\u00eb simbol aksionesh.<\/li>\n<li>Krijoni nj\u00eb objekt KTable q\u00eb lexon t\u00eb dh\u00ebna nga topic me lajmet e aksioneve. Ky KTable i ri do t\u00eb kategorizohet sipas industrive.<\/li>\n<li>Lidhni azhurnimet e lajmeve me informacionin mbi numrin e transaksioneve t\u00eb aksioneve sipas industrive.<\/li>\n<\/ol>\n<p>\nTani le t\u00eb shohim se si duhet ta zbatojm\u00eb k\u00ebt\u00eb plan veprimi.<\/p>\n<h3>Transformimi i KTable n\u00eb KStream<\/h3>\n<p>\nP\u00ebr t\u00eb transformuar KTable n\u00eb KStream duhen b\u00ebr\u00eb k\u00ebto hapat e m\u00ebposhtme.<\/p>\n<ol>\n<li>Thirrni metod\u00ebn KTable.toStream().<\/li>\n<li>Me an\u00eb t\u00eb thirrjes s\u00eb metod\u00ebs KStream.map, z\u00ebvend\u00ebsoni \u00e7el\u00ebsin me emrin e industris\u00eb, pas s\u00eb cil\u00ebs nxirrni nga instanca Windowed objektin TransactionSummary.<\/li>\n<\/ol>\n<p>\nNe do t'i lidhim k\u00ebto operacione n\u00eb nj\u00eb zinxhir si m\u00eb posht\u00eb (kodi mund t\u00eb gjendet n\u00eb skedarin src\/main\/java\/bbejeck\/chapter_5\/CountingWindowingAndKtableJoinExample.java) (listing 5.8).<\/p>\n<p><img decoding=\"async\" alt=\"Libri \u00abKafka Streams n\u00eb veprim. Aplikacione dhe mikrosherbime p\u00ebr pun\u00eb n\u00eb koh\u00eb reale\u00bb\" src=\"\/wp-content\/uploads\/0d43c2650f6e66e2816ed383da3a29c2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDuke ne ekzekutojm\u00eb operacionin KStream.map, ri-sekcionimi p\u00ebr instanc\u00ebn e kthyer KStream kryhet automatikisht kur p\u00ebrdoret n\u00eb lidhje.<\/p>\n<p>Ne kemi p\u00ebrfunduar procesin e transformimit, tani na nevojitet t\u00eb krijojm\u00eb nj\u00eb objekt KTable p\u00ebr t\u00eb lexuar lajmet e tregut.<\/p>\n<h3>Krijimi i KTable p\u00ebr lajmet e tregut<\/h3>\n<p>\nFatmir\u00ebsisht, p\u00ebr t\u00eb krijuar objektin KTable mjafton nj\u00eb rresht kodi (ky kod mund t\u00eb gjendet n\u00eb skedarin src\/main\/java\/bbejeck\/chapter_5\/CountingWindowingAndKtableJoinExample.java) (listimi 5.9).<\/p>\n<p><img decoding=\"async\" alt=\"Libri \u00abKafka Streams n\u00eb veprim. Aplikacione dhe mikrosherbime p\u00ebr pun\u00eb n\u00eb koh\u00eb reale\u00bb\" src=\"\/wp-content\/uploads\/6e83a393fdc9ab74fda4cbdddddb5213.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nVlen t\u00eb theksohet se nuk nevojiten objekte Serde, pasi n\u00eb konfigurim p\u00ebrdoren Serde t\u00eb stringjeve. Gjithashtu, fal\u00eb p\u00ebrdorimit t\u00eb enumerimit EARLIEST, tabela mbushet me regjistrime q\u00eb n\u00eb fillim.<\/p>\n<p>Tani mund t\u00eb kalojm\u00eb n\u00eb hapin p\u00ebrfundimtar \u2014 lidhjen.<\/p>\n<h3>Lidhja e p\u00ebrdit\u00ebsimeve t\u00eb lajmeve me t\u00eb dh\u00ebnat e numrit t\u00eb transaksioneve<\/h3>\n<p>\nKrijimi i lidhjes nuk p\u00ebrfaq\u00ebson ndonj\u00eb v\u00ebshtir\u00ebsi. Ne do t\u00eb p\u00ebrdorim nj\u00eb lidhje t\u00eb majt\u00eb n\u00eb rast se nuk ka lajme t\u00eb tregut p\u00ebr industrin\u00eb p\u00ebrkat\u00ebse (kode e nevojshme mund t\u00eb gjendet n\u00eb skedarin src\/main\/java\/bbejeck\/chapter_5\/CountingWindowingAndKtableJoinExample.java) (listimi 5.10).<\/p>\n<p><img decoding=\"async\" alt=\"Libri \u00abKafka Streams n\u00eb veprim. Aplikacione dhe mikrosherbime p\u00ebr pun\u00eb n\u00eb koh\u00eb reale\u00bb\" src=\"\/wp-content\/uploads\/92ed70f98927d2f778ad14dbc2a5aa26.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKy operator leftJoin \u00ebsht\u00eb mjaft i thjesht\u00eb. Ndryshe nga lidhjet nga kapitulli 4, metoda JoinWindow nuk p\u00ebrdoret, pasi n\u00eb ekzekutimin e lidhjes KStream-KTable p\u00ebr \u00e7do \u00e7el\u00ebs n\u00eb KTable ekziston vet\u00ebm nj\u00eb regjistrim. Kjo lidhje nuk \u00ebsht\u00eb e kufizuar n\u00eb koh\u00eb: regjistrimi ose ekziston n\u00eb KTable, ose nuk ekziston. P\u00ebrfundimi kryesor: me objekte KTable mund t\u00eb pasurohet KStream me t\u00eb dh\u00ebna referuese q\u00eb p\u00ebrdit\u00ebsohen m\u00eb rrall\u00eb.<\/p>\n<p>Tani do t\u00eb shqyrtojm\u00eb nj\u00eb m\u00ebnyr\u00eb m\u00eb efikase p\u00ebr t\u00eb pasuruar ngjarjet nga KStream.<\/p>\n<h3>5.3.4. Objektet GlobalKTable<\/h3>\n<p>\nSi\u00e7 e kuptuat, ka nevoj\u00eb p\u00ebr pasurimin e rrjedhave t\u00eb ngjarjeve ose p\u00ebr shtimin e kontekstit. N\u00eb kapitullin 4 keni par\u00eb lidhjet e dy objekteve KStream, dhe n\u00eb seksionin e m\u00ebparsh\u00ebm \u2014 lidhjen KStream dhe KTable. N\u00eb t\u00eb gjitha k\u00ebto raste, \u00ebsht\u00eb e nevojshme ri-sekcionimi i rrjedh\u00ebs s\u00eb t\u00eb dh\u00ebnave kur \u00e7el\u00ebsat shnd\u00ebrrohen n\u00eb nj\u00eb lloj ose vler\u00eb t\u00eb re. N sometimese ri-sekcionimi b\u00ebhet n\u00eb m\u00ebnyr\u00eb t\u00eb drejtp\u00ebrdrejt\u00eb, dhe ndonj\u00ebher\u00eb Kafka Streams e b\u00ebn at\u00eb automatikisht. Ri-sekcionimi \u00ebsht\u00eb i nevojsh\u00ebm, pasi \u00e7el\u00ebsat jan\u00eb ndryshuar dhe regjistrimet duhet t\u00eb ndodhen n\u00eb seksione t\u00eb reja, ndryshe lidhja do t\u00eb jet\u00eb e pamundur (kjo u diskutua n\u00eb kapitullin 4, n\u00eb pik\u00ebn 'Ri-sekcionimi i t\u00eb dh\u00ebnave' t\u00eb nenit 4.2.4).<\/p>\n<h3>Risekcioni ka nj\u00eb \u00e7mim<\/h3>\n<p>\nRisekcioni k\u00ebrkon shpenzime - shpenzime shtes\u00eb t\u00eb burimeve p\u00ebr krijimin e temave nd\u00ebrmjet\u00ebsuese, ruajtjen e t\u00eb dh\u00ebnave t\u00eb dyfishta n\u00eb nj\u00eb tem\u00eb tjet\u00ebr; gjithashtu do t\u00eb thot\u00eb rritje t\u00eb vonesave si rezultat i shkrimit dhe leximit nga kjo tem\u00eb. P\u00ebr m\u00eb tep\u00ebr, kur \u00ebsht\u00eb e nevojshme t\u00eb realizohet lidhja p\u00ebr m\u00eb shum\u00eb se nj\u00eb aspekt ose dimension, \u00ebsht\u00eb e nevojshme t\u00eb organizohen lidhjet n\u00eb nj\u00eb zinxhir, t\u00eb shfaqen regjistrimet me \u00e7el\u00ebsa t\u00eb rinj dhe p\u00ebrs\u00ebri t\u00eb realizohet procesi i risekcionimit.<\/p>\n<h3>Lidhja me grupe t\u00eb dh\u00ebnash m\u00eb t\u00eb vogla<\/h3>\n<p>\nN\u00eb disa raste, volume i t\u00eb dh\u00ebnave referuese, me t\u00eb cilat parashikohet lidhja, \u00ebsht\u00eb relativisht i vog\u00ebl, saq\u00eb kopjet e plota t\u00eb tyre mund t\u00eb vendosen lokalisht n\u00eb secilin nga nyjat. P\u00ebr situata t\u00eb tilla, n\u00eb Kafka Streams parashikohet klasa GlobalKTable.<\/p>\n<p>Instancat e GlobalKTable jan\u00eb unike, pasi aplikacioni replikon t\u00eb gjitha t\u00eb dh\u00ebnat n\u00eb \u00e7do nyje. Dhe p\u00ebr shkak se n\u00eb secil\u00ebn nyje jan\u00eb t\u00eb gjitha t\u00eb dh\u00ebnat, nuk ka nevoj\u00eb t\u00eb risekcionohet rrjedha e ngjarjeve sipas \u00e7el\u00ebsit t\u00eb t\u00eb dh\u00ebnave referuese, q\u00eb t\u00eb jet\u00eb i aksesuesh\u00ebm p\u00ebr t\u00eb gjitha sekcionet. Me objektet GlobalKTable \u00ebsht\u00eb gjithashtu e mundur t\u00eb realizohen lidhje pa \u00e7el\u00ebsa. Le t\u00eb kthehemi n\u00eb nj\u00eb nga shembujt e m\u00ebparsh\u00ebm p\u00ebr t\u00eb demonstruar k\u00ebt\u00eb mund\u00ebsi.<\/p>\n<h3>Lidhja e objekteve KStream me objekte GlobalKTable<\/h3>\n<p>\nN\u00eb n\u00ebnkapitullin 5.3.2, ne realizuam agregimin me dritare t\u00eb transaksioneve t\u00eb burs\u00ebs sipas bler\u00ebsve. T\u00eb dh\u00ebnat e k\u00ebtij agregimi duken si n\u00eb vijim:<\/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>\nMegjith\u00ebse k\u00ebto rezultate p\u00ebrputhen me q\u00ebllimin e vendosur, do t\u00eb ishte m\u00eb e dobishme n\u00ebse do t\u00eb shfaqej gjithashtu emri i klientit dhe emri i plot\u00eb i kompanis\u00eb. P\u00ebr t\u00eb shtuar emrin e bler\u00ebsit dhe emrin e kompanis\u00eb, mund t\u00eb realizohen lidhje t\u00eb zakonshme, por kjo do t\u00eb k\u00ebrkonte dy mapime \u00e7el\u00ebsash dhe risekcionim. Me ndihm\u00ebn e GlobalKTable, mund t\u00eb shmangen shpenzimet p\u00ebr k\u00ebto operacione.<\/p>\n<p>P\u00ebr k\u00ebt\u00eb, ne do t\u00eb p\u00ebrdorim objektin countStream nga lista 5.11 (kodi p\u00ebrkat\u00ebs mund t\u00eb gjendet n\u00eb skedarin src\/main\/java\/bbejeck\/chapter_5\/GlobalKTableExample.java), duke e lidhur at\u00eb me dy objekte GlobalKTable.<\/p>\n<p><img decoding=\"async\" alt=\"Libri \u00abKafka Streams n\u00eb veprim. Aplikacione dhe mikrosherbime p\u00ebr pun\u00eb n\u00eb koh\u00eb reale\u00bb\" src=\"\/wp-content\/uploads\/fc4d91bbe062ceb94f5650224840b81e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKemi tashm\u00eb e kemi diskutuar k\u00ebt\u00eb m\u00eb her\u00ebt, prandaj nuk do t\u00eb p\u00ebrs\u00ebris at\u00eb. Por dua t\u00eb theksoj se kodi n\u00eb funksionin toStream().map \u00ebsht\u00eb abstraktizuar n\u00eb nj\u00eb objekt-funksion p\u00ebr leht\u00ebsin\u00eb e leximit n\u00eb vend t\u00eb shprehjeve lambda t\u00eb nodhura.<\/p>\n<p>Hapi tjet\u00ebr \u00ebsht\u00eb shpallja e dy ekzemplar\u00ebve GlobalKTable (kodin e dh\u00ebn\u00eb mund ta gjeni n\u00eb skedarin src\/main\/java\/bbejeck\/chapter_5\/GlobalKTableExample.java) (lista 5.12).<\/p>\n<p><img decoding=\"async\" alt=\"Libri \u00abKafka Streams n\u00eb veprim. Aplikacione dhe mikrosherbime p\u00ebr pun\u00eb n\u00eb koh\u00eb reale\u00bb\" src=\"\/wp-content\/uploads\/db3918895f174c8cfb5fc927b55f87a1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Vini re se emrat e tematizave p\u00ebrshkruhen duke p\u00ebrdorur lloje enumeruese.<\/p>\n<p>Tani, kur kemi p\u00ebrgatitur t\u00eb gjitha komponent\u00ebt, mbetet t\u00eb shkruajm\u00eb kodin p\u00ebr lidhjen (t\u00eb cilin mund ta gjeni n\u00eb skedarin src\/main\/java\/bbejeck\/chapter_5\/GlobalKTableExample.java) (lista 5.13).<\/p>\n<p><img decoding=\"async\" alt=\"Libri \u00abKafka Streams n\u00eb veprim. Aplikacione dhe mikrosherbime p\u00ebr pun\u00eb n\u00eb koh\u00eb reale\u00bb\" src=\"\/wp-content\/uploads\/799360cc99f1920c190a61fd4685d4ff.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nMegjith\u00ebse n\u00eb k\u00ebt\u00eb kod ka dy lidhje, ato jan\u00eb organizuar n\u00eb form\u00eb zinxhiri, sepse ve\u00e7mas asnj\u00eb nga rezultatet e tyre nuk p\u00ebrdoret. Rezultatet paraqiten n\u00eb fund t\u00eb t\u00ebr\u00eb operacionit.<\/p>\n<p>Kur t\u00eb ekzekutoni operacionin e lidhjes t\u00eb m\u00ebsip\u00ebrm, do t\u00eb merrni rezultate t\u00eb tilla:<\/p>\n<pre><code class=\"plaintext\">{customer='Barney, Smith' company=\"Exxon\", transactions= 17}<\/code><\/pre>\n<p>\nThelbi nuk ka ndryshuar, por k\u00ebto rezultate duken m\u00eb t\u00eb qarta.<\/p>\n<p>N\u00ebse num\u00ebroni kapitullin 4, keni par\u00eb disa lloje lidhjesh n\u00eb veprim. Ato jan\u00eb listuar n\u00eb tabel\u00ebn 5.2. Kjo tabel\u00eb reflekton mund\u00ebsit\u00eb e lidhjes, t\u00eb vlefshme p\u00ebr versionin 1.0.0 t\u00eb Kafka Streams; n\u00eb publikimet e ardhshme, mund t\u00eb ndodhin disa ndryshime.<\/p>\n<p><img decoding=\"async\" alt=\"Libri \u00abKafka Streams n\u00eb veprim. Aplikacione dhe mikrosherbime p\u00ebr pun\u00eb n\u00eb koh\u00eb reale\u00bb\" src=\"\/wp-content\/uploads\/8e4cf35c64a8431bda43a5e748de275f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nN\u00eb p\u00ebrfundim, dua t\u00eb rikujtoj esenc\u00ebn: ju mund t\u00eb lidhni rrjedha ngjarjesh (KStream) dhe rrjedha azhurnimesh (KTable) duke p\u00ebrdorur nj\u00eb gjendje lokale. P\u00ebr m\u00eb tep\u00ebr, n\u00ebse madh\u00ebsia e t\u00eb dh\u00ebnave ndihm\u00ebse nuk \u00ebsht\u00eb shum\u00eb e madhe, mund t\u00eb p\u00ebrdorni objektin GlobalKTable. GlobalKTable replikon t\u00eb gjitha seksionet n\u00eb secil\u00ebn nga nodet e aplikacionit Kafka Streams, duke siguruar k\u00ebshtu disponueshm\u00ebrin\u00eb e t\u00eb gjitha t\u00eb dh\u00ebnave, pavar\u00ebsisht nga se cil\u00ebs seksion i p\u00ebrket \u00e7el\u00ebsi.<\/p>\n<p>M\u00eb pas do t\u00eb shohim nj\u00eb mund\u00ebsi t\u00eb Kafka Streams, e cila lejon v\u00ebzhgimin e ndryshimeve t\u00eb gjendjes pa konsumimin e t\u00eb dh\u00ebnave nga tema Kafka.<\/p>\n<h3>5.3.5. Gjendja e disponueshme p\u00ebr pyetje<\/h3>\n<p>\nNe kemi kryer disa operacione me p\u00ebrfshirjen e gjendjes dhe gjithmon\u00eb kemi shfaqur rezultatet n\u00eb konsol\u00eb (p\u00ebr q\u00ebllime zhvillimi) ose i kemi regjistruar n\u00eb nj\u00eb tem\u00eb (p\u00ebr q\u00ebllime industriale). Kur regjistrojm\u00eb rezultatet n\u00eb nj\u00eb tem\u00eb, duhet t\u00eb p\u00ebrdorim konsumatorin Kafka p\u00ebr t'i par\u00eb ato.<\/p>\n<p>Leximi i t\u00eb dh\u00ebnave nga k\u00ebto tema mund t\u00eb konsiderohet si nj\u00eb lloj i pamjeve t\u00eb materializuara (materialized views). P\u00ebr ne, mund t\u00eb p\u00ebrdorim p\u00ebrkufizimin e pamjes s\u00eb materializuar nga \"Wikipedia\": \"... nj\u00eb objekt fizik i baz\u00ebs s\u00eb t\u00eb dh\u00ebnave, q\u00eb p\u00ebrmban rezultatet e ekzekutimit t\u00eb nj\u00eb pyetje. P\u00ebr shembull, ajo mund t\u00eb jet\u00eb nj\u00eb kopje lokale e t\u00eb dh\u00ebnave t\u00eb larg\u00ebta, ose nj\u00eb n\u00ebngrup i rreshtave dhe\/o ose kolonave t\u00eb tabel\u00ebs, ose rezultatet e nj\u00eb bashkimi, ose nj\u00eb tabel\u00eb p\u00ebrmbledh\u00ebse e marr\u00eb p\u00ebrmes agregimit\" (https:\/\/en.wikipedia.org\/wiki\/Materialized_view).<\/p>\n<p>Kafka Streams gjithashtu lejon q\u00eb t\u00eb kryhen pyetje interaktive (interactive queries) n\u00eb depozitat e gjendjes, \u00e7ka ofron mund\u00ebsin\u00eb p\u00ebr t\u00eb lexuar direkt k\u00ebto pamje t\u00eb materializuara. \u00cbsht\u00eb e r\u00ebnd\u00ebsishme t\u00eb theksohet se nj\u00eb pyetje n\u00eb depozit\u00ebn e gjendjes ka natyr\u00ebn e nj\u00eb operacioni \"t\u00eb vet\u00ebm p\u00ebr lexim\". Fal\u00eb k\u00ebsaj, ju mund t\u00eb mos keni frik\u00eb t\u00eb b\u00ebni rast\u00ebsisht gjendjen t\u00eb paq\u00ebndrueshme gjat\u00eb procesimit t\u00eb t\u00eb dh\u00ebnave nga aplikacioni.<\/p>\n<p>Mund\u00ebsia p\u00ebr t\u00eb kryer pyetje direkte n\u00eb depozitat e gjendjes ka r\u00ebnd\u00ebsi t\u00eb madhe. Kjo do t\u00eb thot\u00eb se \u00ebsht\u00eb e mundur t\u00eb krijoni aplikacione \u2014 tabela informuese pa pasur nevoj\u00eb p\u00ebr t\u00eb marr\u00eb s\u00eb pari t\u00eb dh\u00ebnat nga konsumatori i Kafka. Ajo gjithashtu rrit efikasitetin e aplikacionit, sepse nuk \u00ebsht\u00eb e nevojshme t\u00eb shkruhen s\u00ebrish t\u00eb dh\u00ebnat:<\/p>\n<ul>\n<li>m\u00ebnyra q\u00eb t\u00eb dh\u00ebnat jan\u00eb lokale, mund t\u00eb aksesohen shpejt;<\/li>\n<li>duplikimi i t\u00eb dh\u00ebnave eliminohet, sepse ato nuk shkruhen n\u00eb nj\u00eb depo t\u00eb jashtme.<\/li>\n<\/ul>\n<p>\nGj\u00ebja kryesore q\u00eb do t\u00eb doja t\u00eb mbani mend: \u00ebsht\u00eb e mundur t\u00eb b\u00ebni pyetje direkt n\u00eb gjendje nga aplikacioni. Nuk mund t\u00eb n\u00ebnvleft\u00ebsoni mund\u00ebsit\u00eb q\u00eb kjo ju ofron. N\u00eb vend q\u00eb t\u00eb konsumoni t\u00eb dh\u00ebnat nga Kafka dhe t\u00eb ruani regjistrat n\u00eb nj\u00eb baz\u00eb t\u00eb dh\u00ebnash p\u00ebr aplikacionin, mund t\u00eb kryeni pyetje n\u00eb depozitat e gjendjes me t\u00eb nj\u00ebjtin rezultat. Pyetje direkte n\u00eb depozitat e gjendjes n\u00ebnkupton nj\u00eb volum m\u00eb t\u00eb vog\u00ebl kodi (nuk ka konsumator) dhe m\u00eb pak software (nuk ka nevoj\u00eb p\u00ebr nj\u00eb tabel\u00eb bazash p\u00ebr t\u00eb ruajtur rezultatet).<\/p>\n<p>Ne kemi mbuluar nj\u00eb sasi t\u00eb konsiderueshme informacioni n\u00eb k\u00ebt\u00eb kapitull, prandaj p\u00ebrkoh\u00ebsisht do ta ndalim diskutimin ton\u00eb mbi k\u00ebrkesat interaktive p\u00ebr magazinat e gjendjes. Por mos u shqet\u00ebsoni: n\u00eb kapitullin 9 do t\u00eb krijojm\u00eb nj\u00eb aplikacion t\u00eb thjesht\u00eb - nj\u00eb panel informativ me k\u00ebrkesa interaktive. P\u00ebr t\u00eb demonstruar k\u00ebrkesat interaktive dhe mund\u00ebsit\u00eb e shtimit t\u00eb tyre n\u00eb aplikacionet Kafka Streams, do t\u00eb p\u00ebrdoren disa nga shembujt e k\u00ebtij dhe kapitujve t\u00eb m\u00ebparsh\u00ebm.<\/p>\n<h3>CV<\/h3>\n<p><\/p>\n<ul>\n<li>Objektet KStream simbolizojn\u00eb rrjedha ngjarjesh, t\u00eb krahasueshme me insertimet n\u00eb nj\u00eb baz\u00eb t\u00eb dh\u00ebnash. Objektet KTable simbolizojn\u00eb rrjedha p\u00ebrdit\u00ebsimesh, ato jan\u00eb m\u00eb shum\u00eb t\u00eb ngjashme me p\u00ebrdit\u00ebsimet n\u00eb nj\u00eb baz\u00eb t\u00eb dh\u00ebnash. Madh\u00ebsia e objektit KTable nuk rritet, regjistrimet e vjetra z\u00ebvend\u00ebsohen me t\u00eb rejat.<\/li>\n<li>Objektet KTable jan\u00eb t\u00eb nevojshme p\u00ebr operacionet e agregat\u00ebs.<\/li>\n<li>Me operacionet e dritareve mund t\u00eb ndahen t\u00eb dh\u00ebnat e agreguara n\u00eb kosha kohor\u00eb.<\/li>\n<li>P\u00ebrmes objekteve GlobalKTable mund t\u00eb aksesohen t\u00eb dh\u00ebnat referuese n\u00eb \u00e7do pik\u00eb t\u00eb aplikacionit, pavar\u00ebsisht nga ndarja n\u00eb seksione.<\/li>\n<li>Jan\u00eb t\u00eb mundshme lidhje nd\u00ebrmjet objekteve KStream, KTable dhe GlobalKTable.<\/li>\n<\/ul>\n<p>\nDerisa deri tani kemi fokusuar v\u00ebmendjen n\u00eb krijimin e aplikacioneve Kafka Streams duke p\u00ebrdorur DSL-in e nivelit t\u00eb lart\u00eb KStream. Edhe pse qasja e nivelit t\u00eb lart\u00eb lejon krijimin e programeve t\u00eb past\u00ebr dhe t\u00eb ngushta, p\u00ebrdorimi i saj p\u00ebrfaq\u00ebson nj\u00eb kompromis. T\u00eb punosh me DSL KStream do t\u00eb thot\u00eb t\u00eb rris\u00ebsh eleganc\u00ebn e kodit p\u00ebrmes uljes s\u00eb kontrollit. N\u00eb kapitullin tjet\u00ebr do t\u00eb shqyrtojm\u00eb API-n\u00eb e nivelit t\u00eb ul\u00ebt t\u00eb nodit-p\u00ebrpunues dhe do t\u00eb provojm\u00eb kompromise t\u00eb tjera. Programet do t\u00eb b\u00ebhen m\u00eb t\u00eb gjata se m\u00eb par\u00eb, por do t\u00eb kemi mund\u00ebsin\u00eb t\u00eb krijojm\u00eb pothuajse \u00e7do nod-p\u00ebrpunues q\u00eb na nevojitet.<\/p>\n<p>\u2192 M\u00eb shum\u00eb detaje mbi librin mund t\u00eb gjenden n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/collection\/best\/product\/kafka-streams-v-deystvii-prilozheniya-i-mikroservisy-dlya-raboty-v-realnom-vremeni\">faqen e botuesit<\/a><\/noindex><\/p>\n<p>\u2192 P\u00ebr an\u00ebtar\u00ebt e Habr, nj\u00eb zbritje prej 25% me kuponin - <b>Kafka Streams<\/b><\/p>\n<p>\u2192 Pas pages\u00ebs p\u00ebr versionin n\u00eb let\u00ebr t\u00eb librit, d\u00ebrgohet nj\u00eb lib\u00ebr elektronik n\u00eb e-mail.<br \/>\n<br \/>Burimi: <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.2 - 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\/sq\/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) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"sq_AL\" \/>\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\/sq\/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\udd47Libri \u00abKafka Streams n\u00eb veprim. Aplikacione dhe mikrosh\u00ebrbime p\u00ebr pun\u00eb n\u00eb koh\u00eb reale\u00bb | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/sq\/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":"sq_AL","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\/sq\/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\/sq\/wp-json\/wp\/v2\/posts\/35786","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/comments?post=35786"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/35786\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=35786"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=35786"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=35786"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}