{"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\/ro\/blog\/administrirovanie\/ne-tolko-obrabotka-kak-my-sdelali-iz-kafka-streams-raspredelennuyu-bazu-dannyh-i-chto-iz-etogo-vyshlo","title":{"rendered":"Nu doar procesare: Cum am transformat Kafka Streams \u00eentr-o baz\u0103 de date distribuit\u0103 \u0219i ce a rezultat din asta","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Salut, Habr!<\/p>\n<p>V\u0103 reamintim c\u0103, pe l\u00e2ng\u0103 cartea despre <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/product_by_id\/112863410\">Kafka<\/a><\/noindex> am publicat o lucrare la fel de interesant\u0103 despre biblioteca <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=\"Nu doar procesare: Cum am transformat Kafka Streams \u00eentr-o baz\u0103 de date distribuit\u0103 \u0219i ce a rezultat din asta\" src=\"\/wp-content\/uploads\/2019\/04\/7d16ba31ae06a96339a0755b62454f49.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00cen timp ce comunitatea abia \u00eencepe s\u0103 exploreze limitele acestui instrument puternic. Recent a fost publicat un articol, cu traducerea c\u0103ruia vrem s\u0103 v\u0103 familiariz\u0103m. Autorul poveste\u0219te din experien\u021ba proprie cum s\u0103 transformi Kafka Streams \u00eentr-un depozit de date distribuit. Lectur\u0103 pl\u0103cut\u0103!<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex> <br \/>\nBiblioteca Apache <noindex><a rel=\"nofollow\" href=\"https:\/\/kafka.apache.org\/documentation\/streams\/\">Kafka Streams<\/a><\/noindex> este utilizat\u0103 la nivel mondial \u00een mediul enterprise pentru procesarea fluxurilor distribuite pe baza Apache Kafka. Unul dintre aspectele subestimate ale acestui cadru este c\u0103 permite p\u0103strarea unui stat local, generat pe baza proces\u0103rii fluxurilor.<\/p>\n<p>\u00cen acest articol, voi explica cum compania noastr\u0103 a reu\u0219it s\u0103 utilizeze eficient aceast\u0103 oportunitate \u00een dezvoltarea unui produs pentru securitatea aplica\u021biilor cloud. Cu ajutorul Kafka Streams, am creat microservicii cu stare partajat\u0103, fiecare dintre ele servind ca o surs\u0103 de informa\u021bii de \u00eencredere, rezistent\u0103 la erori \u0219i cu disponibilitate ridicat\u0103, despre starea obiectelor din sistem. Pentru noi, acesta a fost un pas \u00eenainte at\u00e2t \u00een ceea ce prive\u0219te fiabilitatea, c\u00e2t \u0219i \u00een confortul \u00eentre\u021binerii.<\/p>\n<p>Dac\u0103 sunte\u021bi interesat de o abordare alternativ\u0103 care permite utilizarea unei baze de date centrale unice pentru a sus\u021bine starea formal\u0103 a obiectelor dumneavoastr\u0103 \u2013 citi\u021bi, va fi interesant... <\/p>\n<p><b>De ce am considerat c\u0103 este timpul s\u0103 ne schimb\u0103m abord\u0103rile \u00een gestionarea st\u0103rii partajate <\/b><\/p>\n<p>Aveam nevoie s\u0103 men\u021binem starea diferitelor obiecte baz\u00e2ndu-ne pe rapoartele agen\u021bilor (de exemplu: a fost un atac asupra site-ului?). \u00cenainte de a migra la Kafka Streams, ne bazam adesea pentru gestionarea st\u0103rii pe o baz\u0103 de date central\u0103 unic\u0103 (+ API de serviciu). Aceast\u0103 abordare are dezavantajele sale: <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/collection\/all\/product\/vysokonagruzhennye-prilozheniya-programmirovanie-masshtabirovanie-podderzhka\">\u00een situa\u021bii intensive din punct de vedere al datelor<\/a><\/noindex> men\u021binerea consisten\u021bei \u0219i sincroniz\u0103rii devine o adev\u0103rat\u0103 provocare. Baza de date poate deveni un blocaj, sau s-ar putea afla \u00eentr-o <noindex><a rel=\"nofollow\" href=\"https:\/\/stackoverflow.com\/questions\/9850336\/database-race-conditions\">stare de competi\u021bie<\/a><\/noindex> \u0219i s\u0103 sufere de imprevizibilitate.<\/p>\n<p><img decoding=\"async\" alt=\"Nu doar procesare: Cum am transformat Kafka Streams \u00eentr-o baz\u0103 de date distribuit\u0103 \u0219i ce a rezultat din asta\" src=\"\/wp-content\/uploads\/2019\/04\/7fd4afa4d56578cf327e6391883933f1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustrarea 1: Un scenariu tipic de separare a st\u0103rii, \u00eent\u00e2lnit \u00eenainte de migrarea la <br \/>\nKafka \u0219i Kafka Streams: agen\u021bii comunic\u0103 viziuni prin API, starea actualizat\u0103 este calculat\u0103 prin baza de date central\u0103. <\/i><\/p>\n<p><b>Cunoa\u0219te\u021bi Kafka Streams \u2013 acum a devenit u\u0219or s\u0103 crea\u021bi microservicii cu stare partajat\u0103. <\/b><\/p>\n<p>Aproape un an \u00een urm\u0103, am decis s\u0103 reg\u00e2ndim seriile noastre de lucru cu starea partajat\u0103 pentru a rezolva astfel de probleme. Imediat am decis s\u0103 \u00eencerc\u0103m Kafka Streams - este binecunoscut\u0103 scalabilitatea, disponibilitatea ridicat\u0103 \u0219i rezilien\u021ba acesteia, precum \u0219i bogata func\u021bionalitate de streaming (inclusiv transform\u0103ri cu p\u0103strarea st\u0103rii). Exact ceea ce ne trebuia, nemaivorbind de c\u00e2t de matur\u0103 \u0219i fiabil\u0103 este sistemul de mesagerie dezvoltat \u00een Kafka.<\/p>\n<p>Fiecare dintre microserviciile noastre cu starea partajat\u0103 era construit pe baza unei instan\u021be Kafka Streams cu o topologie destul de simpl\u0103. Aceasta consta \u00een 1) o surs\u0103 2) un procesor cu un magazin permanent de chei \u0219i valori 3) un flux:<\/p>\n<p><img decoding=\"async\" alt=\"Nu doar procesare: Cum am transformat Kafka Streams \u00eentr-o baz\u0103 de date distribuit\u0103 \u0219i ce a rezultat din asta\" src=\"\/wp-content\/uploads\/2019\/04\/b6bfdbb87ef774dd914b0e4e60405ec5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustrarea 2: topologia implicit\u0103 a instan\u021belor noastre de streaming pentru microserviciile cu starea partajat\u0103. Re\u021bine\u021bi: aici exist\u0103, de asemenea, un magazin care con\u021bine metadate despre programare. <\/i><\/p>\n<p>\u00cen acest nou mod de abordare, agen\u021bii compun mesajele trimise c\u0103tre topicul surs\u0103, iar consumatorii - s\u0103 zicem, serviciul de notific\u0103ri prin po\u0219t\u0103 - primesc starea partajat\u0103 calculat\u0103 prin flux (topicul de ie\u0219ire).<\/p>\n<p><img decoding=\"async\" alt=\"Nu doar procesare: Cum am transformat Kafka Streams \u00eentr-o baz\u0103 de date distribuit\u0103 \u0219i ce a rezultat din asta\" src=\"\/wp-content\/uploads\/2019\/04\/de60549d9cc1d5c0c473364d5236a339.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustrarea 3: un nou exemplu de flux de sarcini pentru un scenariu cu microservicii partajate: 1) agentul genereaz\u0103 un mesaj care ajunge \u00een topicul surs\u0103 Kafka; 2) microserviciul cu starea partajat\u0103 (folosind Kafka Streams) \u00eel proceseaz\u0103 \u0219i scrie starea calculat\u0103 \u00een topicul final Kafka; dup\u0103 care 3) consumatorii primesc noua stare.<\/i><\/p>\n<p><b>Hei, \u0219i acest magazin \u00eencorporat de chei \u0219i valori este cu adev\u0103rat foarte util!<\/b><\/p>\n<p>A\u0219a cum s-a men\u021bionat anterior, topologia noastr\u0103 cu starea partajat\u0103 con\u021bine un magazin de chei \u0219i valori. Am descoperit c\u00e2teva moduri de utilizare a acestuia, iar dou\u0103 dintre ele sunt descrise mai jos.<\/p>\n<p><i><b>Op\u021biunea #1: utilizarea magazinului de chei \u0219i valori \u00een cadrul calculilor.<\/b><\/i><\/p>\n<p>Primul nostru depozit de chei \u0219i valori con\u021binea date auxiliare de care aveam nevoie pentru calcule. De exemplu, \u00een unele cazuri, starea partajat\u0103 era determinat\u0103 pe baza principiului \u201emajorit\u0103\u021bii voturilor\u201d. \u00cen depozit se puteau p\u0103stra toate ultimele rapoarte ale agen\u021bilor despre starea unui anumit obiect. Apoi, primind un nou raport de la un anumit agent, puteam salva raportul, extrage din depozit rapoartele tuturor celorlal\u021bi agen\u021bi despre starea aceluia\u0219i obiect \u0219i repeta calculul.<br \/>\nIlustra\u021bia 4 de mai jos arat\u0103 cum am deschis accesul la depozitul de chei \u0219i valori pentru metoda de procesare a procesorului, astfel \u00eenc\u00e2t s\u0103 putem procesa un nou mesaj.<\/p>\n<p><img decoding=\"async\" alt=\"Nu doar procesare: Cum am transformat Kafka Streams \u00eentr-o baz\u0103 de date distribuit\u0103 \u0219i ce a rezultat din asta\" src=\"\/wp-content\/uploads\/2019\/04\/8c11f9aac4c616b1ebf59d2fe5431ea0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustra\u021bia 4: deschiderea accesului la depozitul de chei \u0219i valori pentru metoda de procesare a procesorului (dup\u0103 aceasta, \u00een fiecare scenariu care lucreaz\u0103 cu st\u0103ri partajate, este necesar s\u0103 se implementeze metoda <code>doProcess<\/code>)<\/i><\/p>\n<p><i><b>Op\u021biunea #2: crearea unui API CRUD deasupra Kafka Streams<\/b><\/i><\/p>\n<p>Dup\u0103 ce ne-am configurat fluxul de sarcini de baz\u0103, am \u00eencercat s\u0103 scriem un API RESTful CRUD pentru microserviciile noastre cu stare partajat\u0103. Am dorit s\u0103 putem extrage starea unora sau a tuturor obiectelor, precum \u0219i s\u0103 stabilim sau s\u0103 \u0219tergem starea unui obiect (acest lucru este util pentru suportul p\u0103r\u021bii server).<\/p>\n<p>Pentru a sus\u021bine toate API-urile Get State, de fiecare dat\u0103 c\u00e2nd trebuia s\u0103 recalcul\u0103m starea \u00een timpul proces\u0103rii, o stocam pe termen lung \u00een depozitul \u00eencorporat de chei \u0219i valori. \u00cen acest caz, devine suficient de simplu s\u0103 implement\u0103m un astfel de API folosind un singur exemplu de Kafka Streams, a\u0219a cum este ilustrat \u00een listingul de mai jos:<\/p>\n<p><img decoding=\"async\" alt=\"Nu doar procesare: Cum am transformat Kafka Streams \u00eentr-o baz\u0103 de date distribuit\u0103 \u0219i ce a rezultat din asta\" src=\"\/wp-content\/uploads\/2019\/04\/614f601f7b4cf407c2b2a7826e377cbb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustra\u021bia 5: utilizarea depozitului \u00eencorporat de chei \u0219i valori pentru ob\u021binerea st\u0103rii pre-calculate a obiectului <\/i><\/p>\n<p>Actualizarea st\u0103rii unui obiect prin API nu este de asemenea greu de realizat. \u00cen principiu, pentru aceasta trebuie doar s\u0103 cre\u0103m un producer Kafka, iar cu acesta s\u0103 facem o scriere care con\u021bine noua stare. Aceasta asigur\u0103 c\u0103 toate mesajele generate prin API vor fi procesate exact la fel ca cele care provin de la al\u021bi produc\u0103tori (de exemplu, agen\u021bi).<\/p>\n<p><img decoding=\"async\" alt=\"Nu doar procesare: Cum am transformat Kafka Streams \u00eentr-o baz\u0103 de date distribuit\u0103 \u0219i ce a rezultat din asta\" src=\"\/wp-content\/uploads\/2019\/04\/0b03bbafb3cf5a41164e9df85b766fcf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustra\u021bia 6: starea unui obiect poate fi stabilit\u0103 prin intermediul unui producer Kafka <\/i><\/p>\n<p><b>O mic\u0103 complica\u021bie: Kafka are multe parti\u021bii<\/b><\/p>\n<p>A\u0219adar, am dorit s\u0103 distribuiem sarcina de procesare \u0219i s\u0103 \u00eembun\u0103t\u0103\u021bim disponibilitatea, oferind pentru fiecare scenariu un cluster de microservicii cu stare partajat\u0103. Configurarea a fost mai simpl\u0103 dec\u00e2t ne-am fi imaginat: dup\u0103 ce am configurat toate instan\u021bele pentru a lucra cu acela\u0219i ID de aplica\u021bie (\u0219i cu acelea\u0219i servere de boot), aproape totul s-a realizat automat. De asemenea, am specificat c\u0103 fiecare topic de intrare va consta din mai multe parti\u021bii, pentru ca fiec\u0103rei instan\u021be s\u0103-i fie atribuit un subset al acestor parti\u021bii.<\/p>\n<p>De asemenea, a\u0219 dori s\u0103 men\u021bionez c\u0103 aici este obi\u0219nuit s\u0103 faci un backup al stoc\u0103rii st\u0103rilor, pentru ca, de exemplu, \u00een caz de recuperare dup\u0103 o defec\u021biune, s\u0103 transferi aceast\u0103 copie pe o alt\u0103 instan\u021b\u0103. Fiecare stocare de stare \u00een Kafka Streams are un topic replicabil creat cu un jurnal de modific\u0103ri (\u00een care se urm\u0103resc actualiz\u0103rile locale). Astfel, Kafka asigur\u0103 constant stocarea st\u0103rilor. Prin urmare, \u00een caz de defec\u021biune a uneia sau alteia dintre instan\u021be, stocarea st\u0103rilor Kafka Streams poate fi recuperat\u0103 rapid pe alt\u0103 instan\u021b\u0103, unde vor fi transferate parti\u021biile corespunz\u0103toare. Testele noastre au ar\u0103tat c\u0103 acest lucru se face \u00een c\u00e2teva secunde, chiar \u0219i atunci c\u00e2nd stocarea con\u021bine milioane de \u00eenregistr\u0103ri.<\/p>\n<p>Trec\u00e2nd de la un singur microserviciu cu stare partajat\u0103 la un cluster de microservicii, devine mai pu\u021bin trivial s\u0103 implement\u0103m Get State API. \u00cen noua situa\u021bie, stocarea st\u0103rilor fiec\u0103rui microserviciu con\u021bine doar o parte din imaginea general\u0103 (acele obiecte ai c\u0103ror chei erau mapate la o anumit\u0103 parti\u021bie). A trebuit s\u0103 determin\u0103m pe ce instan\u021b\u0103 se afla starea obiectului dorit, \u0219i am f\u0103cut acest lucru pe baza metadatelor fluxurilor, a\u0219a cum este prezentat mai jos:<\/p>\n<p><img decoding=\"async\" alt=\"Nu doar procesare: Cum am transformat Kafka Streams \u00eentr-o baz\u0103 de date distribuit\u0103 \u0219i ce a rezultat din asta\" src=\"\/wp-content\/uploads\/2019\/04\/7182a396869f2f9692d895fc5084cccb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustrarea 7: folosind metadatele fluxurilor, determin\u0103m de pe ce instan\u021b\u0103 s\u0103 cerem starea obiectului necesar; o abordare similar\u0103 a fost utilizat\u0103 cu GET ALL API<\/i><\/p>\n<p><b>Concluzii principale<\/b><\/p>\n<p>Stoc\u0103rile st\u0103rilor \u00een Kafka Streams pot de facto servi ca o baz\u0103 de date distribuit\u0103, <\/p>\n<ul>\n<li>replicat\u0103 constant \u00een Kafka<\/li>\n<li>Pe o astfel de sistem, este u\u0219or de construit un CRUD API <\/li>\n<li>Procesarea mai multor parti\u021bii devine pu\u021bin mai complex\u0103 <\/li>\n<li>De asemenea, este posibil s\u0103 ad\u0103uga\u021bi una sau mai multe stoc\u0103ri de stare \u00een topologia de flux pentru a p\u0103stra date auxiliare. Aceast\u0103 op\u021biune poate fi utilizat\u0103 pentru:<\/li>\n<li>Stocarea pe termen lung a datelor necesare pentru calcule \u00een cadrul proces\u0103rii de flux <\/li>\n<li>Stocarea pe termen lung a datelor care pot fi utile la urm\u0103toarea ini\u021bializare a instan\u021bei de flux <\/li>\n<li>multe altele\u2026<\/li>\n<\/ul>\n<p>Datorit\u0103 acestor \u0219i altor avantaje, Kafka Streams este ideal pentru a sprijini starea global\u0103 \u00eentr-o astfel de sistem distribuit ca al nostru. Kafka Streams s-a dovedit a fi foarte fiabil \u00een produc\u021bie (de la implementarea sa, nu am pierdut practic mesaje), \u0219i suntem \u00eencrez\u0103tori c\u0103 posibilit\u0103\u021bile sale nu se limiteaz\u0103 aici!<br \/>\n<br \/>Sursa: <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.1 - 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\/ro\/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.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47 Nu doar procesare: Cum am transformat Kafka Streams \u00eentr-o baz\u0103 de date distribuit\u0103 \u0219i ce a ie\u0219it din asta | ProHoster","description":"Salut, Habr! V\u0103 reamintim c\u0103, dup\u0103 cartea despre Kafka, am lansat o lucrare la fel de interesant\u0103 despre bibliotec\u0103","canonical_url":"https:\/\/prohoster.info\/ro\/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":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/32632","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=32632"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/32632\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/24423"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=32632"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=32632"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=32632"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}