{"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\/it\/blog\/administrirovanie\/ne-tolko-obrabotka-kak-my-sdelali-iz-kafka-streams-raspredelennuyu-bazu-dannyh-i-chto-iz-etogo-vyshlo","title":{"rendered":"Non solo elaborazione: come abbiamo trasformato Kafka Streams in un database distribuito e quale risultato abbiamo ottenuto","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ciao, Habr!<\/p>\n<p>Ricordiamo che, dopo il libro su <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/product_by_id\/112863410\">Kafka<\/a><\/noindex> abbiamo pubblicato un'opera altrettanto interessante sulla 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=\"Non solo elaborazione: come abbiamo trasformato Kafka Streams in un database distribuito e quale risultato abbiamo ottenuto\" src=\"\/wp-content\/uploads\/2019\/04\/7d16ba31ae06a96339a0755b62454f49.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMentre la comunit\u00e0 sta ancora esplorando i limiti delle capacit\u00e0 di questo potente strumento. Recentemente \u00e8 stato pubblicato un articolo di cui vogliamo presentarvi la traduzione. Con la propria esperienza, l'autore racconta come trasformare Kafka Streams in un sistema di archiviazione distribuita dei dati. Buona lettura!<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex> <br \/>\nLa biblioteca Apache <noindex><a rel=\"nofollow\" href=\"https:\/\/kafka.apache.org\/documentation\/streams\/\">Kafka Streams<\/a><\/noindex> \u00e8 utilizzata in tutto il mondo nel settore enterprise per l'elaborazione distribuita in streaming sopra Apache Kafka. Uno degli aspetti sottovalutati di questo framework \u00e8 che consente di memorizzare stati locali, generati sulla base dell'elaborazione in streaming.<\/p>\n<p>In questo articolo spiegher\u00f2 come nella nostra azienda siamo riusciti a sfruttare favorevolmente questa possibilit\u00e0 nello sviluppo di un prodotto per la sicurezza delle applicazioni cloud. Con Kafka Streams abbiamo creato microservizi con stato condiviso, ognuno dei quali funge da fonte resiliente e altamente disponibile di informazioni affidabili sullo stato degli oggetti nel sistema. Per noi \u00e8 un passo avanti sia in termini di affidabilit\u00e0 che di facilit\u00e0 di supporto.<\/p>\n<p>Se siete interessati a un approccio alternativo che consenta di utilizzare un'unica base di dati centrale per mantenere lo stato formale dei vostri oggetti, leggete, sar\u00e0 interessante\u2026 <\/p>\n<p><b>Perch\u00e9 abbiamo ritenuto che fosse giunto il momento di cambiare il nostro approccio al lavoro con stati condivisi <\/b><\/p>\n<p>Avevamo la necessit\u00e0 di mantenere lo stato di diversi oggetti, basandoci sulle segnalazioni degli agenti (ad esempio: il sito \u00e8 stato attaccato?). Prima di passare a Kafka Streams, spesso ci affidavamo a un'unica base di dati centrale (+ API del servizio) per gestire lo stato. Questo approccio ha i suoi svantaggi: in <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/collection\/all\/product\/vysokonagruzhennye-prilozheniya-programmirovanie-masshtabirovanie-podderzhka\">situazioni ad alta intensit\u00e0 di dati<\/a><\/noindex> mantenere la coerenza e la sincronizzazione diventa una vera sfida. Il database pu\u00f2 diventare un collo di bottiglia o trovarsi in uno <noindex><a rel=\"nofollow\" href=\"https:\/\/stackoverflow.com\/questions\/9850336\/database-race-conditions\">stato di competizione<\/a><\/noindex> e soffrire di imprevedibilit\u00e0.<\/p>\n<p><img decoding=\"async\" alt=\"Non solo elaborazione: come abbiamo trasformato Kafka Streams in un database distribuito e quale risultato abbiamo ottenuto\" src=\"\/wp-content\/uploads\/2019\/04\/7fd4afa4d56578cf327e6391883933f1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Illustrazione 1: uno scenario tipico di separazione dello stato riscontrato prima di passare a <br \/>\nKafka e Kafka Streams: gli agenti comunicano le loro rappresentazioni tramite l'API, lo stato aggiornato viene calcolato attraverso il database centrale <\/i><\/p>\n<p><b>Familiarizzate con Kafka Streams: ora \u00e8 facile creare microservizi con stato condiviso <\/b><\/p>\n<p>Circa un anno fa abbiamo deciso di rivedere attentamente i nostri scenari di lavoro con lo stato condiviso, per affrontare tali problematiche. Abbiamo subito deciso di provare Kafka Streams \u2013 \u00e8 nota la sua scalabilit\u00e0, alta disponibilit\u00e0 e resilienza, oltre all'ampia gamma di funzionalit\u00e0 di streaming (trasformazioni, inclusa la conservazione dello stato). Proprio ci\u00f2 che ci serviva, senza contare quanto fosse matura e affidabile la sistema di messaggistica che si \u00e8 sviluppata in Kafka.<\/p>\n<p>Ciascuno dei microservizi con stato condiviso che abbiamo creato si basava su un'istanza di Kafka Streams con una topologia piuttosto semplice. Era composta da 1) una sorgente 2) un processore con uno storage persistente di chiavi e valori 3) uno scarico:<\/p>\n<p><img decoding=\"async\" alt=\"Non solo elaborazione: come abbiamo trasformato Kafka Streams in un database distribuito e quale risultato abbiamo ottenuto\" src=\"\/wp-content\/uploads\/2019\/04\/b6bfdbb87ef774dd914b0e4e60405ec5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Illustrazione 2: la topologia predefinita delle nostre istanze di flusso per i microservizi con stato condiviso. Nota: qui c'\u00e8 anche uno storage che contiene i metadati sulla pianificazione. <\/i><\/p>\n<p>Con questo nuovo approccio, gli agenti compongono i messaggi inviati al topic di origine, mentre i consumatori \u2013 ad esempio, il servizio di notifiche via email \u2013 ricevono lo stato condiviso calcolato tramite lo scarico (topic in uscita).<\/p>\n<p><img decoding=\"async\" alt=\"Non solo elaborazione: come abbiamo trasformato Kafka Streams in un database distribuito e quale risultato abbiamo ottenuto\" src=\"\/wp-content\/uploads\/2019\/04\/de60549d9cc1d5c0c473364d5236a339.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Illustrazione 3: un nuovo esempio di flusso di attivit\u00e0 per uno scenario con microservizi condivisi: 1) l'agente genera un messaggio che entra nel topic di origine di Kafka; 2) il microservizio con stato condiviso (che utilizza Kafka Streams) lo elabora e scrive lo stato calcolato nel topic finale di Kafka; dopo di che 3) i consumatori ricevono il nuovo stato.<\/i><\/p>\n<p><b>Ehi, questo storage di chiavi e valori incorporato \u00e8 davvero molto utile!<\/b><\/p>\n<p>Come accennato in precedenza, la nostra topologia con stato condiviso include uno storage di chiavi e valori. Abbiamo trovato diverse modalit\u00e0 di utilizzo, e due di esse sono descritte di seguito.<\/p>\n<p><i><b>Opzione #1: utilizzo dello storage di chiavi e valori durante i calcoli.<\/b><\/i><\/p>\n<p>Il nostro primo archivio di chiavi e valori conteneva dati ausiliari necessari per i nostri calcoli. Ad esempio, in alcuni casi, lo stato condiviso veniva determinato secondo il principio della 'maggioranza dei voti'. Nell'archivio era possibile tenere tutti gli ultimi rapporti degli agenti sullo stato di un certo oggetto. Poi, ricevuto un nuovo rapporto da un agente, potevamo salvarlo, estrarre dall'archivio i rapporti di tutti gli altri agenti sullo stato dello stesso oggetto e ripetere il calcolo.<br \/>\nDi seguito, nell'illustrazione 4, viene mostrato come abbiamo aperto l'accesso all'archivio di chiavi e valori al metodo di elaborazione del processore, in modo da poter elaborare un nuovo messaggio.<\/p>\n<p><img decoding=\"async\" alt=\"Non solo elaborazione: come abbiamo trasformato Kafka Streams in un database distribuito e quale risultato abbiamo ottenuto\" src=\"\/wp-content\/uploads\/2019\/04\/8c11f9aac4c616b1ebf59d2fe5431ea0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Illustrazione 4: apriamo l'accesso all'archivio di chiavi e valori per il metodo di elaborazione del processore (dopo di che, in ogni scenario che lavora con stati condivisi, \u00e8 necessario implementare il metodo <code>doProcess<\/code>)<\/i><\/p>\n<p><i><b>Opzione #2: creazione di un'API CRUD sopra Kafka Streams<\/b><\/i><\/p>\n<p>Dopo aver impostato il nostro flusso di lavoro di base, abbiamo provato a scrivere un'API RESTful CRUD per i nostri microservizi con stati condivisi. Volevamo poter estrarre lo stato di alcuni o tutti gli oggetti, oltre a impostare o rimuovere lo stato di un oggetto (ci\u00f2 \u00e8 utile per il supporto del backend).<\/p>\n<p>Per supportare tutte le API Get State, ogni volta che era necessario ricalcolare lo stato durante l'elaborazione, lo archiviavamo a lungo nel nostro archivio integrato di chiavi e valori. In questo caso, diventa piuttosto semplice implementare tale API con un'unica istanza di Kafka Streams, come mostrato nel listato seguente:<\/p>\n<p><img decoding=\"async\" alt=\"Non solo elaborazione: come abbiamo trasformato Kafka Streams in un database distribuito e quale risultato abbiamo ottenuto\" src=\"\/wp-content\/uploads\/2019\/04\/614f601f7b4cf407c2b2a7826e377cbb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Illustrazione 5: utilizzo dell'archivio integrato di chiavi e valori per ottenere lo stato pre-calcolato di un oggetto <\/i><\/p>\n<p>L'aggiornamento dello stato di un oggetto tramite API \u00e8 anche facile da implementare. In sostanza, per fare ci\u00f2 \u00e8 necessario solo creare un produttore Kafka e utilizzare questo per effettuare una scrittura contenente il nuovo stato. Questo garantisce che tutti i messaggi generati tramite l'API vengano elaborati esattamente come quelli provenienti da altri produttori (ad es. agenti).<\/p>\n<p><img decoding=\"async\" alt=\"Non solo elaborazione: come abbiamo trasformato Kafka Streams in un database distribuito e quale risultato abbiamo ottenuto\" src=\"\/wp-content\/uploads\/2019\/04\/0b03bbafb3cf5a41164e9df85b766fcf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Illustrazione 6: \u00e8 possibile impostare lo stato di un oggetto utilizzando un produttore Kafka <\/i><\/p>\n<p><b>Una piccola complicazione: Kafka ha molte partizioni<\/b><\/p>\n<p>Successivamente, volevamo distribuire il carico relativo all'elaborazione e migliorare l'accessibilit\u00e0, fornendo un cluster di microservizi con stato condiviso per ciascun scenario. La configurazione si \u00e8 rivelata molto semplice: dopo aver configurato tutte le istanze affinch\u00e9 funzionassero con lo stesso ID dell'applicazione (e con gli stessi server di avvio), praticamente tutto il resto \u00e8 stato fatto automaticamente. Abbiamo anche specificato che ogni topic sorgente sarebbe consistito in pi\u00f9 partizioni, in modo che a ciascuna istanza potesse essere assegnato un sottoinsieme di queste partizioni.<\/p>\n<p>Voglio anche menzionare che qui \u00e8 normale eseguire un backup dello stato, in modo che, ad esempio, nel caso di un ripristino dopo un guasto, si possa trasferire questo backup su un'altra istanza. Per ogni stato in Kafka Streams viene creato un topic replicabile con un log delle modifiche (che tiene traccia degli aggiornamenti locali). In questo modo, Kafka offre continuamente una protezione allo stato. Pertanto, in caso di guasto di una particolare istanza, lo stato di Kafka Streams pu\u00f2 essere rapidamente ripristinato su un'altra istanza, a cui andranno le corrispondenti partizioni. I nostri test hanno mostrato che questo avviene in pochi secondi, anche se nello stato ci sono milioni di registrazioni.<\/p>\n<p>Passando da un microservizio con stato condiviso a un cluster di microservizi, diventa meno banale implementare l'API Get State. Nella nuova situazione, lo stato di ciascun microservizio contiene solo una parte del quadro generale (quegli oggetti i cui chiavi erano assegnati a una specifica partizione). Dobbiamo determinare su quale istanza fosse contenuto lo stato dell'oggetto di nostro interesse, e lo facciamo sulla base dei metadati dei flussi, come mostrato di seguito:<\/p>\n<p><img decoding=\"async\" alt=\"Non solo elaborazione: come abbiamo trasformato Kafka Streams in un database distribuito e quale risultato abbiamo ottenuto\" src=\"\/wp-content\/uploads\/2019\/04\/7182a396869f2f9692d895fc5084cccb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Illustrazione 7: utilizzando i metadati dei flussi, definiamo da quale istanza richiedere lo stato dell'oggetto desiderato; questo approccio \u00e8 stato applicato con l'API GET ALL<\/i><\/p>\n<p><b>Conclusioni principali<\/b><\/p>\n<p>Gli stati in Kafka Streams possono di fatto fungere da database distribuito, <\/p>\n<ul>\n<li>costantemente replicato in Kafka<\/li>\n<li>Sopra un tale sistema \u00e8 facile costruire un API CRUD <\/li>\n<li>La gestione di pi\u00f9 partizioni risulta un po' pi\u00f9 complessa <\/li>\n<li>\u00c8 inoltre possibile aggiungere uno o pi\u00f9 archivi di stato nella topologia del flusso per memorizzare dati ausiliari. Questa opzione pu\u00f2 essere utilizzata per:<\/li>\n<li>La memorizzazione a lungo termine dei dati necessari per i calcoli durante l'elaborazione di flussi <\/li>\n<li>La memorizzazione a lungo termine dei dati che potrebbero essere utili durante la successiva inizializzazione dell'istanza di flusso <\/li>\n<li>molto altro...<\/li>\n<\/ul>\n<p>Grazie a questi e ad altri vantaggi, Kafka Streams \u00e8 particolarmente adatto per supportare uno stato globale in un sistema distribuito come il nostro. Kafka Streams ha dimostrato di essere molto affidabile in produzione (da quando \u00e8 stata distribuita non abbiamo praticamente perso messaggi) e siamo certi che le sue capacit\u00e0 non si limitano a questo!<br \/>\n<br \/>Fonte: <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.1.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\/it\/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.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\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\/it\/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\udd47Non solo elaborazione: Come abbiamo trasformato Kafka Streams in un database distribuito e quali risultati abbiamo ottenuto | ProHoster","description":"Ciao, Habr! Ti ricordiamo che, dopo il libro su Kafka, abbiamo pubblicato un lavoro altrettanto interessante sulla libreria","canonical_url":"https:\/\/prohoster.info\/it\/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":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/32632","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=32632"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/32632\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/24423"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=32632"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=32632"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=32632"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}