Implementando Apache Kafka com Docker e nodejs: Passo a Passo para Iniciantes
Tags: docker, node, javascript, kafka
Published: 2024-06-24 16:17:05

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?
1. 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.
2. 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.
3. 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.
4. 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.