Travailler avec Kafka en JavaScript (Node.js) : la bibliothèque node-rdkafka

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Apache Kafka et Node.js : découverte de node-rdkafka



Apache Kafka est une plateforme distribuée de streaming d'événements, devenue le standard de facto pour la construction de systèmes d'échange de données fiables et évolutifs. Dans l'écosystème Node.js, l'une des bibliothèques les plus performantes et matures pour travailler avec Kafka est node-rdkafka. Elle représente des liaisons natives avec la bibliothèque librdkafka (écrite en C/C++), ce qui garantit une vitesse et une stabilité maximales.



Dans cet article, nous allons détailler comment configurer et utiliser node-rdkafka pour l'envoi (producer) et la lecture (consumer) de messages. Vous apprendrez à intégrer Kafka dans votre application Node.js, à gérer les erreurs et à contrôler les flux de données.



Installation de node-rdkafka



Pour installer la bibliothèque, vous avez besoin de Node.js version 12 ou supérieure et d'un compilateur C++ (gcc, clang ou MSVC). L'installation se fait via le gestionnaire de paquets standard :



npm install node-rdkafka


Si la compilation échoue, assurez-vous d'avoir installé build-essential (Linux) ou Python et les outils de compilation pour Windows (npm install --global windows-build-tools).



Création d'un Producer (expéditeur de messages)



Le Producer dans Kafka est responsable de la publication de messages dans les topics. Voici un exemple de base :



const Kafka = require('node-rdkafka');

// Création du producteurconst producer = new Kafka.Producer({ 'metadata.broker.list': 'localhost:9092', 'dr_cb': true // Callback pour confirmation de livraison});

// Gestionnaire d'événements à la connexionproducer.on('event.log', function(event) { console.log('Log :', event.message);});

// Gestionnaire d'erreursproducer.on('event.error', function(err) { console.error('Erreur du producteur :', err);});

// Connexion au brokerproducer.connect();

// Après connexion, envoi des messagesproducer.on('ready', function() { try { // Envoi d'un message dans le topic 'test-topic' producer.produce( 'test-topic', // nom du topic null, // partition (null = distribution automatique) Buffer.from('Bonjour, Kafka !'), // corps du message (Buffer) 'my-key', // clé du message (optionnelle) Date.now() // timestamp (optionnel) ); console.log('Message envoyé'); } catch (err) { console.error('Erreur lors de l\\'envoi :', err); }});

// N'oubliez pas d'appeler poll pour traiter les callbackssetInterval(() => { producer.poll();}, 1000);

// Fermeture de la connexion à la fin du processusprocess.on('SIGINT', () => { producer.disconnect(); process.exit();});


Notez que la méthode producer.produce() accepte le corps du message en tant que Buffer. Cela permet de transmettre aussi bien des chaînes que des données binaires. Le paramètre dr_cb: true active les notifications de callback de livraison (delivery report).



Création d'un Consumer (récepteur de messages)



Le Consumer s'abonne à un ou plusieurs topics et traite les messages entrants. Pour travailler avec des groupes de consommateurs, on utilise KafkaConsumer :



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('Erreur du consommateur :', err);});

consumer.on('ready', function() { console.log('Consommateur prêt'); // Abonnement au topic consumer.subscribe(['test-topic']); // Lancement du cycle de consommation consumer.consume();});

// Traitement de chaque messageconsumer.on('data', function(data) { console.log('Message reçu :'); console.log(' Topic :', data.topic); console.log(' Partition :', data.partition); console.log(' Clé :', data.key ? data.key.toString() : null); console.log(' Valeur :', data.value.toString());

Recommendations