Trabalhando com Kafka em TypeScript usando KafkaJS
Apache Kafka é uma plataforma distribuída para streaming de dados, amplamente utilizada em arquitetura de microsserviços, processamento de eventos e análise em tempo real. Ao desenvolver em TypeScript, uma das bibliotecas mais populares para interagir com Kafka é o KafkaJS. Ela fornece uma API moderna e assíncrona com suporte completo a TypeScript, tornando-a a escolha ideal para criar aplicações robustas e escaláveis.
O que é KafkaJS?
KafkaJS é uma biblioteca cliente para Apache Kafka, escrita em JavaScript/TypeScript. Ela suporta todas as operações principais: envio e leitura de mensagens, gerenciamento de grupos de consumidores, trabalho com tópicos e partições. Graças aos tipos integrados, o KafkaJS oferece tipagem estrita e autocompletar na IDE, o que simplifica significativamente o desenvolvimento e a depuração.
Instalação do KafkaJS
Para começar, instale a biblioteca via npm:
npm install kafkajsSe você usa TypeScript, tipos adicionais não são necessários — eles já estão incluídos no pacote.
Configuração básica e conexão
O primeiro passo é criar uma instância do cliente Kafka. Especifique o ID do cliente e os endereços dos brokers:
import { Kafka } from 'kafkajs';
const kafka = new Kafka({ clientId: 'my-app', brokers: ['localhost:9092']});
// Verificar conexãoconst admin = kafka.admin();await admin.connect();console.log('Conectado ao Kafka');await admin.disconnect();Criando um produtor (Producer)
O produtor envia mensagens para tópicos. O KafkaJS suporta a criação automática de tópicos ao enviar (se habilitado na configuração do broker).
import { Kafka, Partitioners } from 'kafkajs';
const producer = kafka.producer({ createPartitioner: Partitioners.DefaultPartitioner});
await producer.connect();
// Enviar uma única mensagemawait producer.send({ topic: 'orders', messages: [ { key: 'order-123', value: JSON.stringify({ userId: 1, amount: 250 }) } ]});
// Enviar múltiplas mensagensawait producer.send({ topic: 'orders', messages: [ { key: 'order-124', value: 'Message 2' }, { key: 'order-125', value: 'Message 3' } ]});
await producer.disconnect();Criando um consumidor (Consumer)
O consumidor lê mensagens dos tópicos. Ele deve estar inscrito em um ou mais tópicos e registrado em um 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(), }); },});Trabalhando com grupos de consumidores
Grupos de consumidores permitem distribuir a carga entre várias instâncias de consumidores. O Kafka atribui automaticamente partições de tópicos a diferentes consumidores dentro do mesmo grupo. Se um consumidor falhar, suas partições são redistribuídas.
// Dois consumidores no mesmo grupo lerão partições diferentesconst consumer1 = kafka.consumer({ groupId: 'order-group' });const consumer2 = kafka.consumer({ groupId: 'order-group' });
// Cada um se inscreve no mesmo tópicoawait consumer1.subscribe({ topic: 'orders' });await consumer2.subscribe({ topic: 'orders' });Tratamento de erros e novas tentativas
Em aplicações reais, é importante tratar corretamente erros de conexão, timeouts e falhas. O KafkaJS oferece vários mecanismos:
- Retry — novas tentativas automáticas em caso de erros temporários.