Verwendung von Apache Kafka-Nachrichten in .Net

Apache Kafka ist ein verteilter, skalierbarer, leistungsstarker Open-Source-Broker für Publish-Subscribe-Nachrichten. Es ist eine gute Wahl für Gebäudesysteme, die große Datenmengen verarbeiten können. In diesem Artikel sehen wir uns an, wie wir eine Produzenten- und Konsumentenanwendung für Kafka in C # erstellen können.

Um mit Kafka beginnen zu können, sollten Sie Kafka und ZooKeeper herunterladen und auf Ihrem System installieren. Dieser DZone-Artikel enthält schrittweise Anweisungen zum Einrichten von Kafka und ZooKeeper unter Windows. Wenn Sie das Setup abgeschlossen haben, starten Sie ZooKeeper und Kafka und treffen Sie mich wieder hier.

Apache Kafka Architektur

In diesem Abschnitt werden wir die architektonischen Komponenten und die zugehörige Terminologie in Kafka untersuchen. Grundsätzlich besteht Kafka aus folgenden Komponenten:

  • Kafka Cluster - eine Sammlung von einem oder mehreren Servern, die als Broker bezeichnet werden
  • Produzent - die Komponente, mit der Nachrichten veröffentlicht werden
  • Consumer - Die Komponente, mit der Nachrichten abgerufen oder konsumiert werden
  • ZooKeeper - ein zentraler Koordinierungsdienst, mit dem Konfigurationsinformationen über Clusterknoten hinweg in einer verteilten Umgebung verwaltet werden

Die grundlegende Dateneinheit in Kafka ist eine Nachricht. Eine Nachricht in Kafka wird als Schlüssel-Wert-Paar dargestellt. Kafka konvertiert alle Nachrichten in Byte-Arrays. Es ist zu beachten, dass die Kommunikation zwischen Herstellern, Verbrauchern und Clustern in Kafka das TCP-Protokoll verwendet. Jeder Server in einem Kafka-Cluster wird als Broker bezeichnet. Sie können Kafka horizontal skalieren, indem Sie dem Cluster einfach zusätzliche Broker hinzufügen.

Das folgende Diagramm zeigt die Architekturkomponenten in Kafka - eine Ansicht auf hoher Ebene.

Apache FOUNDATION

Ein Thema in Kafka repräsentiert eine logische Sammlung von Nachrichten. Sie können sich das als Feed oder Kategorie vorstellen, in der ein Produzent Nachrichten veröffentlichen kann. Ein Kafka-Broker enthält übrigens ein oder mehrere Themen, die wiederum in eine oder mehrere Partitionen unterteilt sind. Eine Partition ist als geordnete Folge von Nachrichten definiert. Partitionen sind der Schlüssel für die Fähigkeit von Kafka, dynamisch zu skalieren, da Partitionen auf mehrere Broker verteilt sind.

Sie können einen oder mehrere Produzenten haben, die Nachrichten zu einem bestimmten Zeitpunkt in einen Cluster übertragen. Ein Produzent in Kafka veröffentlicht Nachrichten zu einem bestimmten Thema, und ein Verbraucher abonniert ein Thema, um die Nachrichten zu erhalten.

Wahl zwischen Kafka und RabbitMQ

Sowohl Kafka als auch RabbitMQ sind beliebte Open-Source-Nachrichtenbroker, die seit geraumer Zeit weit verbreitet sind. Wann sollten Sie Kafka anstelle von RabbitMQ wählen? Die Wahl hängt von einigen Faktoren ab.

RabbitMQ ist ein schneller Nachrichtenbroker, der in Erlang geschrieben wurde. Die umfangreichen Routing-Funktionen und die Möglichkeit, Bestätigungen pro Nachricht anzubieten, sind gute Gründe für die Verwendung. RabbitMQ bietet auch eine benutzerfreundliche Weboberfläche, mit der Sie Ihren RabbitMQ-Server überwachen können. In meinem Artikel erfahren Sie, wie Sie mit RabbitMQ in .Net arbeiten.  

