{"id":26780,"date":"2020-04-22T00:00:00","date_gmt":"2020-04-21T22:00:00","guid":{"rendered":"https:\/\/blexin.com\/?p=26780"},"modified":"2021-05-21T20:28:16","modified_gmt":"2021-05-21T18:28:16","slug":"la-metamorfosi-della-comunicazione-con-kafka","status":"publish","type":"post","link":"https:\/\/blexin.com\/it\/blog\/la-metamorfosi-della-comunicazione-con-kafka\/","title":{"rendered":"\u201cLa Metamorfosi\u201d della comunicazione con Kafka"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"608\" data-attachment-id=\"26782\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/la-metamorfosi-della-comunicazione-con-kafka\/attachment\/a02436f4-6edd-4491-856a-c1985e9aa754\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/a02436f4-6edd-4491-856a-c1985e9aa754.png?fit=1024%2C608&amp;ssl=1\" data-orig-size=\"1024,608\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"a02436f4-6edd-4491-856a-c1985e9aa754\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/a02436f4-6edd-4491-856a-c1985e9aa754.png?fit=1024%2C608&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/a02436f4-6edd-4491-856a-c1985e9aa754.png?resize=1024%2C608&#038;ssl=1\" alt=\"\" class=\"wp-image-26782\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/a02436f4-6edd-4491-856a-c1985e9aa754.png 1024w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/a02436f4-6edd-4491-856a-c1985e9aa754-980x582.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/a02436f4-6edd-4491-856a-c1985e9aa754-480x285.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Nei miei precedenti articoli, abbiamo visto come sia utile utilizzare tecnologie e soluzioni per la comunicazione come&nbsp;<a href=\"https:\/\/www.blexin.com\/it-IT\/Article\/Blog\/Disaccoppiare-la-comunicazione-con-RabbitMQ-40\" target=\"_blank\" rel=\"noreferrer noopener\">RabbitMQ<\/a>&nbsp;o un ESB (<em>Enterprise Service Bus<\/em>) come&nbsp;<a href=\"https:\/\/www.blexin.com\/it-IT\/Article\/Blog\/Risolviamo-il-rebus-della-comunicazione-56\" target=\"_blank\" rel=\"noreferrer noopener\">Rebus<\/a>, siano essi on premise o cloud, per disaccoppiare la comunicazione nei sistemi software.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Non molti anni fa, in Linkedin provarono ad utilizzare&nbsp;<a href=\"https:\/\/activemq.apache.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">ActiveMQ<\/a>&nbsp;per tentare di risolvere un problema relativo all\u2019accesso in tempo reale a dati di monitoring e di tracciabilit\u00e0 delle attivit\u00e0 degli utenti, che, peraltro, presentavano anche delle correlazioni tra essi. La prova non and\u00f2 a buon fine, in quanto, con&nbsp;<em>ActiveMQ<\/em>, non riuscivano a scalare per gestire l\u2019enorme quantit\u00e0 di traffico. Decisero, quindi, di sviluppare un sistema di messaggistica che prevedesse sia la persistenza dei messaggi, in modo da renderli fruibili a pi\u00f9 applicazioni, sia la possibilit\u00e0 di scalare orizzontalmente in modo da gestire una grossa quantit\u00e0 di dati. Infine decisero di dargli un nome di uno scrittore che suonasse bene e fu cos\u00ec che nacque&nbsp;<em>Kafka&nbsp;<\/em>(<a href=\"https:\/\/www.oreilly.com\/library\/view\/kafka-the-definitive\/9781491936153\/ch01.html\" target=\"_blank\" rel=\"noreferrer noopener\">Kafka: The Definitive Guide<\/a>).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Concetti fondamentali<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Inizialmente, \u00e8 stato dunque creato come un \u201cdistributed publish\/subscribe messaging system\u201d fino ad evolversi in una piattaforma di streaming distribuita. Di base, avremo un&nbsp;<em>Publisher<\/em>&nbsp;(<em>Producer<\/em>) che pubblica messaggi su di un&nbsp;<em>Broker<\/em>&nbsp;(<em>Kafka Broker<\/em>) e un&nbsp;<em>Subscriber<\/em>&nbsp;(<em>Consumer<\/em>) che si sottoscrive ad essi.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"989\" height=\"431\" data-attachment-id=\"26784\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/la-metamorfosi-della-comunicazione-con-kafka\/attachment\/image-0\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-0.png?fit=989%2C431&amp;ssl=1\" data-orig-size=\"989,431\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image-0\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-0.png?fit=989%2C431&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-0.png?resize=989%2C431&#038;ssl=1\" alt=\"\" class=\"wp-image-26784\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image-0.png 989w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image-0-980x427.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image-0-480x209.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 989px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Il&nbsp;<em>messaggio<\/em>&nbsp;\u00e8 l\u2019unit\u00e0 di informazione che viaggia in Kafka e non \u00e8 altro che un array di byte che, opzionalmente, pu\u00f2 essere accompagnato da una&nbsp;<em>key<\/em>&nbsp;utilizzata per gestire la scrittura del messaggio. In genere, per motivi di efficienza, in Kafka si preferisce trasmettere messaggi in&nbsp;<em>batch<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Quando un broker riceve un messaggio da un producer, lo categorizza in un&nbsp;<em>Topic<\/em>. Di fatto, il topic \u00e8 la rappresentazione effettiva dello&nbsp;<em>stream<\/em>&nbsp;di dati che passa dal producer al consumer. I topic sono a loro volta suddivisi in&nbsp;<em>partitions<\/em>. Una partizione \u00e8 una sequenza ordinata ed immutabile di messaggi che vengono immagazzinati uno dopo l\u2019altro e che pu\u00f2 essere letta solo nell\u2019ordine in cui sono stati scritti. Infatti, i messaggi non saranno ordinati all\u2019interno del topic ma lo saranno a livello di partizioni, assegnando ad ogni messaggio un&nbsp;<em>id<\/em>&nbsp;univoco detto&nbsp;<em>Offset<\/em>. Le partizioni, oltre a garantire l\u2019ordine dei messaggi, sono anche uno strumento di ridondanza e scalabilit\u00e0, in quanto possono essere replicati all\u2019interno di Kafka.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"909\" height=\"623\" data-attachment-id=\"26787\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/la-metamorfosi-della-comunicazione-con-kafka\/attachment\/image-1\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-1.png?fit=909%2C623&amp;ssl=1\" data-orig-size=\"909,623\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image-1\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-1.png?fit=909%2C623&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-1.png?resize=909%2C623&#038;ssl=1\" alt=\"\" class=\"wp-image-26787\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image-1.png 909w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image-1-480x329.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 909px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Infatti, l\u2019idea di base \u00e8 che un broker Kafka operi come parte di un&nbsp;<em>Cluster<\/em>&nbsp;di broker eseguiti su uno o pi\u00f9 server. Un cluster ha il compito di ricevere i messaggi, salvarli nei topic per un&nbsp;<em>retention period<\/em>&nbsp;configurabile e assegnare gli offset all\u2019interno delle partizioni. Le partizioni possono essere replicate all\u2019interno del cluster e per ogni partizione ci sar\u00e0 un solo broker che far\u00e0 da&nbsp;<em>leader<\/em>, ovvero gestir\u00e0 i messaggi per quella partizioni, mentre gli altri broker, su cui la partizione \u00e8 replicata, agiranno da&nbsp;<em>followers,<\/em>&nbsp;salvando copie in maniera passiva rispetto al leader. Questo \u00e8 molto importante, perch\u00e9 se il broker leader fallisce, uno dei followers pu\u00f2 essere eletto come tale e quindi permettere al cluster di funzionare correttamente.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"830\" height=\"514\" data-attachment-id=\"26790\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/la-metamorfosi-della-comunicazione-con-kafka\/attachment\/image-2-2\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-2.png?fit=830%2C514&amp;ssl=1\" data-orig-size=\"830,514\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image-2\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-2.png?fit=830%2C514&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-2.png?resize=830%2C514&#038;ssl=1\" alt=\"\" class=\"wp-image-26790\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image-2.png 830w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image-2-480x297.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 830px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Come ulteriore meccanismo di&nbsp;<em>fault-tolerance,<\/em>&nbsp;uno dei broker all\u2019interno del cluster svolger\u00e0 il ruolo di&nbsp;<em>controller<\/em>&nbsp;e si occuper\u00e0 di assegnare le partizioni agli altri broker e di vigilare sullo stato di salute dei componenti del cluster.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Abbiamo detto che i messaggi sono pubblicati dai P<em>roducer<\/em>. Un Producer, oltre a creare lo stream di dati, ha la facolt\u00e0 di scegliere in quale partizione scrivere un determinato messaggio mediante un&nbsp;<em>partitioner<\/em>. La scelta di solito \u00e8 basata sulla key del messaggio: se la chiave non \u00e8 specificata il partitioner sceglier\u00e0 la partizione secondo uno scheduling&nbsp;<em>round-robin (RR)<\/em>&nbsp;per bilanciare il carico; altrimenti, se la chiave non \u00e8 nulla, il partitioner potr\u00e0 instradare i messaggi verso partizioni specifiche, ad esempio, facendo l\u2019hash della chiave in modo che i messaggi con lo stesso valore di hash siano scritti nella stessa partizione.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lo stream di messaggi sar\u00e0 consumato da quei software, i&nbsp;<em>consumer<\/em>, che si sottoscrivono ad un determinato topic e ne prelevano i messaggi ordinati grazie all\u2019utilizzo dell\u2019offset di cui abbiamo parlato. Infatti, quando un consumer inizia a consumare i messaggi di una partizione, viene creato un topic particolare chiamato&nbsp;<em>_consumer_offsets,&nbsp;<\/em>dove salva l\u2019offset dell\u2019ultimo messaggio consumato e mantiene quindi uno stato della sua lettura.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Anche i consumer sono pensati per operare come parte di un un insieme, chiamato&nbsp;<em>Consumer Group<\/em>. Un Consumer Group \u00e8 formato da uno o pi\u00f9 consumer che lavorano insieme per consumare in maniera pi\u00f9 efficiente i messaggi all\u2019interno di un topic dividendosi tra loro le partizioni in maniera equa. Infatti, se uno dei consumer del gruppo fallisce, la sua parte viene distribuita tra gli altri consumers. Oltre ad avere pi\u00f9 consumer all\u2019interno di un gruppo, si possono avere anche pi\u00f9 gruppi che consumano messaggi di un topic. Questo \u00e8 molto utile quando ci sono pi\u00f9 applicazioni interessate ai messaggi di un determinato topic.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il concetto di Consumer Group consente di generalizzare i vantaggi dei sistemi tradizionali di messaggistica: come in un sistema a coda \u00e8 possibile dividere il processamento tra vari consumer e ci\u00f2 viene fatto attraverso le varie istanze di consumer all\u2019interno del gruppo; come in un sistema publish\/subscribe i messaggi possono essere letti da pi\u00f9 Consumer Group.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In questo modo, \u00e8 possibile garantire sia la scalabilit\u00e0 per l\u2019elaborazione sia l\u2019affidabilit\u00e0 per la consegna a pi\u00f9 User Group e quindi a pi\u00f9 applicazioni interessate. Inoltre, con il concetto di partizione, Kafka garantisce l\u2019ordine dei messaggi anche con pi\u00f9 consumer, a differenza di un sistema pi\u00f9 tradizionale come quello a coda, in cui i messaggi sono consegnati in maniera asincrona e quindi in presenza di pi\u00f9 consumer non \u00e8 possibile garantire l\u2019ordinamento.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Facciamo un esempio<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Introdotti tutti i concetti chiave di Kafka, vediamo un esempio di publish\/subscribe realizzato in&nbsp;<em>.NET Core<\/em>. Per il server kafka, utilizzeremo un\u2019 immagine istanziata su un&nbsp;<em>container Docker<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Per fare in modo che un server kafka funzioni correttamente, dobbiamo innanzitutto assicurarci che sia collegato ad un\u2019istanza&nbsp;<em>Zookeeper<\/em>. Zookeeper \u00e8 un servizio centralizzato che gestisce le configurazioni e la sincronizzazioni in applicazioni distribuite. Kafka utilizza Zookeeper per salvare metadati relativi ai broker, ai topics e alle partizioni.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Quindi creiamo un container docker per Zookeeper lanciando il seguente comando da terminale dove andiamo a specificare la porta ed un server&nbsp;<em>id<\/em>:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\ndocker run --net=kafka \\\n-d \\\n--name=zookeeper \\\n-e ZOOKEEPER_CLIENT_PORT=2181 \\\n-e ZOOKEEPER_SERVER_ID=1 \\\nconfluentinc\/cp-zookeeper:5.4.1\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Successivamente, creiamo il container per il server Kafka specificando l\u2019indirizzo di Zookeeper, un indirizzo dove raggiungere Kafka al di fuori del container e il valore di replicazione dei topic da specificare in caso di cluster single-node:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\ndocker run --net=kafka \\\n-d \\\n-p 9092:9092 \\\n--name=kafka \\\n-e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 \\\n-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT:\/\/localhost:9092 \\\n-e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 \\\nconfluentinc\/cp-kafka:5.4.\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Creiamo un topic con tre partizioni con il seguente comando:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\ndocker exec -it kafka kafka-topics --bootstrap-server localhost:9092 --create --topic demo-topic --partitions 3\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">per vedere il risultato utilizziamo invece:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\ndocker exec -it kafka kafka-topics --describe --bootstrap-server localhost:9092\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"641\" height=\"74\" data-attachment-id=\"26794\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/la-metamorfosi-della-comunicazione-con-kafka\/attachment\/image-3\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-3.png?fit=641%2C74&amp;ssl=1\" data-orig-size=\"641,74\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image-3\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-3.png?fit=641%2C74&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-3.png?resize=641%2C74&#038;ssl=1\" alt=\"\" class=\"wp-image-26794\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image-3.png 641w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image-3-480x55.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 641px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Una volta creato il topic, realizziamo una&nbsp;<em>console application<\/em>&nbsp;che svolger\u00e0 il compito di&nbsp;<em>Producer<\/em>. Utilizzeremo il&nbsp;<em>client<\/em>&nbsp;di Kafka per&nbsp;<em>.NET ,Confluent.Kafka,<\/em>&nbsp;messo a disposizione da&nbsp;<a rel=\"noreferrer noopener\" href=\"https:\/\/www.confluent.io\/\" target=\"_blank\">Confluent<\/a>.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nusing System;\nusing System.Threading.Tasks;\nusing Confluent.Kafka;\n\u00a0\nnamespace Kafka.Producer\n{\n\u00a0\u00a0\u00a0\u00a0class Program\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0static async Task Main(string&#x5B;] args)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var config = new ProducerConfig { BootstrapServers = &quot;localhost:9092&quot;, Partitioner = Partitioner.Random };\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0using (var producer = new ProducerBuilder&lt;Null, string&gt;(config).Build())\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0try\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for (int i = 0; i &lt; 5; i++)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var deliveryResult = await producer.ProduceAsync(&quot;demo-topic&quot;, new Message&lt;Null, string&gt; { Value = $&quot;DemoMessage &#039;{i}&#039;&quot; });\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Console.WriteLine($&quot;Published message to &#039;{deliveryResult.TopicPartitionOffset}&#039;&quot;);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0catch (ProduceException&lt;Null, string&gt; e)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Console.WriteLine($&quot;Error publishing message: {e.Error.Reason}&quot;);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0}\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Configuriamo il Producer indicando l\u2019indirizzo del server Kafka ed il tipo di Partitioner (in questo caso&nbsp;<em>Random<\/em>&nbsp;attuer\u00e0 uno scheduling&nbsp;<em>RR<\/em>&nbsp;). Creiamo quindi un Producer mediante il&nbsp;<em>ProducerBuilder<\/em>&nbsp;con chiave nulla, avendo scelto un partitioner non basato su chiave.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tramite il metodo&nbsp;<em>ProduceAsync<\/em>() inviamo i messaggi su \u201cdemo-topic\u201d e stampiamo in console il risultato della scrittura, in modo da visualizzare in quale partizione e in quale offset sono stati salvati i messaggi.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Eseguendo il programma otteniamo il seguente risultato :<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"641\" height=\"108\" data-attachment-id=\"26796\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/la-metamorfosi-della-comunicazione-con-kafka\/attachment\/image-4\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-4.png?fit=641%2C108&amp;ssl=1\" data-orig-size=\"641,108\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image-4\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-4.png?fit=641%2C108&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-4.png?resize=641%2C108&#038;ssl=1\" alt=\"\" class=\"wp-image-26796\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image-4.png 641w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image-4-480x81.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 641px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Con il comando seguente andiamo ad utilizzare il console consumer di Kafka, un tool che legge i messaggi all\u2019interno del topic e li riporta sulla console:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\ndocker exec -it kafka kafka-console-consumer --bootstrap-server localhost:9092 --topic demo-topic --from-beginning\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"837\" height=\"86\" data-attachment-id=\"26799\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/la-metamorfosi-della-comunicazione-con-kafka\/attachment\/image-5\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-5.png?fit=837%2C86&amp;ssl=1\" data-orig-size=\"837,86\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image-5\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-5.png?fit=837%2C86&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-5.png?resize=837%2C86&#038;ssl=1\" alt=\"\" class=\"wp-image-26799\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image-5.png 837w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image-5-480x49.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 837px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Come possiamo vedere, i messaggi non sono mostrati in ordine perch\u00e9, come abbiamo detto, l\u2019ordine \u00e8 a livello di partizione, non di topic. Possiamo vedere ci\u00f2 con il seguente comando relativo alla partizione 2:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\ndocker exec -it kafka kafka-console-consumer --bootstrap-server localhost:9092 --topic demo-topic --from-beginning --partition 2\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"934\" height=\"57\" data-attachment-id=\"26802\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/la-metamorfosi-della-comunicazione-con-kafka\/attachment\/image-6\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-6.png?fit=934%2C57&amp;ssl=1\" data-orig-size=\"934,57\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image-6\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-6.png?fit=934%2C57&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-6.png?resize=934%2C57&#038;ssl=1\" alt=\"\" class=\"wp-image-26802\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image-6.png 934w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image-6-480x29.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 934px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Come possiamo vedere risultano ordinati. Creiamo adesso l\u2019applicazione consumer:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nusing System;\nusing Confluent.Kafka;\n\u00a0\nclass Program\n{\n\u00a0\u00a0\u00a0\u00a0public static void Main(string&#x5B;] args)\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var conf = new ConsumerConfig\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0GroupId = &quot;demo-consumer-group&quot;,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0BootstrapServers = &quot;localhost:9092&quot;,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0AutoOffsetReset = AutoOffsetReset.Earliest\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0};\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0using (var consumer = new ConsumerBuilder&lt;Ignore, string&gt;(conf).Build())\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0consumer.Subscribe(&quot;demo-topic&quot;);\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var readingMessage = true;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0try\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0while (readingMessage)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0try\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var consumeResult = consumer.Consume(10000);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (consumeResult == null)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Console.WriteLine(&quot;There are no messages in topic&quot;);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0readingMessage = false;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0else\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Console.WriteLine($&quot;Consumed message &#039;{consumeResult.Message.Value}&#039; at: &#039;{consumeResult.TopicPartitionOffset}&#039;.&quot;);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0catch (ConsumeException e)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Console.WriteLine($&quot;Error occured: {e.Error.Reason}&quot;);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0catch (OperationCanceledException)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0consumer.Close();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0}\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Configuriamo il consumer indicando il Consumer Group, l&#8217;indirizzo del server Kafka e specificando quale azione intraprendere quando non c\u2019\u00e8 nessun offset iniziale. Creiamo il consumer e sottoscriviamolo al nostro topic, poi iniziamo la lettura del topic fino al&nbsp;<em>timeout<\/em>&nbsp;specificato tramite il metodo&nbsp;<em>Consume<\/em>. Stampiamo il risultato della lettura in console e infine con il metodo&nbsp;<em>Close<\/em>&nbsp;committiamo gli offset su Kafka, avvertendo che il consumer sta lasciando il gruppo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Eseguendo il Consumer possiamo vedere che tutti i messaggi pubblicati sono stati consumati correttamente.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"565\" height=\"123\" data-attachment-id=\"26804\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/la-metamorfosi-della-comunicazione-con-kafka\/attachment\/image-7\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-7.png?fit=565%2C123&amp;ssl=1\" data-orig-size=\"565,123\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image-7\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-7.png?fit=565%2C123&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-7.png?resize=565%2C123&#038;ssl=1\" alt=\"\" class=\"wp-image-26804\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image-7.png 565w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image-7-480x104.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 565px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>L\u2019ecosistema Kafka<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Questa \u00e8 solo una panoramica sulle funzionalit\u00e0 core di Kafka, che negli anni \u00e8 diventato un vero e proprio ecosistema. Infatti, oltre allo scambio di messaggi, tra producer e consumer esistono due ulteriori feature:&nbsp;<em>Kafka Connect e Kafka Stream<\/em>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"861\" data-attachment-id=\"26807\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/la-metamorfosi-della-comunicazione-con-kafka\/attachment\/image-8\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-8.png?fit=1069%2C899&amp;ssl=1\" data-orig-size=\"1069,899\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image-8\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-8.png?fit=1024%2C861&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image-8.png?resize=1024%2C861&#038;ssl=1\" alt=\"\" class=\"wp-image-26807\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image-8-1024x861.png 1024w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image-8-980x824.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image-8-480x404.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">La prima \u00e8 un framework per il trasferimento di dati di sistemi eterogenei attraverso Kafka che mette a disposizione delle API ben definite per implementare dei cosiddetti&nbsp;<em>connectors<\/em>. Si pensi alla variazione del campo di una tabella di un database notificata tramite Kafka: ci\u00f2 \u00e8 possibile mediante un connettore del database verso Kafka.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La seconda feature, invece, \u00e8 una libreria per la creazione di applicazioni di streaming, ovvero applicazioni che trasformano topic di input di Kafka in topic di output.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Conclusioni<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Sperando che questa introduzione sia stata interessante per entrare nell\u2019ecosistema Kafka, vi lascio il link del&nbsp;<a href=\"https:\/\/github.com\/intersect88\/IntroToKafka\" target=\"_blank\" rel=\"noreferrer noopener\">repository<\/a>&nbsp;dove potete trovare l\u2019implementazione del producer e del consumer, nonch\u00e9 i comandi per creare i container per Kafka e Zookeeper.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Alla prossima!<\/p>\n\n\n\n\n","protected":false},"excerpt":{"rendered":"<p>Andiamo alla scoperta di Kafka introducendo i concetti fondamentali e mostrando un esempio in .NET Core<\/p>\n","protected":false},"author":196716251,"featured_media":26782,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"off","_et_pb_old_content":"","_et_gb_content_width":"","_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","inline_featured_image":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_wpcom_ai_launchpad_first_post":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"{title}\n\n{excerpt}\n\n{url}","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpas_customize_per_network":false,"jetpack_post_was_ever_published":false},"categories":[688637374],"tags":[688637541,688637545,688637437,688637536],"class_list":["post-26780","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","tag-dotnetcore","tag-docker","tag-kafka","tag-swdesign"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>\u201cLa Metamorfosi\u201d della comunicazione con Kafka - Blexin<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blexin.com\/it\/blog\/la-metamorfosi-della-comunicazione-con-kafka\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u201cLa Metamorfosi\u201d della comunicazione con Kafka - Blexin\" \/>\n<meta property=\"og:description\" content=\"Andiamo alla scoperta di Kafka introducendo i concetti fondamentali e mostrando un esempio in .NET Core\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blexin.com\/it\/blog\/la-metamorfosi-della-comunicazione-con-kafka\/\" \/>\n<meta property=\"og:site_name\" content=\"Blexin\" \/>\n<meta property=\"article:published_time\" content=\"2020-04-21T22:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-05-21T18:28:16+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i1.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/a02436f4-6edd-4491-856a-c1985e9aa754.png?fit=1024%2C608\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"608\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Genny Paudice\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Genny Paudice\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/la-metamorfosi-della-comunicazione-con-kafka\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/la-metamorfosi-della-comunicazione-con-kafka\\\/\"},\"author\":{\"name\":\"Genny Paudice\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/ae0e97a3ebb79d2f73e4411c1eb28973\"},\"headline\":\"\u201cLa Metamorfosi\u201d della comunicazione con Kafka\",\"datePublished\":\"2020-04-21T22:00:00+00:00\",\"dateModified\":\"2021-05-21T18:28:16+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/la-metamorfosi-della-comunicazione-con-kafka\\\/\"},\"wordCount\":1596,\"image\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/la-metamorfosi-della-comunicazione-con-kafka\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/a02436f4-6edd-4491-856a-c1985e9aa754.png?fit=1024%2C608&ssl=1\",\"keywords\":[\".NetCore\",\"Docker\",\"Kafka\",\"softwaredesign\"],\"articleSection\":[\"Blog\"],\"inLanguage\":\"it-IT\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/la-metamorfosi-della-comunicazione-con-kafka\\\/\",\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/la-metamorfosi-della-comunicazione-con-kafka\\\/\",\"name\":\"\u201cLa Metamorfosi\u201d della comunicazione con Kafka - Blexin\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/la-metamorfosi-della-comunicazione-con-kafka\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/la-metamorfosi-della-comunicazione-con-kafka\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/a02436f4-6edd-4491-856a-c1985e9aa754.png?fit=1024%2C608&ssl=1\",\"datePublished\":\"2020-04-21T22:00:00+00:00\",\"dateModified\":\"2021-05-21T18:28:16+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/ae0e97a3ebb79d2f73e4411c1eb28973\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/la-metamorfosi-della-comunicazione-con-kafka\\\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/la-metamorfosi-della-comunicazione-con-kafka\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/la-metamorfosi-della-comunicazione-con-kafka\\\/#primaryimage\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/a02436f4-6edd-4491-856a-c1985e9aa754.png?fit=1024%2C608&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/a02436f4-6edd-4491-856a-c1985e9aa754.png?fit=1024%2C608&ssl=1\",\"width\":1024,\"height\":608},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/la-metamorfosi-della-comunicazione-con-kafka\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/blexin.com\\\/it\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u201cLa Metamorfosi\u201d della comunicazione con Kafka\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#website\",\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/\",\"name\":\"Blexin\",\"description\":\"Con noi \u00e8 semplice\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blexin.com\\\/it\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/ae0e97a3ebb79d2f73e4411c1eb28973\",\"name\":\"Genny Paudice\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3093a6ee7b7f555e94e4a5d6f19cb09f3af33635007643b2076eb89329789828?s=96&d=identicon&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3093a6ee7b7f555e94e4a5d6f19cb09f3af33635007643b2076eb89329789828?s=96&d=identicon&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3093a6ee7b7f555e94e4a5d6f19cb09f3af33635007643b2076eb89329789828?s=96&d=identicon&r=g\",\"caption\":\"Genny Paudice\"},\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/author\\\/genny-paudiceblexin-com\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u201cLa Metamorfosi\u201d della comunicazione con Kafka - Blexin","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blexin.com\/it\/blog\/la-metamorfosi-della-comunicazione-con-kafka\/","og_locale":"it_IT","og_type":"article","og_title":"\u201cLa Metamorfosi\u201d della comunicazione con Kafka - Blexin","og_description":"Andiamo alla scoperta di Kafka introducendo i concetti fondamentali e mostrando un esempio in .NET Core","og_url":"https:\/\/blexin.com\/it\/blog\/la-metamorfosi-della-comunicazione-con-kafka\/","og_site_name":"Blexin","article_published_time":"2020-04-21T22:00:00+00:00","article_modified_time":"2021-05-21T18:28:16+00:00","og_image":[{"width":1024,"height":608,"url":"https:\/\/i1.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/a02436f4-6edd-4491-856a-c1985e9aa754.png?fit=1024%2C608","type":"image\/png"}],"author":"Genny Paudice","twitter_card":"summary_large_image","twitter_misc":{"Scritto da":"Genny Paudice","Tempo di lettura stimato":"9 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blexin.com\/it\/blog\/la-metamorfosi-della-comunicazione-con-kafka\/#article","isPartOf":{"@id":"https:\/\/blexin.com\/it\/blog\/la-metamorfosi-della-comunicazione-con-kafka\/"},"author":{"name":"Genny Paudice","@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/ae0e97a3ebb79d2f73e4411c1eb28973"},"headline":"\u201cLa Metamorfosi\u201d della comunicazione con Kafka","datePublished":"2020-04-21T22:00:00+00:00","dateModified":"2021-05-21T18:28:16+00:00","mainEntityOfPage":{"@id":"https:\/\/blexin.com\/it\/blog\/la-metamorfosi-della-comunicazione-con-kafka\/"},"wordCount":1596,"image":{"@id":"https:\/\/blexin.com\/it\/blog\/la-metamorfosi-della-comunicazione-con-kafka\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/a02436f4-6edd-4491-856a-c1985e9aa754.png?fit=1024%2C608&ssl=1","keywords":[".NetCore","Docker","Kafka","softwaredesign"],"articleSection":["Blog"],"inLanguage":"it-IT"},{"@type":"WebPage","@id":"https:\/\/blexin.com\/it\/blog\/la-metamorfosi-della-comunicazione-con-kafka\/","url":"https:\/\/blexin.com\/it\/blog\/la-metamorfosi-della-comunicazione-con-kafka\/","name":"\u201cLa Metamorfosi\u201d della comunicazione con Kafka - Blexin","isPartOf":{"@id":"https:\/\/blexin.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blexin.com\/it\/blog\/la-metamorfosi-della-comunicazione-con-kafka\/#primaryimage"},"image":{"@id":"https:\/\/blexin.com\/it\/blog\/la-metamorfosi-della-comunicazione-con-kafka\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/a02436f4-6edd-4491-856a-c1985e9aa754.png?fit=1024%2C608&ssl=1","datePublished":"2020-04-21T22:00:00+00:00","dateModified":"2021-05-21T18:28:16+00:00","author":{"@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/ae0e97a3ebb79d2f73e4411c1eb28973"},"breadcrumb":{"@id":"https:\/\/blexin.com\/it\/blog\/la-metamorfosi-della-comunicazione-con-kafka\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blexin.com\/it\/blog\/la-metamorfosi-della-comunicazione-con-kafka\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/blexin.com\/it\/blog\/la-metamorfosi-della-comunicazione-con-kafka\/#primaryimage","url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/a02436f4-6edd-4491-856a-c1985e9aa754.png?fit=1024%2C608&ssl=1","contentUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/a02436f4-6edd-4491-856a-c1985e9aa754.png?fit=1024%2C608&ssl=1","width":1024,"height":608},{"@type":"BreadcrumbList","@id":"https:\/\/blexin.com\/it\/blog\/la-metamorfosi-della-comunicazione-con-kafka\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blexin.com\/it\/"},{"@type":"ListItem","position":2,"name":"\u201cLa Metamorfosi\u201d della comunicazione con Kafka"}]},{"@type":"WebSite","@id":"https:\/\/blexin.com\/it\/#website","url":"https:\/\/blexin.com\/it\/","name":"Blexin","description":"Con noi \u00e8 semplice","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blexin.com\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Person","@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/ae0e97a3ebb79d2f73e4411c1eb28973","name":"Genny Paudice","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/secure.gravatar.com\/avatar\/3093a6ee7b7f555e94e4a5d6f19cb09f3af33635007643b2076eb89329789828?s=96&d=identicon&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/3093a6ee7b7f555e94e4a5d6f19cb09f3af33635007643b2076eb89329789828?s=96&d=identicon&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3093a6ee7b7f555e94e4a5d6f19cb09f3af33635007643b2076eb89329789828?s=96&d=identicon&r=g","caption":"Genny Paudice"},"url":"https:\/\/blexin.com\/it\/author\/genny-paudiceblexin-com\/"}]}},"jetpack_publicize_connections":[],"jetpack_shortlink":"https:\/\/wp.me\/pcyUBx-6XW","jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/a02436f4-6edd-4491-856a-c1985e9aa754.png?fit=1024%2C608&ssl=1","_links":{"self":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/26780","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/users\/196716251"}],"replies":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/comments?post=26780"}],"version-history":[{"count":11,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/26780\/revisions"}],"predecessor-version":[{"id":27793,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/26780\/revisions\/27793"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/media\/26782"}],"wp:attachment":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/media?parent=26780"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/categories?post=26780"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/tags?post=26780"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}