Trabalhando com Kafka em JavaScript (Node.js): biblioteca node-rdkafka

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Apache Kafka e Node.js: introdução ao node-rdkafka



Apache Kafka é uma plataforma distribuída para streaming de eventos, que se tornou o padrão de facto para a construção de sistemas confiáveis e escaláveis de troca de dados. No ecossistema Node.js, uma das bibliotecas mais performáticas e maduras para trabalhar com Kafka é o node-rdkafka. Ela consiste em bindings nativos para a biblioteca librdkafka (escrita em C/C++), garantindo máxima velocidade e estabilidade.



Neste artigo, vamos detalhar como configurar e usar o node-rdkafka para enviar (producer) e ler (consumer) mensagens. Você aprenderá a integrar o Kafka na sua aplicação Node.js, tratar erros e gerenciar fluxos de dados.



Instalação do node-rdkafka



Para instalar a biblioteca, é necessário Node.js versão 12 ou superior e um compilador C++ (gcc, clang ou MSVC). A instalação é feita pelo gerenciador de pacotes padrão:



npm install node-rdkafka


Se a compilação falhar, certifique-se de ter instalado o build-essential (Linux) ou Python e as ferramentas de compilação para Windows (npm install --global windows-build-tools).



Criando um Producer (remetente de mensagens)



O Producer no Kafka é responsável por publicar mensagens em tópicos. Vejamos um exemplo básico:



const Kafka = require('node-rdkafka');

// Criando o produtorconst producer = new Kafka.Producer({ 'metadata.broker.list': 'localhost:9092', 'dr_cb': true // Callback para confirmação de entrega});

// Manipulador de eventos ao conectarproducer.on('event.log', function(event) { console.log('Log:', event.message);});

// Manipulador de errosproducer.on('event.error', function(err) { console.error('Erro no produtor:', err);});

// Conectando ao brokerproducer.connect();

// Após conectar, enviamos mensagensproducer.on('ready', function() { try { // Enviando mensagem para o tópico 'test-topic' producer.produce( 'test-topic', // nome do tópico null, // partição (null = distribuição automática) Buffer.from('Olá, Kafka!'), // corpo da mensagem (Buffer) 'my-key', // chave da mensagem (opcional) Date.now() // timestamp (opcional) ); console.log('Mensagem enviada'); } catch (err) { console.error('Erro ao enviar:', err); }});

// Não se esqueça de chamar poll para processar os callbackssetInterval(() => { producer.poll();}, 1000);

// Fechando a conexão ao encerrar o processoprocess.on('SIGINT', () => { producer.disconnect(); process.exit();});


Observe: o método producer.produce() aceita o corpo da mensagem como Buffer. Isso permite enviar tanto strings quanto dados binários. O parâmetro dr_cb: true ativa notificações de callback sobre a entrega (delivery report).



Criando um Consumer (receptor de mensagens)



O Consumer assina um ou mais tópicos e processa as mensagens recebidas. Para trabalhar com grupos de consumidores, usamos o 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('Erro no consumidor:', err);});

consumer.on('ready', function() { console.log('Consumidor pronto'); // Assinando o tópico consumer.subscribe(['test-topic']); // Iniciando o loop de consumo consumer.consume();});

// Processando cada mensagemconsumer.on('data', function(data) { console.log('Mensagem recebida:'); console.log(' Tópico:', data.topic); console.log(' Partição:', data.partition); console.log(' Chave:', data.key ? data.key.toString() : null); console.log(' Valor:', data.value.toString());

Recommendations