O que é Kafka e por que foi criado
A origem do Apache Kafka no LinkedIn
O Apache Kafka foi criado pelo LinkedIn em 2011 para resolver um problema específico: processar bilhões de eventos de atividade de usuários por dia sem sobrecarregar os bancos de dados relacionais. Diferente de sistemas de filas tradicionais como RabbitMQ, o Kafka foi projetado como um log distribuído e imutável de eventos, onde mensagens são retidas por um período configurável mesmo após serem consumidas. Essa decisão arquitetural muda completamente como sistemas distribuídos lidam com integração e reprocessamento de dados. Hoje, Kafka é usado por mais de 80% das empresas da Fortune 100 como espinha dorsal de pipelines de dados em tempo real.
Topics e partições - como o Kafka organiza dados
Paralelismo via particionamento
No Kafka, dados são organizados em topics, que funcionam como categorias lógicas de eventos. Cada topic é dividido em partições, que são a unidade de paralelismo do sistema. Cada partição é um log ordenado e imutável onde eventos são escritos sequencialmente com um offset crescente. A quantidade de partições define o nível máximo de paralelismo de consumo: com 12 partições, até 12 consumers de um mesmo grupo podem processar em paralelo. A escolha do número de partições é uma decisão de arquitetura importante, pois aumentar partições depois tem custos operacionais significativos.
Producers - publicando eventos no Kafka
Como dados chegam ao cluster
Producers são os responsáveis por publicar mensagens em topics do Kafka. Por padrão, o particionamento é feito com base em uma chave: mensagens com a mesma chave sempre vão para a mesma partição, garantindo ordenação por chave. Sem chave definida, o producer distribui mensagens entre partições usando round-robin ou sticky partitioning. Producers podem configurar o nível de durabilidade com o parametro acks: acks=0 ignora confirmações, acks=1 espera confirmação do leader, e acks=all exige confirmação de todas as replicas in-sync, garantindo zero perda de dados em falhas. A escolha de acks impacta diretamente o throughput e a latência do producer.
Consumers e consumer groups - processando em paralelo
Escalabilidade horizontal no consumo
Consumers se organizam em consumer groups para processar partições em paralelo. Cada partição é atribuída a exatamente um consumer dentro de um grupo, garantindo que cada mensagem seja processada uma única vez por grupo. Quando um consumer falha ou um novo é adicionado, o Kafka realiza um rebalanceamento automático, redistribuindo partições entre os consumers ativos. Múltiplos consumer groups independentes podem consumir o mesmo topic simultaneamente, cada um mantendo seu próprio offset, o que permite que sistemas diferentes processem os mesmos eventos sem interferência. Esse modelo é fundamental para fan-out de eventos em arquiteturas orientadas a eventos.
Offset - controlando o que já foi processado
O ponteiro de progresso do consumer
O offset é um número inteiro que identifica a posição de uma mensagem dentro de uma partição. Consumers armazenam seus offsets no topic interno __consumer_offsets do próprio Kafka, eliminando a dependência de sistemas externos para rastrear progresso. Consumers podem fazer commit de offsets automaticamente (auto.commit) ou manualmente, sendo o commit manual necessário para garantir processamento confiável: o offset só é commitado após a mensagem ser processada com sucesso. A capacidade de resetar offsets para uma posição anterior (earliest, latest ou timestamp específico) permite reprocessamento de eventos históricos sem republica-los, uma característica exclusiva de sistemas baseados em log imutável.
Retention e compaction - quanto tempo guardar eventos
Politicas de retenção no Kafka
O Kafka oferece duas estratégias de retenção de dados: baseada em tempo e em tamanho. Com retenção por tempo (retention.ms), mensagens são deletadas após um período configurável, tipicamente 7 dias em ambientes de produção. Com retenção por tamanho (retention.bytes), mensagens antigas são removidas quando a partição atinge o limite definido. Além dessas políticas, o Kafka oferece log compaction, onde apenas a mensagem mais recente de cada chave é mantida indefinidamente, descartando versões antigas. Log compaction é ideal para topics que representam estado atual, como configurações ou snapshots de entidades, onde o histórico completo não é necessário mas o último valor de cada chave deve ser preservado.
Kafka Connect - integrando com bancos e sistemas externos
Conectores prontos para uso
Kafka Connect é um framework para integração de dados entre Kafka e sistemas externos como bancos de dados, sistemas de arquivos, filas e APIs. Ele opera através de conectores divididos em dois tipos: Source Connectors, que leem dados de sistemas externos e publicam no Kafka, e Sink Connectors, que consomem do Kafka e escrevem em sistemas externos. O Debezium é um dos conectores mais populares, implementando Change Data Capture (CDC) para capturar alterações em bancos relacionais como PostgreSQL e MySQL e propagá-las como eventos no Kafka. Kafka Connect escala horizontalmente e gerencia offsets automaticamente, eliminando a necessidade de código customizado para pipelines de integração comuns.
Kafka Streams - processamento em tempo real
Transformações sobre streams de dados
Kafka Streams é uma biblioteca cliente Java/Scala para processamento de streams diretamente sobre dados do Kafka, sem necessidade de infraestrutura adicional como Spark ou Flink. Com Kafka Streams é possível filtrar, transformar, agregar, fazer join entre topics e construir tabelas KTable que representam o estado atual derivado de um stream de eventos. O processamento é stateful: a biblioteca gerencia state stores locais (baseados em RocksDB) para operações de agregação, com suporte nativo a windowing para calcular métricas em janelas de tempo deslizantes ou fixas. Por rodar como parte da aplicação, Kafka Streams tem overhead operacional mínimo comparado a frameworks de processamento distribuído separados.
Schema Registry - garantindo contratos de dados
Evolução segura de esquemas em produção
O Schema Registry, desenvolvido pela Confluent, resolve um problema crítico em sistemas baseados em eventos: como garantir que producers e consumers concordam com o formato das mensagens ao longo do tempo. Ele armazena schemas Avro, JSON Schema ou Protobuf centralizados, e producers serializam mensagens incluindo o ID do schema usado. Consumers recuperam o schema pelo ID para deserializar corretamente, sem precisar de coordenação manual. O Schema Registry aplica regras de compatibilidade, como backward compatibility (novos schemas conseguem ler mensagens antigas) e forward compatibility (schemas antigos conseguem ler mensagens novas), prevenindo que mudanças de schema quebrem consumers em produção sem necessidade de deployar todos os serviços simultaneamente.
Kafka em produção - observabilidade e operações
Monitoramento de clusters Kafka
Operar Kafka em produção exige monitoramento de métricas críticas: consumer lag (diferença entre o offset mais recente publicado e o offset commitado pelo consumer) indica acúmulo de mensagens não processadas. Métricas de under-replicated partitions alertam sobre replicas que estao atrasadas em relacao ao leader, indicando risco de perda de dados em caso de falha. O Kafka usa o ZooKeeper (ou o KRaft mode nas versões mais recentes) para coordenacao de cluster, eleicao de leaders e armazenamento de metadados. Ferramentas como Kafka UI, Conduktor e Confluent Control Center oferecem visibilidade operacional sobre tópicos, consumer groups e throughput do cluster em tempo real.
Conclusao - Kafka como espinha dorsal de sistemas distribuidos
Quando adotar Kafka em sua arquitetura
Kafka e a escolha certa quando o volume de eventos supera o que bancos de dados e filas tradicionais conseguem absorver, quando você precisa de reprocessamento histórico, ou quando múltiplos sistemas precisam consumir os mesmos eventos de forma independente. A curva de aprendizado e o custo operacional são maiores que alternativas como RabbitMQ ou SQS, mas a escalabilidade e a durabilidade justificam o investimento em sistemas de missao crítica. Continue em: Fundamentos obrigatórios antes de produção.
Kafka - Vídeos Essenciais
Apache Kafka em 100 segundos
Kafka: como funciona por dentro
Kafka vs RabbitMQ vs SQS
Kafka Streams na prática
Schema Registry e evolução de contratos
Kafka Connect e integração de dados
Reels - Sistemas e Arquitetura
@bytebytego
ByteByteGo no Facebook
Arquitetura de Sistemas no X
Como testar que sua API é resiliente e segura para produção real
Ver post completo no X →Implementando padrões de resiliência em .NET Core com exemplos reais
Ver post completo no X →Vertical Slice Architecture - organizando sistemas para escala
Ver post completo no X →5 anos com Clean Architecture - lições de sistemas em produção
Ver post completo no X →Design de APIs resilientes - retry, backoff e idempotência juntos
Ver post completo no X →Monolito vs Microsserviços - como escolher para cada contexto
Ver post completo no X →