Trabalhando com Apache Kafka no Node.js usando a biblioteca KafkaJS
\n\nApache 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\nNeste 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\nInstalação e configuração do KafkaJS
\n\nA instalação da biblioteca é feita com o gerenciador de pacotes padrão npm:
\n\nnpm install kafkajs\n\nApó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\nconst { Kafka } = require('kafkajs');\n\nconst kafka = new Kafka({\n clientId: 'my-app',\n brokers: ['localhost:9092']\n});\n\nPara 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\nconst 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\nProdutor: enviando mensagens para um tópico
\n\nO 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\nconst 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\nPontos-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) evalue(string ou Buffer). \n - Recomenda-se chamar
producer.connect()apenas uma vez ao iniciar a aplicação e reutilizar a conexão. \n
Para melhorar o desempenho em produção, use pool de conexões e a configuração acks:
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\nConsumidor: lendo mensagens de um tópico
\n\nO 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\nconst 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 Também na biblioteca
Parsing de HTML em PHP: visão geral de bibliotecas e ferramentas
Frameworks CLI para Java: Picocli, JCommander e Spring Shell
Playwright para JavaScript (Node.js): guia completo com exemplos
Trabalhando com CSV em TypeScript: bibliotecas e exemplos de código