Escalabilidade: O Engano da Resiliência em Microserviços com Kafka

Quando Kafka Vira Bengala Arquitetural

O erro clássico: achar que Kafka é cura universal para escalabilidade. **Muita gente coloca Kafka onde só precisava de um simples “retry” assíncrono**. Resultado? Over-engineering e mais uma stack que ninguém no time sabe operar.

O hype de que Kafka = resiliência cria a falsa sensação de que microserviços ficam “intocáveis”. Só que resiliência não nasce do broker — nasce do design. Se o serviço é podre, Kafka só empacota essa podridão em eventos bonitos.

Kafka Resolve? Resolve. Mas Só se o Problema For Dele.

A solução pragmática: use Kafka quando você precisa de throughput alto, eventos imutáveis, reprocessamento e pipelines de dados. Não para RPC glorificado ou como substituto de comunicação entre microserviços que só precisam responder rápido.

Quer resiliência real? Circuit breaker, idempotência e design orientado ao domínio. Kafka entra quando o domínio pede streaming, não quando o time quer parecer “cloud native”.

Implementação de Sênior: Processamento Idempotente com Kafka

Vamos ao que importa: código que evita tragédias. Consumidor Kafka com idempotência real usando chave de negócio + store simples.

using Confluent.Kafka;
using Dapper;
using Npgsql;

var config = new ConsumerConfig {
    GroupId = "pedido-processador",
    BootstrapServers = "kafka:9092",
    AutoOffsetReset = AutoOffsetReset.Earliest
};

using var consumer = new ConsumerBuilder<string, string>(config).Build();
consumer.Subscribe("pedido-criado");

while (true)
{
    var cr = consumer.Consume();
    var idEvento = cr.Message.Key;

    using var conn = new NpgsqlConnection(envConnString);

    // Bloqueia repetição de evento
    var exists = await conn.ExecuteScalarAsync<bool>(
        "select exists (select 1 from eventos_processados where id = @id)", 
        new { id = idEvento }
    );

    if (exists) continue;

    // Processa pedido
    var payload = JsonSerializer.Deserialize<PedidoCriado>(cr.Message.Value);
    await ProcessarPedido(payload);

    // Marca como processado
    await conn.ExecuteAsync(
        "insert into eventos_processados (id) values (@id)",
        new { id = idEvento }
    );
}

Simples, direto e evita o clássico bug de processar o mesmo evento três vezes em horário de pico.

O Custo da Escolha: Onde Kafka Brilha e Onde Ele Te Derruba

**Kafka é excelente onde produção de eventos é massiva. É péssimo quando sua necessidade é resposta síncrona.**

  • Você ganha reprocessamento, mas perde simplicidade operacional.
  • Você ganha throughput, mas paga com infraestrutura pesada.
  • Você ganha distribuição, mas complica debugging.

Se o problema é comunicação entre microserviços, muitas vezes um simples RabbitMQ — bem configurado — resolve com menos drama.

Direto das Trincheiras

  • Kafka não é fila. Não tente usá-lo como RabbitMQ de grife.
  • Seu microserviço não fica resiliente só porque está atrás de um tópico.
  • Se você não sabe operar Kafka em produção, você não está pronto para usá-lo.

Fontes

Kafka vs PubSub do ponto de vista gerencial : r/ExperiencedDevs,
Kafka vs RabbitMQ | gaGO.io,
‘Não use um banco de dados como uma fila’ : r/dotnet

Obrigado por acompanhar essa reflexão até o fim!

Espero que esses pontos ajudem você a tomar decisões mais lúcidas no seu próximo projeto. Não deixe de conferir outros artigos aqui no blog, onde descascamos outros hypes da nossa área.

Valeu e até a próxima! 😉

Facebook
Twitter
LinkedIn
Profissionalismo em Tecnologia

A Obsessão por Microserviços Está Criando Monólitos na Cabeça de Muita Gente

Microserviços viraram religião. E, como toda religião mal interpretada, criou fanático achando que qualquer API com três rotas já merece dez serviços, quatro filas e um diagrama que parece um ninho de marimbondo. Neste artigo, falo direto da trincheira: quando microserviços viram over‑engineering, como isso destrói produtividade e por que a obsessão pelo hype cria monólitos mentais — mesmo quando o código está “distribuído”. Sem firula, só pragmatismo.

Métodos Ágeis

Kubernetes Está Virando Peso Morto Para Aplicações Que Precisam Ser Ágeis

Kubernetes virou sinônimo de “arquitetura moderna”, mas para novas aplicações que precisam entregar valor rápido, ele tem sido mais âncora do que propulsor. O excesso de camadas, YAML infinito e carga operacional transformam algo simples em uma caricatura de complexidade. Aqui eu explico, sem floreio, por que muitos times estão usando Kubernetes como muleta arquitetural — e como evitar cair nessa armadilha que só aumenta dívida técnica e mata agilidade.

Banco de dados

MongoDB em Produção Crítica: Quando o ‘Bala na Agulha’ Vira Risco Calculado

MongoDB é rápido de colocar no ar, flexível e ótimo para protótipos. Mas quando o jogo é sério — missão crítica, consistência, auditoria, garantias duras — ele começa a cobrar juros altos de dívida técnica. Como arquiteto que vive nas trincheiras, escrevo aqui o que quase ninguém fala: o risco não é usar MongoDB; o risco é usá‑lo sem entender o preço real.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *