Programmering

Sådan bruges Apache Kafka-meddelelser i .Net

Apache Kafka er en open source, distribueret, skalerbar, højtydende meddelelsesmægler med publicerings-abonnement. Det er et godt valg til bygning af systemer, der er i stand til at behandle store datamængder. I denne artikel ser vi på, hvordan vi kan oprette en producent- og forbrugerapplikation til Kafka i C #.

For at komme i gang med at bruge Kafka, skal du downloade Kafka og ZooKeeper og installere dem på dit system. Denne DZone-artikel indeholder trinvise instruktioner til opsætning af Kafka og ZooKeeper på Windows. Når du er færdig med opsætningen, skal du starte ZooKeeper og Kafka og møde mig herhen.

Apache Kafka-arkitektur

I dette afsnit vil vi undersøge de arkitektoniske komponenter og tilhørende terminologi i Kafka. Dybest set består Kafka af følgende komponenter:

  • Kafka Cluster - en samling af en eller flere servere kendt som mæglere
  • Producent - den komponent, der bruges til at udgive meddelelser
  • Forbruger - den komponent, der bruges til at hente eller forbruge meddelelser
  • ZooKeeper - en central koordinationstjeneste, der bruges til at vedligeholde konfigurationsoplysninger på tværs af klyngenoder i et distribueret miljø

Den grundlæggende enhed af data i Kafka er en besked. En besked i Kafka er repræsenteret som et nøgleværdipar. Kafka konverterer alle meddelelser til byte-arrays. Det skal bemærkes, at kommunikation mellem producenter, forbrugere og klynger i Kafka bruger TCP-protokollen. Hver server i en Kafka-klynge er kendt som en mægler. Du kan skalere Kafka vandret ved blot at tilføje yderligere mæglere til klyngen.

Følgende diagram illustrerer de arkitektoniske komponenter i Kafka - et højt niveau.

Apache FONDEN

Et emne i Kafka repræsenterer en logisk samling af meddelelser. Du kan tænke på det som et feed eller en kategori, som en producent kan offentliggøre meddelelser til. I øvrigt indeholder en Kafka-mægler et eller flere emner, der igen er opdelt i en eller flere partitioner. En partition er defineret som en ordnet række af meddelelser. Partitioner er nøglen til Kafkas evne til at skalere dynamisk, da partitioner er fordelt på flere mæglere.

Du kan have en eller flere producenter, der skubber beskeder ind i en klynge på et givet tidspunkt. En producent i Kafka offentliggør beskeder i et bestemt emne, og en forbruger abonnerer på et emne for at modtage beskederne.

Valg mellem Kafka og RabbitMQ

Både Kafka og RabbitMQ er populære open source-meddelelsesmæglere, der har været i bred brug i nogen tid. Hvornår skal du vælge Kafka frem for RabbitMQ? Valget afhænger af nogle få faktorer.

RabbitMQ er en mægler med hurtig besked skrevet i Erlang. Dens rige rutefunktioner og evne til at tilbyde anerkendelser pr. Besked er stærke grunde til at bruge det. RabbitMQ giver også en brugervenlig webgrænseflade, som du kan bruge til at overvåge din RabbitMQ-server. Se min artikel for at lære, hvordan du arbejder med RabbitMQ i .Net.

Men når det kommer til at støtte store implementeringer, skalerer Kafka meget bedre end RabbitMQ - alt hvad du skal gøre er at tilføje flere partitioner. Det skal også bemærkes, at RabbitMQ-klynger ikke tåler netværkspartitioner. Hvis du planlægger at gruppere RabbitMQ-servere, skal du i stedet bruge føderationer. Du kan læse mere om RabbitMQ-klynger og netværkspartitioner her.

Kafka overskygger også klart RabbitMQ i ydeevne. En enkelt Kafka-instans kan håndtere 100K-beskeder pr. Sekund versus tættere på 20K-beskeder pr. Sekund for RabbitMQ. Kafka er også et godt valg, når du vil sende meddelelser med lav ventetid for at støtte batchforbrugere, forudsat at forbrugerne kan være enten online eller offline.

Opbygning af Kafka-producenten og Kafka-forbrugeren

I dette afsnit undersøger vi, hvordan vi kan opbygge en producent og forbruger til brug sammen med Kafka. For at gøre dette bygger vi to konsolapplikationer i Visual Studio - den ene repræsenterer producenten og den anden forbrugeren. Og vi bliver nødt til at installere en Kafka-udbyder til .Net i både producenten og forbrugerapplikationen.

I øvrigt er der mange udbydere tilgængelige, men i dette indlæg bruger vi kafka-net, en indfødt C # -klient til Apache Kafka. Du kan installere kafka-net via NuGet-pakkehåndteringen fra Visual Studio. Du kan følge dette link til kafka-net GitHub-lageret.

Her er hovedmetoden for vores Kafka-producent:

statisk ugyldigt Main (streng [] args)

        {

streng nyttelast;

strengemne;

Meddelelse msg = ny besked (nyttelast);

Uri uri = ny Uri (“// localhost: 9092”);

var optioner = nye KafkaOptions (uri);

var router = ny BrokerRouter (optioner);

var klient = ny producent (router);

client.SendMessageAsync (emne, ny liste {msg}). Vent ();

Console.ReadLine ();

        }

Og her er koden til vores Kafka-forbruger:

statisk ugyldigt Main (streng [] args)

        {

strengemne;

Uri uri = ny Uri (“// localhost: 9092”);

var optioner = nye KafkaOptions (uri);

var router = ny BrokerRouter (optioner);

var forbruger = ny forbruger (ny forbrugeroption (emne, router));

foreach (var besked i forbruger.Consume ())

            {

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

            }

Console.ReadLine ();

        }

Bemærk, at du skal medtage Kafka-navneområderne i både producent- og forbrugerapplikationer som vist nedenfor.

ved hjælp af KafkaNet;

ved hjælp af KafkaNet.Model;

ved hjælp af KafkaNet.Protocol;

Endelig skal du bare køre producenten (producenten først) og derefter forbrugeren. Og det er det! Du skal se meddelelsen "Velkommen til Kafka!" vises i forbrugerkonsolvinduet.

Mens vi har mange beskedsystemer til rådighed at vælge imellem - RabbitMQ, MSMQ, IBM MQ Series osv. - er Kafka foran pakken til at håndtere store datastrømme, der kan stamme fra mange udgivere. Kafka bruges ofte til IoT-applikationer og logaggregering og andre brugssager, der kræver lav ventetid og stærke garantier for meddelelseslevering.

Hvis din applikation har brug for en hurtig og skalerbar meddelelsesmægler, er Kafka et godt valg. Hold øje med flere indlæg på Kafka i denne blog.

$config[zx-auto] not found$config[zx-overlay] not found