Pular para o conteúdo

Arquitetura de software · Comunicação · 8 min de leitura

Streaming de eventos com Kafka

Um log distribuído onde eventos ficam guardados em ordem e vários sistemas leem no próprio ritmo — a espinha dorsal de dados de muitas empresas.

Produtor → Partição 0Produtor → Partição 1Produtor → Partição 2Partição 0 → Consumidor APartição 1 → Consumidor APartição 2 → Consumidor BProdutor — chave = pedido_idProdutorchave = pedido_idPartição 0 — offsets 0…812Partição 0offsets 0…812Partição 1 — offsets 0…790Partição 1offsets 0…790Partição 2 — offsets 0…804Partição 2offsets 0…804Consumidor A — grupo faturamentoConsumidor Agrupo faturamentoConsumidor B — grupo faturamentoConsumidor Bgrupo faturamento

Arraste para o lado para ver o diagrama inteiro.

Outro grupo (ex.: análise) leria as mesmas partições de forma independente, com seus próprios offsets.

Fila ou log?

Numa fila clássica a mensagem some depois de consumida. No Kafka, o tópico é um log só de acréscimo: os eventos ficam guardados por um tempo (dias, semanas ou para sempre) e cada consumidor guarda até onde leu — o offset. Assim, faturamento, busca e análise leem o mesmo fluxo sem se atrapalhar, e um serviço novo pode reprocessar a história desde o início.

Partições, ordem e grupos

  • Um tópico se divide em partições, espalhadas pelos brokers — é o que dá escala.
  • A ordem só é garantida dentro de uma partição. Eventos com a mesma chave (o mesmo pedido) vão sempre para a mesma partição.
  • Num grupo de consumidores, cada partição é lida por um único membro; para ler em paralelo, mais partições. Consumidores além do número de partições ficam parados.
  • Cada partição tem réplicas em outros brokers (fator de replicação 3 é o usual).

Garantias de entrega

  • Pelo menos uma vez (o comum): o consumidor processa e depois confirma o offset; se cair no meio, reprocessa. Logo, o processamento precisa ser idempotente.
  • Exatamente uma vez dentro do Kafka: produtor idempotente + transações, para fluxos que leem e escrevem tópicos.
  • Gravar no banco e publicar o evento ao mesmo tempo pede o padrão outbox: grava o evento numa tabela na mesma transação e um processo o publica.

Quando usar

Integração entre muitos serviços, captura de mudanças do banco (CDC com Debezium), métricas e logs em volume, processamento em tempo real (Kafka Streams, Flink). Para uma fila de tarefas simples entre dois serviços, um RabbitMQ ou SQS costuma ser mais simples de operar.

Em resumo

Vantagens e custos

Vantagens
  • Vazão altíssima e escala horizontal.
  • Reprocessar a história com outro consumidor.
  • Desacopla produtores de muitos consumidores.
Custos e riscos
  • Operação complexa (ou serviço gerenciado pago).
  • Sem ordem global entre partições.
  • Exagero para filas pequenas de tarefas.

Perguntar à IA

Monte um prompt pronto sobre Streaming de eventos com Kafka na sua linguagem e no seu caso, e abra num chat gratuito.

ChatGPT Claude Perplexity

O prompt vai para o site que você escolher. Não cole senhas, tokens nem dados reais de clientes. Para Gemini e outros, copie e cole.

Referências

Continue aprendendo

Todos os temas de arquitetura de software →