Skip to main content

RabbitMQ vs Kafka | Arquitetura

  • Diferença conceitual, operacional e arquitetural entre brokers | Arquitetura

Modelo Mental

RabbitMQ → Messages flow through it

  • A mensagem entra no broker, é entregue e removida
  • O broker atua como um pipeline de entrega
  • A fila representa trabalho pendente, não histórico

Fluxo:

Producer → Queue → Consumer → (mensagem removida)

Características:

  • Orientado a fila (queue)
  • Foco em entrega confiável
  • Estado efêmero (mensagem não persiste após consumo)

Kafka → Messages live in it

  • A mensagem é persistida em um log
  • O broker atua como um event store distribuído
  • Consumidores leem sem remover os dados

Fluxo:

Producer → Topic (log persistido) → Consumer

mensagem continua existindo

Características:

  • Orientado a log (append-only)
  • Foco em armazenamento e replay
  • Estado durável

Arquitetura Interna

RabbitMQ

Componentes:

  • Producer
  • Exchange (roteamento)
  • Queue
  • Consumer

Fluxo com routing:

Producer → Exchange → Queue → Consumer

Responsabilidades do broker:

  • Routing (direct, topic, fanout)
  • Retry
  • Dead Letter Queue
  • ACK/NACK

Exemplo (C# - publicação):

var factory = new ConnectionFactory() { HostName = "localhost" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();

channel.QueueDeclare(queue: "orders",
durable: true,
exclusive: false,
autoDelete: false);

var body = Encoding.UTF8.GetBytes("order_created");

channel.BasicPublish(exchange: "",
routingKey: "orders",
body: body);

Kafka

Componentes:

  • Producer
  • Topic
  • Partition
  • Consumer Group

Estrutura:

Topic
├── Partition 0 → [msg1, msg2, msg3]
├── Partition 1 → [msg4, msg5, msg6]

Características:

  • Append-only log
  • Offset controlado pelo consumidor
  • Escala horizontal via partições

Exemplo (C# - Producer):

var config = new ProducerConfig { BootstrapServers = "localhost:9092" };

using var producer = new ProducerBuilder<Null, string>(config).Build();

await producer.ProduceAsync("orders", new Message<Null, string>
{
Value = "order_created"
});

Ordenação e Paralelismo

RabbitMQ

  • Ordem global possível

  • Porém:

    • Requer 1 consumidor
    • Reduz paralelismo

Escala:

Queue → múltiplos consumidores (competição)

Kafka

  • Ordem garantida por partição
  • Paralelismo nativo

Estratégia:

key → partition → ordem garantida

Exemplo:

  • user_id = 123 → sempre mesma partição
  • mantém ordem por usuário

Throughput vs Latency

RabbitMQ

  • Throughput: ~4k–10k msg/s
  • Latência: ~1–5 ms

Perfil:

  • Baixa latência
  • Processamento rápido de jobs

Kafka

  • Throughput: 1M+ msg/s
  • Latência: ~5–50 ms

Perfil:

  • Alto volume
  • Processamento em escala

Garantias de Entrega

RabbitMQ

  • At-least-once
  • Controle via ACK/NACK
  • Retry nativo

Kafka

  • At-least-once
  • Exactly-once (configuração específica)

Controle:

  • Offset manual
  • Commit explícito

Complexidade Operacional

RabbitMQ

  • Single binary
  • Setup simples
  • UI nativa
  • Clustering direto

Kafka

  • ZooKeeper ou KRaft
  • Gerenciamento de partições
  • Mais componentes
  • Maior complexidade

Casos de Uso

RabbitMQ

  • Task queues
  • Background jobs
  • Processamento assíncrono
  • Work distribution

Exemplos:

  • Processamento de uploads
  • Filas de e-mail
  • Jobs agendados

Kafka

  • Event streaming
  • Analytics em tempo real
  • Event sourcing
  • Integração entre sistemas

Exemplos:

  • Sistema de recomendação
  • Detecção de fraude
  • Pricing dinâmico

Diferença Arquitetural Crítica

RabbitMQ

  • Camada de transporte
  • Resolve comunicação assíncrona
  • Não armazena histórico relevante

Kafka

  • Camada de dados
  • Backbone de eventos
  • Pode ser fonte de verdade

Resumo Comparativo

AspectoRabbitMQKafka
ModeloQueueLog distribuído
MensagemTransitóriaPersistente
BrokerInteligenteSimples
ConsumidorSimplesInteligente
OrdenaçãoGlobal (limitada)Por partição
ParalelismoLimitadoAlto
ThroughputMédioMuito alto
LatênciaBaixaMédia
ReprocessamentoDifícilNativo
ComplexidadeBaixaAlta