Biblioteca KafkaJS: trabalhando com Apache Kafka em TypeScript
\n\nApache Kafka é uma plataforma distribuída para processamento de fluxo de dados, amplamente utilizada para construir sistemas de troca de mensagens de alta carga. No ecossistema TypeScript (e Node.js), a biblioteca KafkaJS tornou-se o padrão de facto. Ela fornece uma API limpa e moderna com suporte total a TypeScript, permitindo que desenvolvedores escrevam código type-safe para produtores e consumidores Kafka.
\n\nNeste artigo, abordaremos detalhadamente a instalação, configuração e os principais cenários de uso do KafkaJS. Você aprenderá como enviar e receber mensagens, tratar erros e configurar corretamente o cliente para ambientes de produção.
\n\nInstalação e configuração do KafkaJS
\n\nPara começar, instale a biblioteca via npm ou yarn:
\n\nnpm install kafkajs\n# ou\nyarn add kafkajs\n\nKafkaJS é escrito em TypeScript, portanto os tipos já estão embutidos — não é necessário instalar @types/kafkajs adicionalmente.
Agora, vamos criar uma instância do cliente Kafka. Recomenda-se especificar vários brokers para tolerância a falhas:
\n\nimport { Kafka, logLevel } from 'kafkajs';\n\nconst kafka = new Kafka({\n clientId: 'my-app',\n brokers: ['localhost:9092', 'localhost:9093'],\n logLevel: logLevel.INFO, // Nível de log\n retry: {\n initialRetryTime: 100,\n retries: 8\n }\n});\n\nProdutor: enviando mensagens para o Kafka
\n\nO produtor (producer) é responsável por escrever mensagens nos tópicos do Kafka. O KafkaJS fornece uma API conveniente para enviar mensagens individuais ou em lote.
\n\nExemplo de um produtor básico:
\n\nimport { Kafka, Producer } from 'kafkajs';\n\nasync function produceMessage(producer: Producer) {\n await producer.send({\n topic: 'orders',\n messages: [\n { \n key: 'order-123', \n value: JSON.stringify({ userId: 42, amount: 1500 }) \n },\n ],\n });\n console.log('Mensagem enviada');\n}\n\nasync function runProducer() {\n const producer = kafka.producer();\n await producer.connect();\n\n // Envio de múltiplas mensagens\n await producer.send({\n topic: 'orders',\n messages: [\n { key: 'order-124', value: '{"item":"laptop"}' },\n { key: 'order-125', value: '{"item":"mouse"}' },\n ],\n });\n\n await produceMessage(producer);\n await producer.disconnect();\n}\n\nrunProducer().catch(console.error);\n\nImportante: Sempre chame disconnect() após finalizar o trabalho para liberar recursos. Para aplicações de longa duração, o produtor pode ser mantido conectado permanentemente.
Consumidor: lendo mensagens do Kafka
\n\nO consumidor (consumer) se inscreve em um ou mais tópicos e processa as mensagens. O KafkaJS suporta grupos de consumidores para processamento paralelo.
\n\nExemplo de um consumidor com processamento de mensagens:
\n\nimport { Kafka, Consumer, EachMessagePayload } from 'kafkajs';\n\nasync function runConsumer() {\n const consumer: Consumer = kafka.consumer({ \n groupId: 'order-processor-group' \n });\n\n await consumer.connect();\n await consumer.subscribe({ \n topic: 'orders', \n fromBeginning: true // Ler desde a primeira mensagem\n });\n\n await consumer.run({\n eachMessage: async ({ topic, partition, message }: EachMessagePayload) => {\n const key = message.key?.toString();\n const value = message.value?.toString();\n console.log({\n partition,\n offset: message.offset,\n key,\n value: value ? JSON.parse(value) : null,\n });\n },\n });\n}\n\nrunConsumer().catch(console.error);\n\nObserve o parâmetro fromBeginning: se definido como true, o consumidor lerá todas as mensagens acumuladas anteriormente. Para ambientes de produção, geralmente usa-se false (apenas mensagens novas).
Também na biblioteca
Tokens JWT em Swift: guia completo para trabalhar com JSON Web Tokens
Trabalhando com CSV em TypeScript: bibliotecas e exemplos de código
Guia completo de POCO C++ com exemplos práticos
Processamento de imagens em C#: redimensionar e cortar com a biblioteca ImageSharp
Sharp para JavaScript (Node.js): guia completo com exemplos