Trabalhando com Apache Kafka no Node.js: biblioteca KafkaJS

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

Trabalhando com Apache Kafka no Node.js usando a biblioteca KafkaJS

\n\n

Apache Kafka é uma plataforma distribuída para streaming de eventos, que se tornou o padrão de facto para a construção de sistemas de troca de mensagens de alta carga. No ecossistema Node.js, uma das bibliotecas mais populares e estáveis para interagir com Kafka é o KafkaJS. É um cliente moderno, totalmente assíncrono, escrito em JavaScript puro, que suporta todos os principais recursos do Kafka: produtores, consumidores, grupos de consumidores, gerenciamento de offsets e transações.

\n\n

Neste artigo, vamos detalhar como instalar o KafkaJS, configurar a conexão com um cluster Kafka, enviar e ler mensagens, além de abordar as melhores práticas para usar esta biblioteca em ambiente de produção.

\n\n

Instalação e configuração do KafkaJS

\n\n

A instalação da biblioteca é feita com o gerenciador de pacotes padrão npm:

\n\n
npm install kafkajs
\n\n

Após a instalação, é necessário criar um cliente, informando os endereços dos brokers e um identificador do cliente. Exemplo de configuração mínima:

\n\n
const { Kafka } = require('kafkajs');\n\nconst kafka = new Kafka({\n  clientId: 'my-app',\n  brokers: ['localhost:9092']\n});
\n\n

Para ambientes de produção, recomenda-se informar vários brokers separados por vírgula para garantir tolerância a falhas, além de configurar SSL e autenticação SASL:

\n\n
const 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\n

Produtor: enviando mensagens para um tópico

\n\n

O produtor é responsável por publicar mensagens em um tópico Kafka específico. O KafkaJS oferece dois modos de operação do produtor: simples (send) e transacional (para entrega exata). Vamos ver um exemplo básico de envio de mensagem:

\n\n
const 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: 'Hello Kafka from 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\n

Pontos-chave:

\n
    \n
  • topic — nome do tópico para o qual a mensagem é enviada.
  • \n
  • messages — array de objetos, cada um podendo conter key (opcional) e value (string ou Buffer).
  • \n
  • Recomenda-se chamar producer.connect() apenas uma vez ao iniciar a aplicação e reutilizar a conexão.
  • \n
\n\n

Para melhorar o desempenho em produção, use pool de conexões e a configuração acks:

\n\n
const producer = kafka.producer({\n  allowAutoTopicCreation: false,\n  transactionTimeout: 30000\n});\n\nawait producer.send({\n  topic: 'orders',\n  messages: [{ value: 'New order' }],\n  acks: -1  // Aguardar confirmação de todas as réplicas\n});
\n\n

Consumidor: lendo mensagens de um tópico

\n\n

O consumidor permite ler mensagens de um ou mais tópicos. O conceito mais importante são os grupos de consumidores (consumer groups), que garantem balanceamento de carga e que cada mensagem seja processada por apenas um consumidor do grupo.

\n\n
const 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                    

Recommendations