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
| Aspecto | RabbitMQ | Kafka |
|---|---|---|
| Modelo | Queue | Log distribuído |
| Mensagem | Transitória | Persistente |
| Broker | Inteligente | Simples |
| Consumidor | Simples | Inteligente |
| Ordenação | Global (limitada) | Por partição |
| Paralelismo | Limitado | Alto |
| Throughput | Médio | Muito alto |
| Latência | Baixa | Média |
| Reprocessamento | Difícil | Nativo |
| Complexidade | Baixa | Alta |