Apache Kafka

Open Source 2024 Trending Mature Streaming

Plataforma distribuída de streaming para processamento de eventos em tempo real com alta throughput

O que é Apache Kafka?

Apache Kafka é uma plataforma distribuída de streaming de eventos open-source desenvolvida pela Apache Software Foundation. Originalmente criado pelo LinkedIn, Kafka é projetado para lidar com feeds de dados em tempo real de alta throughput, fornecendo uma arquitetura distribuída, tolerante a falhas e altamente escalável.

Kafka funciona como um sistema de mensageria publish-subscribe distribuído que pode processar trilhões de eventos por dia. Ele armazena streams de registros em categorias chamadas tópicos, permitindo que produtores publiquem dados e consumidores se inscrevam para receber esses dados em tempo real.

História

Desenvolvido inicialmente pelo LinkedIn em 2010 para lidar com seus requisitos de dados em tempo real, o Kafka foi doado para a Apache Software Foundation em 2011. Desde então, tornou-se uma das tecnologias de streaming mais populares, sendo adotado por empresas como Netflix, Uber, Spotify, Airbnb e muitas outras para casos de uso críticos de missão.

Arquitetura

A arquitetura do Kafka é baseada em alguns conceitos fundamentais:

  • Brokers: Servidores que armazenam e servem dados
  • Topics: Categorias de mensagens organizadas em partições
  • Partitions: Unidades de paralelismo e escalabilidade
  • Producers: Aplicações que publicam dados nos tópicos
  • Consumers: Aplicações que leem dados dos tópicos
  • ZooKeeper/KRaft: Coordenação de cluster (KRaft é a nova alternativa)

Vantagens

  • Alta throughput (milhões de mensagens por segundo)
  • Baixa latência para processamento em tempo real
  • Escalabilidade horizontal automática
  • Durabilidade e tolerância a falhas
  • Replicação de dados entre brokers
  • Suporte a múltiplas linguagens de programação
  • Ecossistema rico com Kafka Connect e Kafka Streams

Desvantagens

  • Complexidade de configuração e operação
  • Requer conhecimento especializado para otimização
  • Consumo significativo de recursos (CPU, memória, disco)
  • Dependência do ZooKeeper (em versões mais antigas)
  • Curva de aprendizado íngreme para iniciantes

Principais Recursos

🚀 Alta Performance

Throughput de milhões de mensagens por segundo com latência sub-milissegundo

📈 Escalabilidade

Escalabilidade horizontal automática adicionando brokers ao cluster

🔄 Replicação

Replicação automática de dados entre brokers para alta disponibilidade

💾 Persistência

Armazenamento durável em disco com configuração de retenção flexível

🔌 Kafka Connect

Framework para integração com sistemas externos (bancos, sistemas de arquivos)

🌊 Kafka Streams

Biblioteca para processamento de streams em tempo real

Especificações Técnicas

Versão Atual 3.6.0
Linguagem Principal Java, Scala
Protocolos TCP, HTTP, HTTPS
Serialização Avro, JSON, Protobuf, String
Retenção Configurável (tempo ou tamanho)
Throughput Milhões de mensagens/segundo

Casos de Uso

🔄 Event Sourcing

Armazenamento de todos os eventos que alteram o estado de uma aplicação, permitindo reconstrução do estado a qualquer momento.

📊 Real-time Analytics

Processamento de dados em tempo real para dashboards, alertas e tomada de decisões instantâneas.

🔗 Microservices Communication

Comunicação assíncrona entre microserviços com garantias de entrega e ordem.

📱 Activity Tracking

Rastreamento de atividades de usuários em aplicações web e mobile para análise comportamental.

🏗️ Data Pipeline

Construção de pipelines de dados robustos para ETL e integração entre sistemas.

Quando Usar Apache Kafka

✅ Recomendado para:
  • Aplicações que requerem alta throughput (>100k mensagens/segundo)
  • Sistemas que precisam de processamento em tempo real
  • Arquiteturas de microserviços com comunicação assíncrona
  • Pipelines de dados complexos com múltiplos consumidores
  • Sistemas que requerem durabilidade e replicação de dados
  • Event sourcing e CQRS patterns
⚠️ Considere alternativas se:
  • Volume de dados é baixo (<1k mensagens/segundo)
  • Equipe não tem experiência com sistemas distribuídos
  • Recursos de infraestrutura são limitados
  • Necessita de mensageria simples request-response
  • Orçamento para operação e manutenção é restrito

