Implementando Apache Kafka com Docker e nodejs: Passo a Passo para Iniciantes

Lucas Pereira de Souza - Jun 24 - - Dev Community

Apache Kafka com Docker e nodejs
Introdução
No mundo moderno da tecnologia, onde dados são gerados e consumidos em volumes sem precedentes, a necessidade de sistemas que possam lidar com grandes fluxos de informação se torna cada vez mais crucial. Apache Kafka é uma dessas ferramentas revolucionárias que tem ganhado popularidade significativa entre empresas que precisam gerenciar grandes volumes de dados em tempo real. Mas o que exatamente é Kafka, e por que ele é tão importante?
O Que é Apache Kafka?
Apache Kafka é uma plataforma de streaming distribuída, open-source, projetada para construir pipelines de dados em tempo real e aplicações de streaming. Inicialmente desenvolvido pela LinkedIn e posteriormente doado para a Apache Software Foundation, Kafka se tornou um componente fundamental para muitas empresas que precisam processar grandes quantidades de dados de maneira eficiente.
Como Funciona o Kafka?
Kafka funciona como um sistema de mensageria, onde produtores enviam mensagens para tópicos específicos, e consumidores leem essas mensagens. Aqui estão os principais componentes do Kafka:

  • Produtores: Aplicações que publicam mensagens para um ou mais tópicos no Kafka.
  • Consumidores: Aplicações que leem mensagens de tópicos.
  • Tópicos: Categorias para onde as mensagens são enviadas. Cada tópico é particionado e replicado para fornecer alta disponibilidade e resiliência.
  • Brokers: Servidores que armazenam dados e atendem solicitações de produtores e consumidores.
  • ZooKeeper: Utilizado para gerenciar o cluster Kafka, mantendo informações sobre o estado do sistema. A arquitetura distribuída do Kafka permite que ele lide com grandes volumes de dados e forneça um alto nível de resiliência e escalabilidade. Por Que o Kafka é Importante?
  • Processamento em Tempo Real Em vez de lidar com dados de maneira batch, Kafka permite o processamento contínuo de fluxos de dados. Isso é crucial para aplicações que precisam de respostas imediatas, como monitoramento de sistemas, detecção de fraudes, e análise de comportamento de usuários em tempo real.
  • Escalabilidade e Desempenho Kafka é altamente escalável, permitindo que empresas aumentem ou diminuam a capacidade conforme necessário. Ele pode processar milhões de mensagens por segundo com baixa latência, tornando-o ideal para aplicações de missão crítica.
  • Durabilidade e Resiliência Graças à sua arquitetura de replicação, Kafka garante que os dados não sejam perdidos, mesmo em caso de falhas de hardware. Isso oferece um nível de confiança elevado para empresas que dependem de dados precisos e disponíveis.
  • Flexibilidade e Integração Kafka pode se integrar com uma variedade de sistemas e plataformas, incluindo Hadoop, Spark, e sistemas de banco de dados tradicionais. Isso o torna uma escolha versátil para diferentes tipos de arquitetura de dados. Casos de Uso do Kafka Monitoramento de Aplicações Empresas utilizam Kafka para monitorar a saúde e desempenho de suas aplicações em tempo real. Logs de aplicações são enviados para Kafka, onde são processados e analisados para detectar problemas antes que afetem os usuários finais. Análise de Dados Plataformas de análise de dados em tempo real usam Kafka para ingerir e processar grandes volumes de dados de várias fontes. Isso permite insights rápidos e ações informadas baseadas em dados atualizados. Sistemas de Recomendação Empresas como Netflix e Spotify usam Kafka para processar dados de interação de usuários e gerar recomendações personalizadas. Isso melhora a experiência do usuário ao oferecer conteúdo relevante de forma rápida. Exemplo: Usando Docker Compose Para uma configuração mais completa e fácil de gerenciar, você pode usar o Docker Compose com Zookeeper e Kafka. docker-compose.yml version: '2' services: zookeeper: container_name: zookeeper image: confluentinc/cp-zookeeper:7.3.0 hostname: zookeeper ports:
    • "2181:2181" environment: ZOOKEEPER_CLIENT_PORT: 2181 ZOOKEEPER_SERVER_ID: 1 ZOOKEEPER_SERVERS: zookeeper:2888:3888

kafka:
image: confluentinc/cp-kafka:7.3.0
hostname: kafka
container_name: kafka
ports:
- "9092:9092"
- "29092:29092"
- "9999:9999"
environment:
KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka:19092,EXTERNAL://172.10.0.16:9092,DOCKER://172.10.0.16:29092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT,DOCKER:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181"
KAFKA_BROKER_ID: 1
KAFKA_LOG4J_LOGGERS: "kafka.controller=INFO,kafka.producer.async.DefaultEventHandler=INFO,state.change.logger=INFO"
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_JMX_PORT: 9001
KAFKA_JMX_HOSTNAME: ${KAFKA_IP:-172.10.0.16}
KAFKA_AUTHORIZER_CLASS_NAME: kafka.security.authorizer.AclAuthorizer
KAFKA_ALLOW_EVERYONE_IF_NO_ACL_FOUND: "true"
depends_on:
- zookeeper
Código para Produzir Mensagens: Este código mostra como produzir mensagens para um tópico Kafka usando KafkaJS.
import { Kafka } from 'kafkajs';

const kafka = new Kafka({
clientId: 'my-app',
brokers: ['localhost:9092'] // Substitua pelo endereço dos seus brokers
});

const producer = kafka.producer();

const runProducer = async () => {
// Conecte o produtor
await producer.connect();

// Envie uma mensagem para o tópico 'test-topic'
await producer.send({
topic: 'test-topic',
messages: [
{ value: 'Hello KafkaJS user!' },
],
});

// Desconecte o produtor
await producer.disconnect();
};

runProducer().catch(console.error);
Código para Consumir Mensagens: Este código mostra como consumir mensagens de um tópico Kafka usando KafkaJS.
import { Kafka } from 'kafkajs';

const kafka = new Kafka({
clientId: 'my-app',
brokers: ['localhost:9092'] // Substitua pelo endereço dos seus brokers
});

const consumer = kafka.consumer({ groupId: 'test-group' });

const runConsumer = async () => {
// Conecte o consumidor
await consumer.connect();

// Subscreva ao tópico 'test-topic'
await consumer.subscribe({ topic: 'test-topic', fromBeginning: true });

// Consuma mensagens
await consumer.run({
eachMessage: async ({ topic, partition, message }) => {
console.log({
value: message.value.toString(),
});
},
});
};

runConsumer().catch(console.error);
Conclusão
Apache Kafka tem se consolidado como uma ferramenta indispensável para empresas que lidam com grandes volumes de dados e necessitam de processamento em tempo real. Sua escalabilidade, durabilidade e flexibilidade fazem dele a escolha ideal para uma ampla gama de aplicações, desde monitoramento de sistemas até análise de dados e sistemas de recomendação. À medida que o volume de dados continua a crescer, a importância de ferramentas como Kafka só tende a aumentar, posicionando-se como uma peça chave na infraestrutura de dados moderna.

. . .