Travailler avec Apache Kafka dans Node.js : la bibliothèque KafkaJS

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

Travailler avec Apache Kafka dans Node.js à l'aide de la bibliothèque KafkaJS

\n\n

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 messages à forte charge. Dans l'écosystème Node.js, l'une des bibliothèques les plus populaires et stables pour interagir avec Kafka est KafkaJS. Il s'agit d'un client moderne, entièrement asynchrone, écrit en JavaScript pur, qui prend en charge toutes les fonctionnalités clés de Kafka : producteurs, consommateurs, groupes de consommateurs, gestion des offsets et transactions.

\n\n

Dans cet article, nous allons détailler comment installer KafkaJS, configurer la connexion à un cluster Kafka, envoyer et lire des messages, et examiner les meilleures pratiques pour utiliser cette bibliothèque en environnement de production.

\n\n

Installation et configuration de KafkaJS

\n\n

L'installation de la bibliothèque se fait avec le gestionnaire de paquets standard npm :

\n\n
npm install kafkajs
\n\n

Après l'installation, il est nécessaire de créer un client en spécifiant les adresses des brokers et un identifiant client. Exemple de configuration minimale :

\n\n
const { Kafka } = require('kafkajs');\n\nconst kafka = new Kafka({\n  clientId: 'my-app',\n  brokers: ['localhost:9092']\n});
\n\n

Pour un environnement de production, il est recommandé de spécifier plusieurs brokers séparés par des virgules pour assurer la tolérance aux pannes, ainsi que de configurer SSL et l'authentification SASL :

\n\n
const kafka = new Kafka({\n  clientId: 'my-production-app',\n  brokers: ['broker1:9092', 'broker2:9092', 'broker3:9092'],\n  ssl: true,\n  sasl: {\n    mechanism: 'scram-sha-256',\n    username: 'myuser',\n    password: 'mypassword'\n  }\n});
\n\n

Producteur : envoi de messages dans un topic

\n\n

Le producteur est responsable de la publication des messages dans un topic Kafka spécifié. KafkaJS propose deux modes de fonctionnement pour le producteur : simple (send) et transactionnel (pour une livraison exacte). Voici un exemple de base d'envoi de message :

\n\n
const producer = kafka.producer();\n\nasync function sendMessage() {\n  await producer.connect();\n\n  await producer.send({\n    topic: 'test-topic',\n    messages: [\n      { key: 'user1', value: 'Bonjour Kafka depuis Node.js!' },\n      { key: 'user2', value: JSON.stringify({ orderId: 123, amount: 2500 }) }\n    ]\n  });\n\n  await producer.disconnect();\n}\n\nsendMessage().catch(console.error);
\n\n

Points clés :

\n
    \n
  • topic — le nom du topic dans lequel le message est envoyé.
  • \n
  • messages — un tableau d'objets, chacun pouvant contenir une key (optionnelle) et une value (chaîne ou Buffer).
  • \n
  • Il est recommandé d'appeler producer.connect() une seule fois au démarrage de l'application et de réutiliser la connexion.
  • \n
\n\n

Pour améliorer les performances en production, utilisez un pool de connexions et la configuration acks :

\n\n
const producer = kafka.producer({\n  allowAutoTopicCreation: false,\n  transactionTimeout: 30000\n});\n\nawait producer.send({\n  topic: 'orders',\n  messages: [{ value: 'Nouvelle commande' }],\n  acks: -1  // Attente de confirmation de toutes les répliques\n});
\n\n

Consommateur : lecture des messages d'un topic

\n\n

Le consommateur permet de lire les messages d'un ou plusieurs topics. Le concept le plus important est celui des groupes de consommateurs (consumer groups), qui assurent l'équilibrage de charge et garantissent que chaque message est traité par un seul consommateur du groupe.

\n\n
const consumer = kafka.consumer({ groupId: 'my-group' });\n\nasync function consumeMessages() {\n  await consumer.connect();\n  await consumer.subscribe({ topic: 'test-topic', fromBeginning: true });\n\n  await consumer.run({\n    eachMessage: async ({ topic, partition, message }) => {\n      console.log({\n        partition,\n        offset: message.offset,\n        key: message.key.toString(),\n        value: message.valu                    

Recommendations