Exemplos Práticos

Instalação

# Download e extração
wget https://downloads.apache.org/kafka/2.13-3.6.0/kafka_2.13-3.6.0.tgz
tar -xzf kafka_2.13-3.6.0.tgz
cd kafka_2.13-3.6.0

# Iniciar Kafka com KRaft (sem ZooKeeper)
KAFKA_CLUSTER_ID="$(bin/kafka-storage.sh random-uuid)"
bin/kafka-storage.sh format -t $KAFKA_CLUSTER_ID -c config/kraft/server.properties
bin/kafka-server-start.sh config/kraft/server.properties

Configuração Básica

# server.properties
broker.id=1
listeners=PLAINTEXT://localhost:9092
log.dirs=/tmp/kafka-logs
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000

Exemplo Producer (Java)

import org.apache.kafka.clients.producer.*;
import java.util.Properties;

public class SimpleProducer {
    public static void main(String[] args) {
        Properties props = new Properties();
        props.put("bootstrap.servers", "localhost:9092");
        props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        
        Producer producer = new KafkaProducer<>(props);
        
        for (int i = 0; i < 100; i++) {
            ProducerRecord record = 
                new ProducerRecord<>("my-topic", "key-" + i, "message-" + i);
            
            producer.send(record, (metadata, exception) -> {
                if (exception != null) {
                    exception.printStackTrace();
                } else {
                    System.out.printf("Sent message to topic %s partition %d offset %d%n",
                        metadata.topic(), metadata.partition(), metadata.offset());
                }
            });
        }
        
        producer.close();
    }
}

Exemplo Consumer (Java)

import org.apache.kafka.clients.consumer.*;
import java.time.Duration;
import java.util.Arrays;
import java.util.Properties;

public class SimpleConsumer {
    public static void main(String[] args) {
        Properties props = new Properties();
        props.put("bootstrap.servers", "localhost:9092");
        props.put("group.id", "my-consumer-group");
        props.put("enable.auto.commit", "true");
        props.put("auto.commit.interval.ms", "1000");
        props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        
        KafkaConsumer consumer = new KafkaConsumer<>(props);
        consumer.subscribe(Arrays.asList("my-topic"));
        
        while (true) {
            ConsumerRecords records = consumer.poll(Duration.ofMillis(100));
            for (ConsumerRecord record : records) {
                System.out.printf("Received message: key=%s, value=%s, offset=%d, partition=%d%n",
                    record.key(), record.value(), record.offset(), record.partition());
            }
        }
    }
}

Comandos CLI Úteis

# Criar tópico
bin/kafka-topics.sh --create --topic my-topic --bootstrap-server localhost:9092 --partitions 3 --replication-factor 1

# Listar tópicos
bin/kafka-topics.sh --list --bootstrap-server localhost:9092

# Descrever tópico
bin/kafka-topics.sh --describe --topic my-topic --bootstrap-server localhost:9092

# Producer via console
bin/kafka-console-producer.sh --topic my-topic --bootstrap-server localhost:9092

# Consumer via console
bin/kafka-console-consumer.sh --topic my-topic --from-beginning --bootstrap-server localhost:9092

# Verificar consumer groups
bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --list
bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group my-consumer-group

Comparações

Kafka vs Alternativas de Streaming

Tecnologia Throughput Latência Durabilidade Complexidade Ecossistema
Apache Kafka Muito Alta Baixa Excelente Alta Rico
Apache Pulsar Alta Muito Baixa Excelente Moderada Crescendo
Amazon Kinesis Alta Baixa Boa Baixa AWS
RabbitMQ Moderada Muito Baixa Boa Baixa Maduro

Matriz de Decisão

🎯 Escolha Kafka se:
  • Precisa de throughput muito alto (>1M msgs/sec)
  • Requer durabilidade e replicação
  • Tem equipe experiente em sistemas distribuídos
  • Precisa de processamento de streams complexo
  • Quer ecossistema rico (Connect, Streams)
🔄 Considere alternativas se:
  • Volume de dados é baixo
  • Precisa de latência ultra-baixa
  • Equipe prefere soluções gerenciadas
  • Orçamento para operação é limitado
  • Casos de uso simples de mensageria
📊 Quick Facts
Versão Atual: 3.6.0
Licença: Apache 2.0
Linguagem: Java, Scala
Primeira Release: 2011
Última Atualização: Janeiro 2024
💼 Conteúdo Patrocinado