{"id":32632,"date":"2019-10-31T21:48:08","date_gmt":"2019-10-31T18:48:08","guid":{"rendered":"https:\/\/prohoster.info\/blog\/ne-tolko-obrabotka-kak-my-sdelali-iz-kafka-streams-raspredelennuyu-bazu-dannyh-i-chto-iz-etogo-vyshlo\/"},"modified":"2019-10-31T21:48:08","modified_gmt":"2019-10-31T18:48:08","slug":"ne-tolko-obrabotka-kak-my-sdelali-iz-kafka-streams-raspredelennuyu-bazu-dannyh-i-chto-iz-etogo-vyshlo","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/ne-tolko-obrabotka-kak-my-sdelali-iz-kafka-streams-raspredelennuyu-bazu-dannyh-i-chto-iz-etogo-vyshlo","title":{"rendered":"Jo vet\u00ebm p\u00ebrpunim: Si e transformuam Kafka Streams n\u00eb nj\u00eb baz\u00eb t\u00eb dh\u00ebnash t\u00eb shp\u00ebrndar\u00eb dhe \u00e7far\u00eb doli prej saj","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>P\u00ebrsh\u00ebndetje, Habr!<\/p>\n<p>Ju kujtojm\u00eb se pas librit p\u00ebr <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/product_by_id\/112863410\">Kafka<\/a><\/noindex> ne l\u00ebshuam nj\u00eb punim t\u00eb pakrahasuesh\u00ebm mbi bibliotek\u00ebn <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/collection\/new\/product\/kafka-streams-v-deystvii-prilozheniya-i-mikroservisy-dlya-raboty-v-realnom-vremeni\">Kafka Streams API<\/a><\/noindex>. <\/p>\n<p><img decoding=\"async\" alt=\"Jo vet\u00ebm p\u00ebrpunim: Si e transformuam Kafka Streams n\u00eb nj\u00eb baz\u00eb t\u00eb dh\u00ebnash t\u00eb shp\u00ebrndar\u00eb dhe \u00e7far\u00eb doli prej saj\" src=\"\/wp-content\/uploads\/2019\/04\/7d16ba31ae06a96339a0755b62454f49.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDerisa komiteti vet\u00ebm po e shqyrton kufijt\u00eb e mund\u00ebsive t\u00eb k\u00ebtij instrumenti t\u00eb fuqish\u00ebm. S\u00eb fundmi, doli nj\u00eb artikull, me p\u00ebrkthimin e t\u00eb cilit d\u00ebshirojm\u00eb t'ju njohim. Autori ndan p\u00ebrvoj\u00ebn e tij se si t\u00eb shnd\u00ebrrohet Kafka Streams n\u00eb nj\u00eb depo t\u00eb shp\u00ebrndar\u00eb t\u00eb t\u00eb dh\u00ebnave. Lexim t\u00eb k\u00ebndsh\u00ebm!<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex> <br \/>\nBiblioteka Apache <noindex><a rel=\"nofollow\" href=\"https:\/\/kafka.apache.org\/documentation\/streams\/\">Kafka Streams<\/a><\/noindex> p\u00ebrdoret n\u00eb t\u00eb gjith\u00eb bot\u00ebn n\u00eb nd\u00ebrmarrje p\u00ebr p\u00ebrpunimin e shp\u00ebrndar\u00eb t\u00eb rrjedhave mbi Apache Kafka. Nj\u00eb nga aspektet e n\u00ebnvler\u00ebsuara t\u00eb k\u00ebtij framework \u00ebsht\u00eb se ai lejon ruajtjen e gjendjes lokale, e cila krijohet mbi baz\u00ebn e p\u00ebrpunimit t\u00eb rrjedhave.<\/p>\n<p>N\u00eb k\u00ebt\u00eb artikull, do t\u00eb flas p\u00ebr m\u00ebnyr\u00ebn se si n\u00eb kompanin\u00eb ton\u00eb arrit\u00ebm ta shfryt\u00ebzojm\u00eb me p\u00ebrfitim k\u00ebt\u00eb mund\u00ebsi n\u00eb zhvillimin e nj\u00eb produkti p\u00ebr sigurin\u00eb e aplikacioneve n\u00eb re. Me ndihm\u00ebn e Kafka Streams, ne krijuam mikrosh\u00ebrbime me gjendje t\u00eb ndar\u00eb, secili prej t\u00eb cil\u00ebve na sh\u00ebrben si nj\u00eb burim i besuesh\u00ebm dhe me disponueshm\u00ebri t\u00eb lart\u00eb p\u00ebr informacionin e sakt\u00eb mbi gjendjen e objekteve n\u00eb sistem. Ky \u00ebsht\u00eb nj\u00eb hap p\u00ebrpara p\u00ebr ne n\u00eb lidhje me q\u00ebndrueshm\u00ebrin\u00eb dhe leht\u00ebsin\u00eb e mb\u00ebshtetjes.<\/p>\n<p>N\u00ebse jeni t\u00eb interesuar p\u00ebr nj\u00eb qasje alternative, e cila lejon p\u00ebrdorimin e nj\u00eb baze t\u00eb dh\u00ebnash qendrore p\u00ebr mb\u00ebshtetje t\u00eb gjendjes formale t\u00eb objekteve tuaja \u2013 lexoni, do t\u00eb jet\u00eb interesante... <\/p>\n<p><b>Pse e konsideruam se erdhi koha t\u00eb ndryshojm\u00eb qasjet tona n\u00eb pun\u00ebn me gjendjen e ndar\u00eb <\/b><\/p>\n<p>Na nevojitej t\u00eb mb\u00ebshtesim gjendjen e objekteve t\u00eb ndryshme, duke u mb\u00ebshtetur n\u00eb raportet e agjent\u00ebve (p.sh.: a ishte faqja n\u00eb sulm)? Deri n\u00eb kalimin n\u00eb Kafka Streams, shpesh kemi mb\u00ebshtetur menaxhimin e gjendjes n\u00eb nj\u00eb baz\u00eb t\u00eb dh\u00ebnash qendrore (+ API sh\u00ebrbimi). Ky qasje ka disa disavantazhe: n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/collection\/all\/product\/vysokonagruzhennye-prilozheniya-programmirovanie-masshtabirovanie-podderzhka\">situata t\u00eb dh\u00ebnash intensive<\/a><\/noindex> mb\u00ebshtetjeja e koherenc\u00ebs dhe sinkronizimit shnd\u00ebrrohet n\u00eb nj\u00eb sfid\u00eb t\u00eb v\u00ebrtet\u00eb. Baza e t\u00eb dh\u00ebnave mund t\u00eb b\u00ebhet nj\u00eb ngushtic\u00eb, ose mund t\u00eb p\u00ebrfundoj\u00eb n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/stackoverflow.com\/questions\/9850336\/database-race-conditions\">nj\u00eb gjendje garash<\/a><\/noindex> dhe t\u00eb vuaj\u00eb nga parashikueshm\u00ebria.<\/p>\n<p><img decoding=\"async\" alt=\"Jo vet\u00ebm p\u00ebrpunim: Si e transformuam Kafka Streams n\u00eb nj\u00eb baz\u00eb t\u00eb dh\u00ebnash t\u00eb shp\u00ebrndar\u00eb dhe \u00e7far\u00eb doli prej saj\" src=\"\/wp-content\/uploads\/2019\/04\/7fd4afa4d56578cf327e6391883933f1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustrimi 1: nj\u00eb skenar tipik i ndarjes s\u00eb gjendjes, i hasur para kalimit n\u00eb <br \/>\nKafka dhe Kafka Streams: agjent\u00ebt raportojn\u00eb p\u00ebrfaq\u00ebsimet e tyre p\u00ebrmes API-s\u00eb, gjendja e p\u00ebrdit\u00ebsuar llogaritet p\u00ebrmes baz\u00ebs qendrore t\u00eb t\u00eb dh\u00ebnave <\/i><\/p>\n<p><b>Njoftohuni me Kafka Streams \u2013 tani \u00ebsht\u00eb e leht\u00eb t\u00eb krijoni mikrosh\u00ebrbime me gjendje t\u00eb ndar\u00eb <\/b><\/p>\n<p>Rreth nj\u00eb vit m\u00eb par\u00eb, ne vendos\u00ebm ta rishqyrtonim me kujdes skenar\u00ebt tan\u00eb t\u00eb pun\u00ebs me gjendjen e ndar\u00eb, p\u00ebr t\u00eb zgjidhur disa probleme. Menj\u00ebher\u00eb vendos\u00ebm t\u00eb provojm\u00eb Kafka Streams \u2013 \u00ebsht\u00eb e njohur sa e shkall\u00ebzueshme, e disponueshme dhe rezistente ndaj d\u00ebshtimeve, dhe sa e pasur \u00ebsht\u00eb funksionaliteti i saj p\u00ebr p\u00ebrpunimin e rrjedhave (p\u00ebrfshir\u00eb transformimet, duke ruajtur gjendjen). Pik\u00ebrisht ajo q\u00eb na duhej, pa p\u00ebrmendur se sa e pjekur dhe e besueshme \u00ebsht\u00eb sistemi i nd\u00ebrrimit t\u00eb mesazheve q\u00eb ndodhet n\u00eb Kafka.<\/p>\n<p>\u00c7do nj\u00ebri nga mikrosh\u00ebrbimet q\u00eb kemi krijuar me ruajtjen e gjendjes \u00ebsht\u00eb nd\u00ebrtuar mbi nj\u00eb instanc\u00eb t\u00eb Kafka Streams me nj\u00eb topologji mjaft t\u00eb thjesht\u00eb. Ai p\u00ebrb\u00ebhej nga 1) burimi 2) procesori me nj\u00eb depo t\u00eb p\u00ebrhershme t\u00eb \u00e7el\u00ebsave dhe vlerave 3) skema:<\/p>\n<p><img decoding=\"async\" alt=\"Jo vet\u00ebm p\u00ebrpunim: Si e transformuam Kafka Streams n\u00eb nj\u00eb baz\u00eb t\u00eb dh\u00ebnash t\u00eb shp\u00ebrndar\u00eb dhe \u00e7far\u00eb doli prej saj\" src=\"\/wp-content\/uploads\/2019\/04\/b6bfdbb87ef774dd914b0e4e60405ec5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustrimi 2: topologjia e parazgjedhur e instancave tona t\u00eb rrjedhave p\u00ebr mikrosh\u00ebrbimet me ruajtjen e gjendjes. Vini re: k\u00ebtu ka gjithashtu nj\u00eb depo q\u00eb p\u00ebrmban metadat\u00eb mbi planifikimin. <\/i><\/p>\n<p>Me k\u00ebt\u00eb qasje t\u00eb re, agjent\u00ebt krijojn\u00eb mesazhe q\u00eb d\u00ebrgohen n\u00eb topikun fillestar, nd\u00ebrsa konsumator\u00ebt \u2013 le t\u00eb themi, sh\u00ebrbimi i njoftimeve me post\u00eb \u2013 pranojn\u00eb gjendjen e ndar\u00eb t\u00eb llogaritur p\u00ebrmes skem\u00ebs (topikut t\u00eb daljes).<\/p>\n<p><img decoding=\"async\" alt=\"Jo vet\u00ebm p\u00ebrpunim: Si e transformuam Kafka Streams n\u00eb nj\u00eb baz\u00eb t\u00eb dh\u00ebnash t\u00eb shp\u00ebrndar\u00eb dhe \u00e7far\u00eb doli prej saj\" src=\"\/wp-content\/uploads\/2019\/04\/de60549d9cc1d5c0c473364d5236a339.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustrimi 3: nj\u00eb shembull i ri i rrjedh\u00ebs s\u00eb detyrave p\u00ebr nj\u00eb skenar me mikrosh\u00ebrbime t\u00eb ndara: 1) agjenti krijon nj\u00eb mesazh q\u00eb d\u00ebrgohet n\u00eb topikun fillestar t\u00eb Kafka; 2) mikrosh\u00ebrbimi me gjendjen e ndar\u00eb (duke p\u00ebrdorur Kafka Streams) e p\u00ebrpunon at\u00eb dhe regjistron gjendjen e llogaritur n\u00eb topikun p\u00ebrfundimtar t\u00eb Kafka; pas k\u00ebsaj, 3) konsumator\u00ebt pranojn\u00eb gjendjen e re.<\/i><\/p>\n<p><b>Hej, dhe kjo depo e integruar e \u00e7el\u00ebsave dhe vlerave n\u00eb t\u00eb v\u00ebrtet\u00eb \u00ebsht\u00eb shum\u00eb e dobishme!<\/b><\/p>\n<p>Si\u00e7 u p\u00ebrmend m\u00eb sip\u00ebr, topologjia jon\u00eb me gjendjen e ndar\u00eb p\u00ebrmban nj\u00eb depo t\u00eb \u00e7el\u00ebsave dhe vlerave. Gjet\u00ebm disa opsione p\u00ebr ta p\u00ebrdorur at\u00eb, dhe dy prej tyre jan\u00eb p\u00ebrshkruar m\u00eb posht\u00eb.<\/p>\n<p><i><b>Opsioni #1: p\u00ebrdorimi i depos s\u00eb \u00e7el\u00ebsave dhe vlerave gjat\u00eb llogaritjeve<\/b><\/i><\/p>\n<p>Depo i par\u00eb i \u00e7el\u00ebsave dhe vlerave p\u00ebrmbante t\u00eb dh\u00ebna ndihm\u00ebse q\u00eb na duheshin p\u00ebr llogaritje. P\u00ebr shembull, n\u00eb disa raste, gjendja e ndar\u00eb p\u00ebrcaktohej n\u00eb baz\u00eb t\u00eb principit t\u00eb \"shumic\u00ebs s\u00eb votave\". N\u00eb depo mund t\u00eb mbaheshin t\u00eb gjitha raportet e fundit t\u00eb agent\u00ebve mbi gjendjen e nj\u00eb objekti t\u00eb caktuar. Pastaj, duke marr\u00eb nj\u00eb raport t\u00eb ri nga ndonj\u00eb agent, ne mund t\u00eb ruanim at\u00eb, t\u00eb nxirrnim nga depo raportet e t\u00eb gjith\u00eb agjenteve t\u00eb tjer\u00eb mbi gjendjen e t\u00eb nj\u00ebjtit objekt dhe t\u00eb p\u00ebrs\u00ebritnim llogaritjen.<br \/>\nN\u00eb ilustrimin 4 m\u00eb posht\u00eb tregohet se si ne hap\u00ebm aksesin n\u00eb depo t\u00eb \u00e7el\u00ebsave dhe vlerave p\u00ebr metod\u00ebn e p\u00ebrpunimit t\u00eb procesorit, n\u00eb m\u00ebnyr\u00eb q\u00eb t\u00eb mund t\u00eb p\u00ebrprocessonim nj\u00eb mesazh t\u00eb ri.<\/p>\n<p><img decoding=\"async\" alt=\"Jo vet\u00ebm p\u00ebrpunim: Si e transformuam Kafka Streams n\u00eb nj\u00eb baz\u00eb t\u00eb dh\u00ebnash t\u00eb shp\u00ebrndar\u00eb dhe \u00e7far\u00eb doli prej saj\" src=\"\/wp-content\/uploads\/2019\/04\/8c11f9aac4c616b1ebf59d2fe5431ea0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustrimi 4: hapja e aksesit n\u00eb depo t\u00eb \u00e7el\u00ebsave dhe vlerave p\u00ebr metod\u00ebn e p\u00ebrpunimit t\u00eb procesorit (pas k\u00ebsaj, n\u00eb \u00e7do skenar q\u00eb punon me gjendje t\u00eb ndar\u00eb, nevojitet implementimi i metod\u00ebs <code>doProcess<\/code>)<\/i><\/p>\n<p><i><b>Varianti #2: krijimi i API CRUD mbi Kafka Streams<\/b><\/i><\/p>\n<p>Pas vendosjes s\u00eb rrjedh\u00ebs son\u00eb bazike t\u00eb detyrave, filluam t\u00eb provonim t\u00eb shkruanim nj\u00eb API RESTful CRUD p\u00ebr mikro-sh\u00ebrbimet tona me gjendje t\u00eb ndar\u00eb. Ne donim q\u00eb t\u00eb ishte e mundur t\u00eb nxirrnim gjendjen e disa ose t\u00eb gjith\u00eb objekteve, si dhe t\u00eb vendosnim ose fshija gjendjen e nj\u00eb objekti (kjo \u00ebsht\u00eb e dobishme p\u00ebr mb\u00ebshtetje n\u00eb an\u00ebn server).<\/p>\n<p>P\u00ebr t\u00eb mb\u00ebshtetur t\u00eb gjith\u00eb API Get State, sa her\u00eb q\u00eb na nevojitej t\u00eb rip\u00ebrcaktonim gjendjen gjat\u00eb p\u00ebrpunimit, ne e ruanim at\u00eb n\u00eb depo t\u00eb integruar t\u00eb \u00e7el\u00ebsave dhe vlerave. N\u00eb k\u00ebt\u00eb rast, b\u00ebhet mjaft e thjesht\u00eb t\u00eb implementosh nj\u00eb API t\u00eb till\u00eb duke p\u00ebrdorur nj\u00eb instanc\u00eb t\u00eb vet\u00ebm t\u00eb Kafka Streams, si\u00e7 tregohet n\u00eb listimin e m\u00ebposht\u00ebm:<\/p>\n<p><img decoding=\"async\" alt=\"Jo vet\u00ebm p\u00ebrpunim: Si e transformuam Kafka Streams n\u00eb nj\u00eb baz\u00eb t\u00eb dh\u00ebnash t\u00eb shp\u00ebrndar\u00eb dhe \u00e7far\u00eb doli prej saj\" src=\"\/wp-content\/uploads\/2019\/04\/614f601f7b4cf407c2b2a7826e377cbb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustrimi 5: p\u00ebrdorimi i depo t\u00eb integruar t\u00eb \u00e7el\u00ebsave dhe vlerave p\u00ebr marrjen e gjendjes paraprakisht t\u00eb llogaritur t\u00eb nj\u00eb objekti <\/i><\/p>\n<p>P\u00ebrdit\u00ebsimi i gjendjes s\u00eb nj\u00eb objekti p\u00ebrmes API gjithashtu nuk \u00ebsht\u00eb e v\u00ebshtir\u00eb t\u00eb implementohet. N\u00eb thelb, p\u00ebr k\u00ebt\u00eb nevojitet vet\u00ebm t\u00eb krijosh nj\u00eb prodhues Kafka dhe me t\u00eb t\u00eb b\u00ebsh nj\u00eb shkruarje, q\u00eb p\u00ebrmban gjendjen e re. K\u00ebshtu sigurohet q\u00eb t\u00eb gjitha mesazhet e gjeneruara p\u00ebrmes API do t\u00eb p\u00ebrpunohen pik\u00ebrisht ashtu si ato q\u00eb vijn\u00eb nga prodhues t\u00eb tjer\u00eb (p.sh., agjent\u00ebve).<\/p>\n<p><img decoding=\"async\" alt=\"Jo vet\u00ebm p\u00ebrpunim: Si e transformuam Kafka Streams n\u00eb nj\u00eb baz\u00eb t\u00eb dh\u00ebnash t\u00eb shp\u00ebrndar\u00eb dhe \u00e7far\u00eb doli prej saj\" src=\"\/wp-content\/uploads\/2019\/04\/0b03bbafb3cf5a41164e9df85b766fcf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustrimi 6: gjendjen e nj\u00eb objekti mund ta caktosh p\u00ebrmes nj\u00eb prodhuesi Kafka <\/i><\/p>\n<p><b>Nj\u00eb komplikim i vog\u00ebl: Kafka ka shum\u00eb parti<\/b><\/p>\n<p>M\u00eb pas, donim t\u00eb shp\u00ebrndanim ngarkes\u00ebn e p\u00ebrpunimit dhe t\u00eb p\u00ebrmir\u00ebsonim disponueshm\u00ebrin\u00eb duke ofruar nj\u00eb grup mikrosh\u00ebrbimesh me gjendje t\u00eb p\u00ebrbashk\u00ebt p\u00ebr \u00e7do skenar. Konfigurimi doli t\u00eb ishte mjaft i thjesht\u00eb: pasi e konfiguruan t\u00eb gjith\u00eb instancat q\u00eb t\u00eb punonin me t\u00eb nj\u00ebjtin ID t\u00eb aplikacionit (dhe me t\u00eb nj\u00ebjtin server t\u00eb ngarkes\u00ebs fillestare), pothuajse gjith\u00e7ka tjet\u00ebr u b\u00eb automatikisht. Ne gjithashtu caktuam q\u00eb \u00e7do tem\u00eb burimi do t\u00eb p\u00ebrb\u00ebhej nga disa pjes\u00eb, p\u00ebr t'i dh\u00ebn\u00eb \u00e7do instance nj\u00eb n\u00ebn-grup t\u00eb k\u00ebtyre pjes\u00ebve.<\/p>\n<p>D\u00ebshiroj gjithashtu t\u00eb p\u00ebrmend se k\u00ebtu \u00ebsht\u00eb e zakonshme t\u00eb b\u00ebhet nj\u00eb kopje rezerv\u00eb e magazin\u00ebs s\u00eb gjendjes, n\u00eb m\u00ebnyr\u00eb q\u00eb, p\u00ebr shembull, n\u00eb rast rikuperimi nga d\u00ebshtimi, t\u00eb mund t\u00eb transferohet kjo kopje n\u00eb nj\u00eb instanc\u00eb tjet\u00ebr. P\u00ebr \u00e7do magazin\u00eb gjendjeje n\u00eb Kafka Streams krijohet nj\u00eb tem\u00eb e replikueshme me nj\u00eb regjist\u00ebr t\u00eb ndryshimeve (n\u00eb t\u00eb cilin ndjeken p\u00ebrdit\u00ebsimet lokale). K\u00ebshtu, Kafka siguron vazhdimisht magazin\u00ebn e gjendjes. Prandaj, n\u00eb rast d\u00ebshtimi t\u00eb nj\u00eb instanc\u00ebs s\u00eb caktuar, magazina e gjendjes s\u00eb Kafka Streams mund t\u00eb rikuperohet shpejt n\u00eb nj\u00eb instanc\u00eb tjet\u00ebr, ku do t\u00eb transferohen pjes\u00ebt p\u00ebrkat\u00ebse. Testet tona treguan se kjo b\u00ebhet n\u00eb pak sekonda edhe n\u00ebse magazina p\u00ebrmban miliona regjistrime.<\/p>\n<p>Duke kaluar nga nj\u00eb mikrosh\u00ebrbim me gjendje t\u00eb p\u00ebrbashk\u00ebt n\u00eb nj\u00eb grup mikrosh\u00ebrbimesh, realizimi i Get State API b\u00ebhet nj\u00eb sfid\u00eb m\u00eb e madhe. N\u00eb situat\u00ebn e re, magazina e gjendjes p\u00ebr \u00e7do mikrosh\u00ebrbim p\u00ebrmban vet\u00ebm nj\u00eb pjes\u00eb t\u00eb panoram\u00ebs s\u00eb p\u00ebrgjithshme (ato objekte, \u00e7el\u00ebsat e t\u00eb cilave jan\u00eb mapuar n\u00eb nj\u00eb pjes\u00eb t\u00eb caktuar). Duhej t\u00eb p\u00ebrcaktonim se n\u00eb cil\u00ebn instanc\u00eb ndodhej gjendja e objektit q\u00eb na nevojitej, dhe ne e b\u00ebm\u00eb k\u00ebt\u00eb mbi baz\u00ebn e metadatave t\u00eb rrjedhave, si\u00e7 tregohet m\u00eb posht\u00eb:<\/p>\n<p><img decoding=\"async\" alt=\"Jo vet\u00ebm p\u00ebrpunim: Si e transformuam Kafka Streams n\u00eb nj\u00eb baz\u00eb t\u00eb dh\u00ebnash t\u00eb shp\u00ebrndar\u00eb dhe \u00e7far\u00eb doli prej saj\" src=\"\/wp-content\/uploads\/2019\/04\/7182a396869f2f9692d895fc5084cccb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustrimi 7: me ndihm\u00ebn e metadatave t\u00eb rrjedhave ne p\u00ebrcaktojm\u00eb se nga cil\u00eb instanc\u00eb duhet t\u00eb k\u00ebrkojm\u00eb gjendjen e objektit n\u00eb fjal\u00eb; nj\u00eb qasje e till\u00eb \u00ebsht\u00eb p\u00ebrdorur me GET ALL API.<\/i><\/p>\n<p><b>Konkluzionet kryesore<\/b><\/p>\n<p>Magazin\u00ebn e gjendjeve n\u00eb Kafka Streams de-facto mund t\u00eb sh\u00ebrbej\u00eb si nj\u00eb baz\u00eb t\u00eb dh\u00ebnash t\u00eb shp\u00ebrndara, <\/p>\n<ul>\n<li>e cila \u00ebsht\u00eb vazhdimisht e replikueshme n\u00eb Kafka<\/li>\n<li>Mbi nj\u00eb sistem t\u00eb till\u00eb leht\u00eb mund t\u00eb nd\u00ebrtohet nj\u00eb CRUD API <\/li>\n<li>P\u00ebrpunimi i shum\u00eb pjes\u00ebve del t\u00eb jet\u00eb pak m\u00eb i komplikuar <\/li>\n<li>\u00cbsht\u00eb gjithashtu e mundur t\u00eb shtoni nj\u00eb ose m\u00eb shum\u00eb depo t\u00eb gjendjeve n\u00eb topologjin\u00eb e p\u00ebrpunimit t\u00eb t\u00eb dh\u00ebnave p\u00ebr ruajtjen e t\u00eb dh\u00ebnave ndihm\u00ebse. Ky variant mund t\u00eb p\u00ebrdoret p\u00ebr:<\/li>\n<li>Ruajtjen afatgjat\u00eb t\u00eb t\u00eb dh\u00ebnave t\u00eb nevojshme p\u00ebr llogaritjet gjat\u00eb p\u00ebrpunimit t\u00eb t\u00eb dh\u00ebnave n\u00eb rrjedh\u00eb <\/li>\n<li>Ruajtjen afatgjat\u00eb t\u00eb t\u00eb dh\u00ebnave q\u00eb mund t\u00eb jen\u00eb t\u00eb dobishme gjat\u00eb inicializimit t\u00eb ardhsh\u00ebm t\u00eb instanc\u00ebs s\u00eb rrjedh\u00ebs <\/li>\n<li>shum\u00eb gj\u00ebra t\u00eb tjera\u2026<\/li>\n<\/ul>\n<p>Me k\u00ebto dhe n\u00ebnt\u00eb t\u00eb tjera, Kafka Streams \u00ebsht\u00eb jasht\u00ebzakonisht e p\u00ebrshtatshme p\u00ebr t\u00eb mb\u00ebshtetur gjendjen globale n\u00eb nj\u00eb sistem t\u00eb till\u00eb t\u00eb shp\u00ebrndar\u00eb si i yni. Kafka Streams ka treguar stabilitet t\u00eb shk\u00eblqyer n\u00eb prodhim (q\u00eb nga vendosja e saj nuk kemi humbur praktikisht asnj\u00eb mesazh), dhe ne jemi t\u00eb bindur se mund\u00ebsit\u00eb e saj nuk kufizohen vet\u00ebm k\u00ebtu!<br \/>\n<br \/>Burimi: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/piter\/blog\/449928\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0432\u0441\u043b\u0435\u0434 \u0437\u0430 \u043a\u043d\u0438\u0433\u043e\u0439 \u043e Kafka \u043c\u044b \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0442\u0440\u0443\u0434 \u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 Kafka Streams API. \u041f\u043e\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0449\u043d\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430. \u0422\u0430\u043a, \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u0432\u044b\u0448\u043b\u0430 \u0441\u0442\u0430\u0442\u044c\u044f, \u0441 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u043c \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0432\u0430\u0441 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c. \u041d\u0430 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u043e\u043f\u044b\u0442\u0435 \u0430\u0432\u0442\u043e\u0440 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0437 Kafka Streams \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u0440\u0438\u044f\u0442\u043d\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f! [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":24423,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-32632","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0432\u0441\u043b\u0435\u0434 \u0437\u0430 \u043a\u043d\u0438\u0433\u043e\u0439 \u043e Kafka \u043c\u044b \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0442\u0440\u0443\u0434 \u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/ne-tolko-obrabotka-kak-my-sdelali-iz-kafka-streams-raspredelennuyu-bazu-dannyh-i-chto-iz-etogo-vyshlo\" \/>\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\u041d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430: \u041a\u0430\u043a \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0438\u0437 Kafka Streams \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u0447\u0442\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0448\u043b\u043e | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0432\u0441\u043b\u0435\u0434 \u0437\u0430 \u043a\u043d\u0438\u0433\u043e\u0439 \u043e Kafka \u043c\u044b \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0442\u0440\u0443\u0434 \u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/ne-tolko-obrabotka-kak-my-sdelali-iz-kafka-streams-raspredelennuyu-bazu-dannyh-i-chto-iz-etogo-vyshlo\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:48:08+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:48:08+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Jo vet\u00ebm p\u00ebrpunim: Si e b\u00ebm\u00eb Kafka Streams nj\u00eb baz\u00eb t\u00eb dh\u00ebnash t\u00eb shp\u00ebrndar\u00eb, dhe \u00e7far\u00eb ndodhi prej saj | ProHoster","description":"P\u00ebrsh\u00ebndetje, Habr! T\u00eb kujtojm\u00eb se pas librit rreth Kafka-s, kemi l\u00ebshuar nj\u00eb pun\u00eb po aq interesante mbi bibliotek\u00ebn","canonical_url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/ne-tolko-obrabotka-kak-my-sdelali-iz-kafka-streams-raspredelennuyu-bazu-dannyh-i-chto-iz-etogo-vyshlo","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"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\u041d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430: \u041a\u0430\u043a \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0438\u0437 Kafka Streams \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u0447\u0442\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0448\u043b\u043e | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0432\u0441\u043b\u0435\u0434 \u0437\u0430 \u043a\u043d\u0438\u0433\u043e\u0439 \u043e Kafka \u043c\u044b \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0442\u0440\u0443\u0434 \u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435","og:url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/ne-tolko-obrabotka-kak-my-sdelali-iz-kafka-streams-raspredelennuyu-bazu-dannyh-i-chto-iz-etogo-vyshlo","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:48:08+00:00","article:modified_time":"2019-10-31T18:48:08+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"32632","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 11:51:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:55:24","updated":"2026-01-21 11:51:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/32632","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=32632"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/32632\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media\/24423"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=32632"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=32632"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=32632"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}