Kafka is een high-performance, gedistribueerd berichtensysteem ontwikkeld door LinkedIn dat veel wordt gebruikt in scenario's zoals logverzameling, verwerking van streaming data, online en offline distributie van berichten, en meer. Hoewel Kafaka niet als een traditionele MQ is ontworpen, kan het in de meeste gevallen traditionele berichtensystemen zoals ActiveMQ vervangen.
Kafka organiseert de stroom van berichten per onderwerp, en de server die de berichten bewaart heet een broker, en consumenten kunnen zich abonneren op één of meer onderwerpen. Om de belasting te balanceren, kunnen de berichten van een onderwerp worden onderverdeeld in meerdere partities, en hoe meer partities, hoe hoger de paralleliteit en doorvoer van Kafka.
Kafka-clusters vereisen Zookeeper-ondersteuning om clusters te implementeren, en Zookeeper is al opgenomen in de nieuwste Kafka-distributie, die kan worden ingezet om tegelijkertijd een Zookeeper-server en een Kafka-server te starten, of om andere bestaande Zookeeper-clusters te gebruiken.
In tegenstelling tot traditionele MQ moeten consumenten zelf een offset bijhouden, en bij het ontvangen van berichten van Kafka trekken ze alleen berichten na de huidige offset. Kafka's scala/java-client implementeert dit deel van de logica al door de offset op te slaan naar de zookeeper. Elke consument kan een ID kiezen, en consumenten met hetzelfde ID ontvangen hetzelfde bericht slechts één keer.Als consumenten van een onderwerp allemaal dezelfde id gebruiken, is het een traditionele wachtrij. Als elke consument een ander ID gebruikt, is het een traditionele pub-sub.
Recensie:
Kafkaconsumptie
1. Consumenten van dezelfde group_id, slechts één consument kan berichten consumeren (wachtrijmodus)
2. Consumenten van verschillende group_id ontvangen hetzelfde nieuws
Voordelen van Kafka
Gedistribueerd en zeer schaalbaar. Kafka-clusters kunnen transparant worden opgeschaald om nieuwe servers aan het cluster toe te voegen.
Hoge prestaties. De prestaties van Kafka overtreffen die van traditionele MQ-implementaties zoals ActiveMQ en RabbitMQ ruimschoots, met name Kafka, dat ook batchbewerkingen ondersteunt. De volgende afbeelding toont de resultaten van LinkedIn's consumentenprestatie-stresstest:
Fouttolerantie. Data van elke partitie in Kafka wordt gerepliceerd naar meerdere servers. Wanneer een makelaar faalt, zal de ZooKeeper-dienst de producent en de consument informeren, waarna ze overstappen naar een andere makelaar.
Nadelen van Kafka:
Herhaal berichten. Kafka garandeert slechts dat elk bericht minstens één keer wordt afgeleverd, en hoewel de kans klein is, is er een kans dat een bericht meerdere keren wordt bezorgd. Het nieuws is niet in orde. Hoewel berichten binnen een partitie gegarandeerd ordelijk zijn, is het niet gegarandeerd dat de levering tussen partities ordelijk is als een onderwerp meerdere partities heeft. Complexiteit. Kafka heeft ondersteuning nodig van zookeeper-clusters, en onderwerpen vereisen meestal handmatige arbeid om te creëren, uitrollen en onderhouden duurder dan algemene berichtwachtrijen
.NET/C# berichtenwachtrij Kafka-operaties
Gebruik eerst .NET Core 3.1 om twee nieuwe consoleprojecten te creëren, namelijk Kafka-Consumer en Kafka-Producer
Gebruik nuget om het Confluent.Kafka-pakket zo te refereren, met het volgende commando:
GitHub-adres:De hyperlink-login is zichtbaar.
We starten eerst het Producer-programma, en als we eerst de consument starten, krijgen we de volgende foutmelding:
Fout opgetreden: Broker: Onbekend onderwerp of partitie Dit artikel zal de instellingen opnemenEnableAutoOffsetStore is onjuist, dat wil zeggen, handmatig instellen van de offsetopslag (vergelijkbaar met een handmatige bevestigingsmelding)
Consumenten stellen OffsetStore niet in na consumptie
Probeer de producer te gebruiken om twee berichten te produceren, zet consumentenverbruik aan, MaxPollIntervalMs = 10000 // 10 seconden zonder handmatige instellingen, laat andere clients het consumeren, natuurlijk wordt het niet binnen 10 seconden door andere clients verbruikt
MaxPollIntervalMs legt het uit
Voor gevorderde gebruikers is de maximale toegestane tijd om berichten tussen gesprekken te verwerken (bijvoorbeeld rd_kafka_consumer_poll()). Als dit interval wordt overschreden, wordt de consument als mislukt beschouwd en wordt de groep opnieuw gebalanceerd zodat de partitie wordt toegewezen aan een ander lid van de consumentengroep. Waarschuwing: Offset commits zijn op dit moment mogelijk niet mogelijk. Opmerking: Het wordt aanbevolen om "enable.auto.offset.store=false" in te stellen voor applicaties die lange tijd aan het verwerken zijn, en vervolgens expliciet de offset op te slaan (met offsets_store()) nadat het bericht is verwerkt* om te garanderen dat de offset niet automatisch wordt gecommitteerd voordat de verwerking is voltooid. Controleer één keer per seconde met tussenpozen van twee. Voor meer informatie, zie KIP-62. De renderings zijn als volgt:
OffsetStore wordt ingesteld nadat de consument heeft besteed
code
Wacht na de installatie 10 seconden en dan gebeurt het nog steedsHet laatste bericht ontvangen(Wanneer de consument verbinding maakt met de makelaar,Start de consumptie vanuit de offsetpositieAls c.Commit(cr) is ingesteld; Het laatste bericht wordt niet herhaaldelijk ontvangen.
Bekijk broncode
commit de offset + 1 commit, en roep uiteindelijk Librdkafka.topic_partition_list_destroy(cOffsets) aan;
De hyperlink-login is zichtbaar.
De hyperlink-login is zichtbaar.
Stel een andere GroupId in
Probeer een andere GroupId in te stellen via de commandoregelparameter, en stuur vervolgens een bericht via de producer, zoals te zien is in de volgende afbeelding:
Zowel clinet1 als client2Ontvang historische berichten, en nadat de producent een bericht heeft gestuurd, zullen ze bijna allebeiTegelijkertijd berichten ontvangen。
Nieuwe consumenten ontvangen alleen nieuwe berichten
Hoe zorg je ervoor dat een nieuwe klant alleen nieuwe berichten ontvangt en historische data negeert?
De instellingen zijn als volgt:
Zoals hieronder getoond:
Producentcode
Als volgt:
Consumentencode
Als volgt:
Broncode downloaden
Toeristen, als jullie de verborgen inhoud van dit bericht willen zien, alsjeblieft Antwoord
|