Wenn es jedoch darum geht, große Bereitstellungen zu unterstützen, skaliert Kafka viel besser als RabbitMQ. Sie müssen lediglich weitere Partitionen hinzufügen. Es sollte auch beachtet werden, dass RabbitMQ-Cluster keine Netzwerkpartitionen tolerieren. Wenn Sie RabbitMQ-Server gruppieren möchten, sollten Sie stattdessen Verbände verwenden. Weitere Informationen zu RabbitMQ-Clustern und Netzwerkpartitionen finden Sie hier.

Kafka übertrifft auch RabbitMQ deutlich in der Leistung. Eine einzelne Kafka-Instanz kann 100.000 Nachrichten pro Sekunde verarbeiten, während RabbitMQ näher an 20.000 Nachrichten pro Sekunde liegt. Kafka ist auch eine gute Wahl, wenn Sie Nachrichten mit geringer Latenz übertragen möchten, um Batch-Konsumenten zu unterstützen, vorausgesetzt, die Konsumenten können entweder online oder offline sein.

Aufbau des Kafka-Produzenten und des Kafka-Konsumenten

In diesem Abschnitt werden wir untersuchen, wie wir einen Produzenten und Konsumenten für die Verwendung mit Kafka aufbauen können. Zu diesem Zweck erstellen wir zwei Konsolenanwendungen in Visual Studio - eine repräsentiert den Produzenten und die andere den Konsumenten. Und wir müssen einen Kafka-Anbieter für .Net sowohl in der Hersteller- als auch in der Verbraucheranwendung installieren.

Übrigens gibt es viele Anbieter, aber in diesem Beitrag werden wir kafka-net verwenden, einen nativen C # -Client für Apache Kafka. Sie können kafka-net über den NuGet-Paketmanager in Visual Studio installieren. Sie können diesem Link zum GitHub-Repository von kafka-net folgen.

Hier ist die Hauptmethode für unseren Kafka-Produzenten:

statische Leere Main (string [] args)

        {

            String Payload;

            String-Thema;

            Nachricht msg = neue Nachricht (Nutzlast);

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

            var options = new KafkaOptions (uri);

            var router = neuer BrokerRouter (Optionen);

            var client = neuer Produzent (Router);

            client.SendMessageAsync (Thema, neue Liste {msg}). Wait ();

            Console.ReadLine ();

        }}

Und hier ist der Code für unseren Kafka-Verbraucher:

statische Leere Main (string [] args)

        {

            String-Thema;

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

            var options = new KafkaOptions (uri);

            var router = neuer BrokerRouter (Optionen);

            var consumer = neuer Verbraucher (neue ConsumerOptions (Thema, Router));

            foreach (var message in consumer.Consume ())

            {

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

            }}

            Console.ReadLine ();

        }}

Beachten Sie, dass Sie die Kafka-Namespaces in die Hersteller- und Verbraucheranwendungen aufnehmen sollten, wie unten gezeigt.

mit KafkaNet;

using KafkaNet.Model;

using KafkaNet.Protocol;

Führen Sie zum Schluss einfach den Produzenten (zuerst den Produzenten) und dann den Konsumenten aus. Und das ist es! Sie sollten die Nachricht "Willkommen in Kafka!" Sehen. wird im Consumer-Konsolenfenster angezeigt.

Während wir viele Messaging-Systeme zur Auswahl haben - RabbitMQ, MSMQ, IBM MQ Series usw. - ist Kafka bei der Verarbeitung großer Datenströme, die von vielen Herausgebern stammen können, führend. Kafka wird häufig für IoT-Anwendungen und die Protokollaggregation sowie für andere Anwendungsfälle verwendet, die eine geringe Latenz und starke Garantien für die Nachrichtenübermittlung erfordern.

Wenn Ihre Anwendung einen schnellen und skalierbaren Nachrichtenbroker benötigt, ist Kafka eine gute Wahl. Weitere Beiträge zu Kafka finden Sie in diesem Blog.