Come utilizzare la messaggistica Apache Kafka in .Net

Apache Kafka è un broker di messaggi di pubblicazione-sottoscrizione open source, distribuito, scalabile e ad alte prestazioni. È un'ottima scelta per la creazione di sistemi in grado di elaborare elevati volumi di dati. In questo articolo vedremo come creare un'applicazione produttore e consumatore per Kafka in C #.

Per iniziare a utilizzare Kafka, scarica Kafka e ZooKeeper e installali sul tuo sistema. Questo articolo di DZone contiene istruzioni dettagliate per configurare Kafka e ZooKeeper su Windows. Quando hai completato l'installazione, avvia ZooKeeper e Kafka e incontriamoci qui.

Architettura di Apache Kafka

In questa sezione, esamineremo i componenti architettonici e la relativa terminologia in Kafka. Fondamentalmente, Kafka è costituito dai seguenti componenti:

  • Kafka Cluster: una raccolta di uno o più server noti come broker
  • Produttore: il componente utilizzato per pubblicare i messaggi
  • Consumatore: il componente utilizzato per recuperare o consumare i messaggi
  • ZooKeeper: un servizio di coordinamento centralizzato utilizzato per mantenere le informazioni di configurazione sui nodi del cluster in un ambiente distribuito

L'unità di dati fondamentale in Kafka è un messaggio. Un messaggio in Kafka è rappresentato come una coppia chiave-valore. Kafka converte tutti i messaggi in array di byte. Va notato che le comunicazioni tra produttori, consumatori e cluster in Kafka utilizzano il protocollo TCP. Ogni server in un cluster Kafka è noto come broker. Puoi ridimensionare Kafka orizzontalmente semplicemente aggiungendo altri broker al cluster.

Il diagramma seguente illustra i componenti dell'architettura in Kafka: una vista di alto livello.

FONDAZIONE Apache

Un argomento in Kafka rappresenta una raccolta logica di messaggi. Puoi pensarlo come un feed o una categoria in cui un produttore può pubblicare messaggi. Per inciso, un broker Kafka contiene uno o più argomenti a loro volta suddivisi in una o più partizioni. Una partizione è definita come una sequenza ordinata di messaggi. Le partizioni sono la chiave per la capacità di Kafka di ridimensionarsi in modo dinamico, poiché le partizioni sono distribuite su più broker.

Puoi avere uno o più produttori che inviano messaggi in un cluster in un dato momento. Un produttore in Kafka pubblica messaggi in un particolare argomento e un consumatore si iscrive a un argomento per ricevere i messaggi.

Scegliere tra Kafka e RabbitMQ

Sia Kafka che RabbitMQ sono popolari broker di messaggi open source che sono stati ampiamente utilizzati per un bel po 'di tempo. Quando dovresti scegliere Kafka su RabbitMQ? La scelta dipende da alcuni fattori.

RabbitMQ è un veloce broker di messaggi scritto in Erlang. Le sue ricche capacità di instradamento e la capacità di offrire riconoscimenti per messaggio sono validi motivi per utilizzarlo. RabbitMQ fornisce anche un'interfaccia web user-friendly che puoi usare per monitorare il tuo server RabbitMQ. Dai un'occhiata al mio articolo per imparare a lavorare con RabbitMQ in .Net.  

Tuttavia, quando si tratta di supportare distribuzioni di grandi dimensioni, Kafka scala molto meglio di RabbitMQ: tutto ciò che devi fare è aggiungere più partizioni. Va inoltre notato che i cluster RabbitMQ non tollerano le partizioni di rete. Se prevedi di raggruppare in cluster i server RabbitMQ, dovresti invece utilizzare le federazioni. Puoi leggere di più sui cluster RabbitMQ e sulle partizioni di rete qui.

Kafka supera chiaramente RabbitMQ anche in termini di prestazioni. Una singola istanza Kafka può gestire 100.000 messaggi al secondo, contro i 20.000 messaggi al secondo per RabbitMQ. Kafka è anche una buona scelta quando si desidera trasmettere messaggi a bassa latenza per supportare i consumatori batch, supponendo che i consumatori possano essere online o offline.

Costruire il produttore Kafka e il consumatore Kafka

In questa sezione esamineremo come creare un produttore e un consumatore da utilizzare con Kafka. Per fare ciò, creeremo due applicazioni console in Visual Studio: una rappresenterà il produttore e l'altra il consumatore. E avremo bisogno di installare un provider Kafka per .Net sia nell'applicazione producer che in quella consumer.

Per inciso, ci sono molti provider disponibili, ma in questo post useremo kafka-net, un client C # nativo per Apache Kafka. È possibile installare kafka-net tramite il gestore di pacchetti NuGet da Visual Studio. Puoi seguire questo collegamento al repository GitHub di kafka-net.

Ecco il metodo principale per il nostro produttore Kafka:

static void Main (string [] args)

        {

            payload della stringa;

            argomento stringa;

            Message msg = new Message (payload);

            Uri uri = nuovo Uri ("// localhost: 9092");

            opzioni var = new KafkaOptions (uri);

            var router = new BrokerRouter (opzioni);

            var client = nuovo produttore (router);

            client.SendMessageAsync (topic, new List {msg}). Wait ();

            Console.ReadLine ();

        }

Ed ecco il codice per il nostro consumatore Kafka:

static void Main (string [] args)

        {

            argomento stringa;

            Uri uri = nuovo Uri ("// localhost: 9092");

            opzioni var = new KafkaOptions (uri);

            var router = new BrokerRouter (opzioni);

            var consumer = new Consumer (new ConsumerOptions (topic, router));

            foreach (messaggio var in consumer.Consume ())

            {

                Console.WriteLine (Encoding.UTF8.GetString (message.Value));

            }

            Console.ReadLine ();

        }

Tieni presente che dovresti includere gli spazi dei nomi Kafka sia nelle applicazioni producer che consumer, come mostrato di seguito.

utilizzando KafkaNet;

using KafkaNet.Model;

using KafkaNet.Protocol;

Infine, esegui il produttore (prima il produttore) e poi il consumatore. E questo è tutto! Dovresti vedere il messaggio "Benvenuto in Kafka!" visualizzato nella finestra della console del consumatore.

Sebbene abbiamo molti sistemi di messaggistica disponibili tra cui scegliere — RabbitMQ, MSMQ, IBM MQ Series, ecc. — Kafka è in testa al pacchetto per gestire grandi flussi di dati che possono provenire da molti editori. Kafka viene spesso utilizzato per applicazioni IoT e aggregazione di log e altri casi d'uso che richiedono bassa latenza e forti garanzie di consegna dei messaggi.

Se la tua applicazione necessita di un broker di messaggi veloce e scalabile, Kafka è un'ottima scelta. Restate sintonizzati per altri post su Kafka in questo blog.