Travailler avec Apache Kafka dans Node.js à l'aide de la bibliothèque KafkaJS
\n\nApache 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\nDans 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\nInstallation et configuration de KafkaJS
\n\nL'installation de la bibliothèque se fait avec le gestionnaire de paquets standard npm :
\n\nnpm install kafkajs\n\nAprè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\nconst { Kafka } = require('kafkajs');\n\nconst kafka = new Kafka({\n clientId: 'my-app',\n brokers: ['localhost:9092']\n});\n\nPour 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\nconst 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\nProducteur : envoi de messages dans un topic
\n\nLe 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\nconst 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\nPoints 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 unevalue(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
Pour améliorer les performances en production, utilisez un pool de connexions et la configuration acks :
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\nConsommateur : lecture des messages d'un topic
\n\nLe 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\nconst 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 Aussi dans la bibliothèque
GraphQL en C++ : la bibliothèque cppgraphqlgen pour les API modernes
Hangfire pour C# (.NET) : guide complet avec exemples
Packages Spatie pour PHP : guide complet avec exemples
gRPC en Rust : bibliothèques Tonic et Grpc-rs avec exemples