Trabajo con Kafka en TypeScript usando KafkaJS
Apache Kafka es una plataforma distribuida para transmisión de datos en flujo, ampliamente utilizada en arquitectura de microservicios, procesamiento de eventos y análisis en tiempo real. Al desarrollar en TypeScript, una de las librerías más populares para interactuar con Kafka es KafkaJS. Proporciona una API moderna y asíncrona con soporte completo para TypeScript, lo que la convierte en la elección ideal para crear aplicaciones robustas y escalables.
¿Qué es KafkaJS?
KafkaJS es una librería cliente para Apache Kafka, escrita en JavaScript/TypeScript. Soporta todas las operaciones principales: envío y lectura de mensajes, gestión de grupos de consumidores, trabajo con tópicos y particiones. Gracias a los tipos integrados, KafkaJS proporciona tipado estricto y autocompletado en el IDE, lo que simplifica enormemente el desarrollo y la depuración.
Instalación de KafkaJS
Para empezar, instale la librería mediante npm:
npm install kafkajsSi usa TypeScript, no se requieren tipos adicionales, ya están incluidos en el paquete.
Configuración básica y conexión
El primer paso es crear una instancia del cliente Kafka. Especifique el identificador del cliente y las direcciones de los brokers:
import { Kafka } from 'kafkajs';
const kafka = new Kafka({ clientId: 'my-app', brokers: ['localhost:9092']});
// Verificar conexiónconst admin = kafka.admin();await admin.connect();console.log('Connected to Kafka');await admin.disconnect();Creación de un productor (Producer)
El productor envía mensajes a los tópicos. KafkaJS admite la creación automática de tópicos al enviar (si está habilitado en la configuración del broker).
import { Kafka, Partitioners } from 'kafkajs';
const producer = kafka.producer({ createPartitioner: Partitioners.DefaultPartitioner});
await producer.connect();
// Enviar un solo mensajeawait producer.send({ topic: 'orders', messages: [ { key: 'order-123', value: JSON.stringify({ userId: 1, amount: 250 }) } ]});
// Enviar varios mensajesawait producer.send({ topic: 'orders', messages: [ { key: 'order-124', value: 'Message 2' }, { key: 'order-125', value: 'Message 3' } ]});
await producer.disconnect();Creación de un consumidor (Consumer)
El consumidor lee mensajes de los tópicos. Debe suscribirse a uno o varios tópicos y estar registrado en un grupo de consumidores (consumer group).
const consumer = kafka.consumer({ groupId: 'order-group' });
await consumer.connect();await consumer.subscribe({ topic: 'orders', fromBeginning: true });
await consumer.run({ eachMessage: async ({ topic, partition, message }) => { console.log({ partition, offset: message.offset, key: message.key?.toString(), value: message.value?.toString(), }); },});Trabajo con grupos de consumidores
Los grupos de consumidores permiten distribuir la carga entre varias instancias de consumidor. Kafka asigna automáticamente las particiones del tópico a diferentes consumidores dentro de un mismo grupo. Si un consumidor falla, sus particiones se redistribuyen.
// Dos consumidores en el mismo grupo leerán diferentes particionesconst consumer1 = kafka.consumer({ groupId: 'order-group' });const consumer2 = kafka.consumer({ groupId: 'order-group' });
// Cada uno se suscribe al mismo tópicoawait consumer1.subscribe({ topic: 'orders' });await consumer2.subscribe({ topic: 'orders' });Manejo de errores y reintentos
En aplicaciones reales, es importante manejar correctamente errores de conexión, tiempos de espera y fallos. KafkaJS proporciona varios mecanismos:
- Retry — reintentos automáticos ante errores temporales.
También en la biblioteca
Configuración de aplicaciones Go (Golang): bibliotecas y herramientas
Caching en PHP: Redis, Memcached, APCu y caching de archivos
Caching en TypeScript: Redis, node-cache y otras herramientas