Apache Kafka y Node.js: introducción a node-rdkafka
Apache Kafka es una plataforma distribuida para streaming de eventos, que se ha convertido en el estándar de facto para construir sistemas confiables y escalables de intercambio de datos. En el ecosistema de Node.js, una de las bibliotecas más eficientes y maduras para trabajar con Kafka es node-rdkafka. Esta proporciona enlaces nativos a la biblioteca librdkafka (escrita en C/C++), lo que garantiza la máxima velocidad y estabilidad.
En este artículo, analizaremos en detalle cómo configurar y usar node-rdkafka para enviar (producer) y leer (consumer) mensajes. Aprenderá a integrar Kafka en su aplicación Node.js, manejar errores y gestionar flujos de datos.
Instalación de node-rdkafka
Para instalar la biblioteca se requiere Node.js versión 12 o superior y un compilador de C++ (gcc, clang o MSVC). La instalación se realiza con el gestor de paquetes estándar:
npm install node-rdkafkaSi la compilación falla, asegúrese de tener instalados build-essential (Linux) o Python y las herramientas de compilación para Windows (npm install --global windows-build-tools).
Creación de un Producer (emisor de mensajes)
El Producer en Kafka se encarga de publicar mensajes en los tópicos. Veamos un ejemplo básico:
const Kafka = require('node-rdkafka');
// Creamos el productorconst producer = new Kafka.Producer({ 'metadata.broker.list': 'localhost:9092', 'dr_cb': true // Callback para confirmación de entrega});
// Manejador de eventos al conectarseproducer.on('event.log', function(event) { console.log('Log:', event.message);});
// Manejador de erroresproducer.on('event.error', function(err) { console.error('Error del productor:', err);});
// Nos conectamos al brokerproducer.connect();
// Después de la conexión, enviamos mensajesproducer.on('ready', function() { try { // Envío de mensaje al tópico 'test-topic' producer.produce( 'test-topic', // nombre del tópico null, // partición (null = distribución automática) Buffer.from('¡Hola, Kafka!'), // cuerpo del mensaje (Buffer) 'my-key', // clave del mensaje (opcional) Date.now() // timestamp (opcional) ); console.log('Mensaje enviado'); } catch (err) { console.error('Error al enviar:', err); }});
// No olvide llamar a poll para procesar los callbackssetInterval(() => { producer.poll();}, 1000);
// Cierre de conexión al finalizar el procesoprocess.on('SIGINT', () => { producer.disconnect(); process.exit();});Tenga en cuenta: el método producer.produce() acepta el cuerpo del mensaje como Buffer. Esto permite transmitir tanto cadenas como datos binarios. El parámetro dr_cb: true habilita las notificaciones de callback sobre la entrega (delivery report).
Creación de un Consumer (receptor de mensajes)
El Consumer se suscribe a uno o varios tópicos y procesa los mensajes entrantes. Para trabajar con grupos de consumidores se utiliza 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('Error del consumidor:', err);});
consumer.on('ready', function() { console.log('Consumidor listo'); // Nos suscribimos al tópico consumer.subscribe(['test-topic']); // Iniciamos el ciclo de consumo consumer.consume();});
// Procesamiento de cada mensajeconsumer.on('data', function(data) { console.log('Mensaje recibido:'); console.log(' Tópico:', data.topic); console.log(' Partición:', data.partition); console.log(' Clave:', data.key ? data.key.toString() : null); console.log(' Valor:', data.value.toString()); También en la biblioteca
Contenedor de Inyección de Dependencias en C++: biblioteca Fruit para la inyección de dependencias
Contenedor de Inyección de Dependencias Swift: Swinject para iOS/macOS