Apache Kafka und Node.js: Einführung in node-rdkafka
Apache Kafka ist eine verteilte Plattform für Event-Streaming, die sich zum De-facto-Standard für den Aufbau zuverlässiger und skalierbarer Datenaustauschsysteme entwickelt hat. Im Node.js-Ökosystem ist node-rdkafka eine der leistungsfähigsten und ausgereiftesten Bibliotheken für die Arbeit mit Kafka. Sie stellt native Bindungen an die Bibliothek librdkafka (geschrieben in C/C++) bereit, was maximale Geschwindigkeit und Stabilität gewährleistet.
In diesem Artikel werden wir im Detail besprechen, wie man node-rdkafka zum Senden (Producer) und Lesen (Consumer) von Nachrichten einrichtet und verwendet. Sie erfahren, wie Sie Kafka in Ihre Node.js-Anwendung integrieren, Fehler behandeln und Datenströme verwalten.
Installation von node-rdkafka
Für die Installation der Bibliothek wird Node.js Version 12 oder höher sowie ein C++-Compiler (gcc, clang oder MSVC) benötigt. Die Installation erfolgt über den Standard-Paketmanager:
npm install node-rdkafkaWenn die Kompilierung mit einem Fehler endet, stellen Sie sicher, dass build-essential (Linux) bzw. Python und Build-Tools für Windows (npm install --global windows-build-tools) installiert sind.
Erstellen eines Producers (Nachrichtensender)
Der Producer in Kafka ist für die Veröffentlichung von Nachrichten in Topics verantwortlich. Betrachten wir ein einfaches Beispiel:
const Kafka = require('node-rdkafka');
// Producer erstellenconst producer = new Kafka.Producer({ 'metadata.broker.list': 'localhost:9092', 'dr_cb': true // Callback für Lieferbestätigung});
// Event-Handler bei Verbindungproducer.on('event.log', function(event) { console.log('Log:', event.message);});
// Fehlerbehandlungproducer.on('event.error', function(err) { console.error('Producer-Fehler:', err);});
// Mit dem Broker verbindenproducer.connect();
// Nach der Verbindung Nachrichten sendenproducer.on('ready', function() { try { // Nachricht an Topic 'test-topic' senden producer.produce( 'test-topic', // Topic-Name null, // Partition (null = automatische Verteilung) Buffer.from('Hallo, Kafka!'), // Nachrichtentext (Buffer) 'my-key', // Nachrichtenschlüssel (optional) Date.now() // Zeitstempel (optional) ); console.log('Nachricht gesendet'); } catch (err) { console.error('Fehler beim Senden:', err); }});
// Nicht vergessen, poll() für die Verarbeitung von Callbacks aufzurufensetInterval(() => { producer.poll();}, 1000);
// Verbindung beim Beenden des Prozesses schließenprocess.on('SIGINT', () => { producer.disconnect(); process.exit();});Beachten Sie: Die Methode producer.produce() erwartet den Nachrichtentext als Buffer. Dies ermöglicht die Übergabe von Strings sowie binären Daten. Der Parameter dr_cb: true aktiviert Callback-Benachrichtigungen über die Zustellung (Delivery Report).
Erstellen eines Consumers (Nachrichtenempfänger)
Der Consumer abonniert ein oder mehrere Topics und verarbeitet eingehende Nachrichten. Für die Arbeit mit Konsumentengruppen wird KafkaConsumer verwendet:
const Kafka = require('node-rdkafka');
const consumer = new Kafka.KafkaConsumer({ 'group.id': 'my-group', 'metadata.broker.list': 'localhost:9092', 'enable.auto.commit': true}, {});
consumer.on('event.error', function(err) { console.error('Consumer-Fehler:', err);});
consumer.on('ready', function() { console.log('Consumer bereit'); // Topic abonnieren consumer.subscribe(['test-topic']); // Konsumierungszyklus starten consumer.consume();});
// Verarbeitung jeder Nachrichtconsumer.on('data', function(data) { console.log('Nachricht empfangen:'); console.log(' Topic:', data.topic); console.log(' Partition:', data.partition); console.log(' Schlüssel:', data.key ? data.key.toString() : null); console.log(' Wert:', data.value.toString()); Auch in der Bibliothek
spdlog für C++: vollständige Anleitung mit Beispielen
E-Mail-Versand mit TypeScript: Vollständiger Leitfaden mit nodemailer und SMTP
Reaktive Programmierung in Swift: Combine und RxSwift für iOS/macOS
Testen in Go (Golang): Frameworks und Tools
Arbeiten mit Bildern in C# (.NET): Vollständiger Leitfaden