{"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 cosa \u00e8 successo","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ciao, Habr!<\/p>\n<p>Ricordiamo che, a seguito del 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 libreria <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 cosa \u00e8 successo\" 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 confini delle possibilit\u00e0 di questo potente strumento. Recentemente \u00e8 stato pubblicato un articolo, di cui vogliamo presentarvi la traduzione. L'autore, basandosi sulla propria esperienza, racconta come trasformare Kafka Streams in uno storage distribuito. Buona lettura!<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex> <br \/>\nLa libreria Apache <noindex><a rel=\"nofollow\" href=\"https:\/\/kafka.apache.org\/documentation\/streams\/\">Kafka Streams<\/a><\/noindex> \u00e8 utilizzata in tutto il mondo nelle aziende per l'elaborazione distribuita in tempo reale sopra Apache Kafka. Uno degli aspetti sottovalutati di questo framework \u00e8 che consente di mantenere uno stato locale, prodotto sulla base dell'elaborazione dei flussi.<\/p>\n<p>In questo articolo vi racconter\u00f2 come la nostra azienda \u00e8 riuscita a sfruttare questa opportunit\u00e0 nella progettazione di un prodotto per la sicurezza delle applicazioni cloud. Con Kafka Streams abbiamo creato microservizi con stato condiviso, ciascuno dei quali funge da fonte di informazioni affidabili e ad alta disponibilit\u00e0 sullo stato degli oggetti nel sistema. Per noi \u00e8 un passo avanti sia in termini di affidabilit\u00e0 che di facilit\u00e0 di manutenzione.<\/p>\n<p>Se siete interessati a un approccio alternativo che consenta di utilizzare un'unica centrale di dati per gestire lo stato formale dei vostri oggetti, leggete, sar\u00e0 interessante\u2026 <\/p>\n<p><b>Perch\u00e9 riteniamo che sia giunto il momento di cambiare il nostro approccio nella gestione dello stato condiviso <\/b><\/p>\n<p>Dovevamo mantenere lo stato di vari oggetti, basandoci sui rapporti degli agenti (ad esempio: il sito ha subito un attacco?). Prima di passare a Kafka Streams, spesso ci affidavamo a un'unica centrale di dati (+ API di 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> il mantenimento della coerenza e della sincronizzazione diventa una vera sfida. Il database pu\u00f2 diventare un collo di bottiglia, oppure trovandosi in <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 cosa \u00e8 successo\" 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 del passaggio a <br \/>\nKafka e Kafka Streams: gli agenti riportano le loro visioni attraverso l'API, lo stato aggiornato viene calcolato tramite una centrale di dati <\/i><\/p>\n<p><b>Incontrate Kafka Streams - ora \u00e8 facile creare microservizi con stato condiviso <\/b><\/p>\n<p>Circa un anno fa abbiamo deciso di rivedere approfonditamente i nostri scenari di lavoro con stati condivisi, per affrontare tali problematiche. Abbiamo subito deciso di provare Kafka Streams \u2013 noto per la sua scalabilit\u00e0, alta disponibilit\u00e0 e robustezza, e per la ricca funzionalit\u00e0 di streaming che offre (trasformazioni, incluso il mantenimento dello stato). Proprio ci\u00f2 di cui avevamo bisogno, senza contare quanto sia matura e affidabile sia diventata nel tempo la rete di messaggistica in Kafka.<\/p>\n<p>Ognuno dei microservizi con mantenimento dello stato che abbiamo creato \u00e8 stato costruito su un'istanza di Kafka Streams con una topologia piuttosto semplice. Essa consisteva in 1) una sorgente 2) un processore con un archivio permanente di chiavi e valori 3) un flusso:<\/p>\n<p><img decoding=\"async\" alt=\"Non solo elaborazione: Come abbiamo trasformato Kafka Streams in un database distribuito e cosa \u00e8 successo\" src=\"\/wp-content\/uploads\/2019\/04\/b6bfdbb87ef774dd914b0e4e60405ec5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Illustrazione 2: la topologia predefinita dei nostri istanze di flusso per i microservizi con mantenimento dello stato. Si prega di notare: qui c'\u00e8 anche un archivio che contiene i metadati riguardanti la pianificazione. <\/i><\/p>\n<p>Con questo nuovo approccio, gli agenti creano i messaggi inviati nel topic sorgente, mentre i consumatori \u2013 ad esempio, un servizio di notifica via email \u2013 ricevono lo stato condiviso calcolato attraverso il flusso (topic di uscita).<\/p>\n<p><img decoding=\"async\" alt=\"Non solo elaborazione: Come abbiamo trasformato Kafka Streams in un database distribuito e cosa \u00e8 successo\" src=\"\/wp-content\/uploads\/2019\/04\/de60549d9cc1d5c0c473364d5236a339.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Illustrazione 3: un nuovo esempio del flusso di lavoro per uno scenario con microservizi condivisi: 1) l'agente genera un messaggio che arriva nel topic sorgente di Kafka; 2) il microservizio con stato condiviso (che utilizza Kafka Streams) lo elabora e scrive lo stato calcolato nel topic di destinazione di Kafka; quindi 3) i consumatori ricevono il nuovo stato.<\/i><\/p>\n<p><b>Ehi, questo archivio integrato di chiavi e valori \u00e8 davvero molto utile!<\/b><\/p>\n<p>Come menzionato in precedenza, la nostra topologia con stato condiviso contiene un archivio di chiavi e valori. Abbiamo trovato diversi usi per esso, e due di questi sono descritti di seguito.<\/p>\n<p><i><b>Opzione #1: utilizzo dell'archivio 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 si potevano mantenere tutti gli ultimi rapporti degli agenti sullo stato di un certo oggetto. Poi, ricevendo un nuovo rapporto da uno degli agenti, potevamo salvarlo, estrarre dall'archivio i rapporti di tutti gli altri agenti sullo stesso oggetto e ripetere il calcolo.<br \/>\nDi seguito, nell'illustrazione 4, si mostra come abbiamo aperto l'accesso all'archivio di chiavi e valori al metodo di elaborazione del processore, in modo da poter gestire un nuovo messaggio.<\/p>\n<p><img decoding=\"async\" alt=\"Non solo elaborazione: Come abbiamo trasformato Kafka Streams in un database distribuito e cosa \u00e8 successo\" src=\"\/wp-content\/uploads\/2019\/04\/8c11f9aac4c616b1ebf59d2fe5431ea0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Illustrazione 4: apertura dell'accesso all'archivio di chiavi e valori per il metodo di elaborazione del processore (dopo questo, in ogni scenario che lavora con stato condiviso, \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 configurato il nostro flusso di lavoro di base, abbiamo iniziato a sviluppare un'API RESTful CRUD per i nostri microservizi con stato condiviso. Volevamo poter estrarre lo stato di alcuni o tutti gli oggetti, cos\u00ec come impostare o rimuovere lo stato di un oggetto (utile per il supporto della parte server).<\/p>\n<p>Per supportare tutte le API Get State, ogni volta che avevamo bisogno di ricalcolare lo stato durante l'elaborazione, lo memorizzavamo a lungo nello storage incorporato chiave-valore. In tal caso, \u00e8 sufficiente implementare un'API usando un'unica istanza di Kafka Streams, come mostrato nel listing sottostante:<\/p>\n<p><img decoding=\"async\" alt=\"Non solo elaborazione: Come abbiamo trasformato Kafka Streams in un database distribuito e cosa \u00e8 successo\" src=\"\/wp-content\/uploads\/2019\/04\/614f601f7b4cf407c2b2a7826e377cbb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Illustrazione 5: utilizzo dello storage incorporato chiave-valore per ottenere lo stato pre-calcolato di un oggetto <\/i><\/p>\n<p>Aggiornare lo stato di un oggetto tramite API non \u00e8 difficile da realizzare. In sostanza, \u00e8 sufficiente creare un produttore Kafka e utilizzarlo per registrare un nuovo stato. In questo modo si garantisce che tutti i messaggi generati tramite API vengano elaborati esattamente come quelli provenienti da altri produttori (ad esempio, agenti).<\/p>\n<p><img decoding=\"async\" alt=\"Non solo elaborazione: Come abbiamo trasformato Kafka Streams in un database distribuito e cosa \u00e8 successo\" src=\"\/wp-content\/uploads\/2019\/04\/0b03bbafb3cf5a41164e9df85b766fcf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Illustrazione 6: \u00e8 possibile definire lo stato dell'oggetto utilizzando il produttore Kafka <\/i><\/p>\n<p><b>Una piccola complicazione: Kafka ha molte partizioni<\/b><\/p>\n<p>In seguito volevamo distribuire il carico associato all'elaborazione e migliorare la disponibilit\u00e0, fornendo a ciascun scenario un cluster di microservizi con stato condiviso. La configurazione \u00e8 stata estremamente semplice: una volta configurati tutti gli istanze per lavorare con lo stesso ID dell'applicazione (e con gli stessi server di avvio), praticamente il resto \u00e8 avvenuto automaticamente. Abbiamo anche specificato che ogni topic sorgente sarebbe composto da pi\u00f9 partizioni, in modo che a ciascuna istanza potesse essere assegnato un sottoinsieme di queste partizioni.<\/p>\n<p>Voglio anche menzionare che \u00e8 comune qui eseguire il backup dello stato di archiviazione, in modo da poter trasferire questa copia su un altro istanza in caso di ripristino. Per ogni stato di archiviazione in Kafka Streams, viene creato un topic replicabile con un registro delle modifiche (che tiene traccia degli aggiornamenti locali). In questo modo, Kafka garantisce continuamente la sicurezza dello stato di archiviazione. Pertanto, in caso di guasto di un'istanza di Kafka Streams, lo stato di archiviazione pu\u00f2 essere rapidamente ripristinato su un'altra istanza, dove andranno le relative partizioni. I nostri test hanno dimostrato che questo avviene in pochi secondi, anche se ci sono milioni di record nello stato di archiviazione.<\/p>\n<p>Passando da un microservizio con stato condiviso a un cluster di microservizi, non \u00e8 cos\u00ec banale implementare il Get State API. In questa nuova situazione, nel repository di stato di ogni microservizio \u00e8 contenuta solo una parte del quadro generale (quegli oggetti i cui chiavi erano mappati su una specifica partizione). Era necessario determinare su quale istanza fosse contenuto lo stato dell'oggetto richiesto, e lo facevamo basandoci sui 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 cosa \u00e8 successo\" 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, identifichiamo da quale istanza richiedere lo stato dell'oggetto desiderato; un approccio simile \u00e8 stato utilizzato con il GET ALL API<\/i><\/p>\n<p><b>Conclusioni principali<\/b><\/p>\n<p>I repository di stato 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 CRUD API <\/li>\n<li>La gestione di pi\u00f9 partizioni diventa un po' pi\u00f9 complessa <\/li>\n<li>\u00c8 anche possibile aggiungere uno o pi\u00f9 repository di stato nella topologia del flusso per memorizzare dati ausiliari. Questa opzione pu\u00f2 essere utilizzata per:<\/li>\n<li>Memorizzare a lungo termine i dati necessari per i calcoli durante l'elaborazione dei flussi <\/li>\n<li>Archiviazione a lungo termine dei dati, che possono essere utili durante la successiva inizializzazione di un'istanza di streaming <\/li>\n<li>molto altro\u2026<\/li>\n<\/ul>\n<p>Grazie a queste e ad altre qualit\u00e0, Kafka Streams \u00e8 particolarmente adatta per supportare uno stato globale in un sistema distribuito come il nostro. Kafka Streams si \u00e8 dimostrata molto affidabile in produzione (da quando \u00e8 stata implementata, praticamente non abbiamo 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.0.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 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!\" \/>\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.0.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 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!\" \/>\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 cosa ne \u00e8 venuto fuori | ProHoster","description":"Ciao, Habr! Vi ricordiamo che, dopo il libro su Kafka, abbiamo pubblicato un lavoro altrettanto interessante sulla libreria Kafka Streams API. Mentre la comunit\u00e0 sta appena iniziando a comprendere i limiti delle capacit\u00e0 di questo potente strumento. Recentemente \u00e8 stato pubblicato un articolo che desideriamo presentarvi. L'autore racconta dalla propria esperienza come trasformare Kafka Streams in uno storage dati distribuito. Buona lettura!","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 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!","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}]}}