Executando verificação de segurança...
40

RabbitMQ: o que ele faz de verdade (e por que muita gente usa errado)

RabbitMQ é uma daquelas coisas que muita gente usa, mas pouca gente entende o que tá acontecendo ali no meio.

A maioria aprende assim:

“é só um lugar que você manda uma mensagem
e outro sistema consome depois”

E pronto.

O problema é que, quando você não entende o modelo mental do RabbitMQ (e o problema que ele resolve), você começa a usar errado.
Ou pior: usa quando nem precisava.


O problema real que o RabbitMQ resolve

Imagina uma loja.

O usuário faz um pedido e o sistema precisa:

  • registrar o pedido
  • processar pagamento (externo)
  • emitir nota fiscal (externo)
  • atualizar estoque
  • enviar e-mail (externo)

Se você fizer isso em sequência via HTTP… o usuário fica preso esperando tudo e seu sistema vira um monólito distribuído.

Fluxo típico ruim com HTTP em cadeia

Http Flow

HTTP acopla tempo: um serviço espera o outro.
Se um cair, trava geral. Se um ficar lento, todo mundo sofre.


Onde o RabbitMQ entra

Com mensageria, você responde rápido pro usuário e joga o resto pro “tempo do sistema”.

Fluxo com RabbitMQ (desacoplado)

RMQ Flow

RabbitMQ não é “substituto de HTTP”.
Ele existe pra tirar trabalho pesado do caminho do usuário.


Modelo mental do RabbitMQ (o principal)

O RabbitMQ segue isso aqui:

Producer → Exchange → Queue → Consumer

E isso é o que quase ninguém guarda:

👉 Producer nunca manda direto pra fila.
Ele manda pra uma Exchange, e a Exchange decide pra onde vai.

Visão geral do fluxo

General flow

A fila não pensa.
Quem pensa é a Exchange.


Producer, Exchange, Queue, Consumer

  • Producer: quem publica (sua API, um worker, um serviço).
  • Exchange: roteia a mensagem.
  • Queue: só armazena (FIFO).
  • Consumer: processa.

Tipos de Exchange no RabbitMQ

1) Direct Exchange (match exato)

Se a routing key bate, a mensagem vai.

Direct Exchange flow


2) Fanout Exchange (broadcast)

Ignora routing key.
Chegou? Espalhou pra todo mundo conectado.

Fanout Exchange flow


3) Topic Exchange (padrões com * e #)

Aqui você começa a tratar como evento de verdade:

  • order.created
  • order.paid
  • order.error

E consumidores podem usar padrões:

  • order.* (uma palavra depois)
  • order.# (zero ou mais palavras depois)

Topic Exchange flow

Quando você começa a usar Topic bem, seu sistema tende a ficar mais organizado e escalável.


4) Headers Exchange (roteamento por cabeçalho)

Em vez de routing key, decide pelo header:

  • country=BR
  • locale=pt-BR
  • region=south

Headers Exchange flow

ACK: por que a mensagem “volta” (e isso é bom)

Aqui separa quem usa RabbitMQ direito de quem perde mensagem em produção.

  • Consumiu e deu ACK → remove da fila.
  • Consumiu e caiu antes do ACK → volta pra fila.

ACK vs crash

Ack flow

Muita gente acha que isso é bug.
Não é. É garantia.


RabbitMQ vs Kafka (não confunde)

RabbitMQ:

  • tarefa
  • garante processamento
  • remove mensagem depois do consumo

Kafka:

  • stream de eventos
  • mantém histórico
  • lê quando e quantas vezes quiser

Comparação visual (mental model)

Kafka vs RabbitMQ

RabbitMQ é tarefa.
Kafka é stream.
Usar um no lugar do outro é pedir pra sofrer.


Quando usar RabbitMQ (e quando não usar)

Use RabbitMQ quando:

  • precisa desacoplar sistemas
  • precisa background / processamento assíncrono
  • precisa lidar com falha e retry

Não use quando:

  • precisa resposta imediata
  • o fluxo é simples
  • HTTP resolve

Fechando

RabbitMQ não é complicado.

O que complica é usar sem entender o modelo.

Se você entendeu Producer → Exchange → Queue → Consumer,
você já entende RabbitMQ melhor do que muita gente que usa em produção.


Simulador RMQ

Veja também o vídeo sobre esse tema

Carregando publicação patrocinada...
2

uso o Kafka na empresa pra enfileirar dados de alto volume de uma forma que o backend consiga suportar. muito útil, suporta 1bi mensages por dia com um único node em uma vps "normal".

1

Pode dizer qual a spec desse server? Estamos dimensionando aqui e queria ter uma noção. Nosso volume esperado é muito abaixo disso, diria 1bi mês.

2

Excelente! Parabéns pelo artigo.

Eu gosto de usar os padrões de Dead Letter Queue (DLQ) e Parking Lot para tratar falhas de processamento no RabbitMQ.

Exemplo:

  • welcome-email.default.queue: fila principal, onde as mensagens são consumidas e processadas normalmente.
  • welcome-email.error.queue (DLQ): recebe mensagens que falharam no processamento; normalmente aplica TTL para aguardar e reenviar a mensagem à fila principal, permitindo novas tentativas.
  • welcome-email.parkinglot.queue: destino final das mensagens que excederam o número máximo de retries ou possuem erro definitivo, ficando disponíveis para análise manual e correção.
0
2
1

Caracas, aí eu fiquei feliz kkkkk
Eu concordo contigo, tá faltando conteúdo de qualidade mesmo com o Brasil sendo muito bom de tecnologia.
Se eu conseguir contribuir com 1% disso, já tô feliz.

2

conteudo top;
mas eu nao diria que a galera usa errado, eu diria que usa o que precisa;
quem ta usando do jeito "errado" soh quer enfileirar tasks, nao quer colocar parte da regra de negocio no fluxo do exchange, no caso, quem define o contexto geralmente eh a queue;

1

Quando falo de usar errado é porque tem muita gente que mete um fanout e envia pra todas as filas e usa as condições no serviço.
Funciona? Sim... mas gera movimento de rede, tempo de processamento e etc. que seria evitado com1 minuto de configuração

1

vlw jovem, gosto desse tipo de conteudo por aqui, maioria ta virada em postagem IA;

offtopic, como eu tenho odio disso:

Não foi possível adicionar TabCoins nesta publicação. Você precisa de pelo menos 2 TabCoins para realizar esta ação.

eu nao consigo dar um "like" na tua resposta, mas consigo responder com texto, pqp...

ow @deshamps, tem que rever esse esquema de tabcoins pra like de resposta, descontar soh em like de publicacao, pfvr...

2
1
1