RabbitMQ
A arquitetura do RabbitMQ é baseada no protocolo AMQP 0-9-1 (Advanced Message Queuing Protocol). Em vez de o produtor enviar uma mensagem diretamente para uma fila, o RabbitMQ usa uma abordagem intermediária que oferece muita flexibilidade.
Componentes Principais
- Producer (Produtor): A aplicação que cria e envia as mensagens.
- Exchange (Corretora/Roteador): É o cérebro do roteamento. O produtor envia a mensagem para a Exchange, e ela decide para qual fila (ou filas) a mensagem deve ir, baseando-se em regras chamadas Bindings.
- Queue (Fila): Uma caixa de correio bufferizada. Ela armazena as mensagens com segurança até que os consumidores estejam prontos para recebê-las.
- Consumer (Consumidor): A aplicação que fica escutando a fila, recebe as mensagens e as processa.
Elementos de Conexão e Roteamento
Para que esses componentes conversem entre si, o RabbitMQ utiliza alguns conceitos fundamentais:
Binding (Ligação)
É o “link” ou a regra para conectar uma Exchange a uma Fila.
Routing Key (Chave de Roteamento)
Atributo que o produtor adiciona à mensagem. A Exchange decide o destino da mensagens cruzando as regras de binding e da routing key.
Connection e Channel (Conexão e Canal)
- Connection: É uma conexão TCP real e persistente entre a sua aplicação e o broker do RabbitMQ. Como abrir conexões TCP é algo “caro” para o sistema, o RabbitMQ introduz o conceito de canais.
- Channel: São conexões virtuais dentro de uma única conexão TCP física. Toda a comunicação de envio e recebimento de mensagens acontece via canais, permitindo reaproveitar a mesma conexão TCP para várias tarefas simultâneas (multithreading).
Os Tipos de Exchange
A forma como a Exchange distribui as mensagens muda completamente a arquitetura do seu sistema. Existem 4 tipos principais:
| Tipo de Exchange | Como funciona | Caso de Uso Comum |
| Direct | Roteia a mensagem para a fila que tem o Binding Key exatamente igual à Routing Key da mensagem. | Sistema de log onde erros vão para uma fila e avisos vão para outra. |
| Fanout | Ignora a Routing Key e copia a mensagem para todas as filas conectadas a ela (Broadcast). | Atualizações em tempo real (ex: notificar vários microsserviços sobre uma venda). |
| Topic | Faz um roteamento parcial (Pattern Matching) usando pontos e curingas como * (substitui uma palavra) e # (substitui zero ou mais palavras). | Sistemas de notificações complexos (ex: br.com.financeiro.sucesso). |
| Headers | Ignora a Routing Key e usa os atributos do cabeçalho da mensagem para decidir o destino. | Roteamento baseado em metadados complexos que não cabem em uma string simples. |
O Fluxo da Mensagem (Resumo)
- O Produtor publica uma mensagem na Exchange com uma Routing Key.
- A Exchange recebe, valida as regras de Binding e direciona para as Filas correspondentes.
- A Fila retém a mensagem.
- O Consumidor, conectado via Channel, puxa ou recebe a mensagem da fila para processá-la.
Persistência
Fila durável (durable queue)
Garante que a definição da fila sobreviva a um restart do RabbitMQ.
Se o broker cair e subir novamente:
- A fila continua existindo.
- Mas as mensagens podem ter sido perdidas, dependendo de como foram publicadas.
Mensagem persistente (persistent message)
Garante que a mensagem seja gravada em disco.
Se o broker cair e subir novamente:
- A mensagem pode ser recuperada.
- Mas isso só funciona se a fila também for durável.
| Fila durável | Mensagem persistente | Resultado após restart |
|---|---|---|
| ❌ | ❌ | Fila e mensagens somem |
| ✅ | ❌ | Fila continua, mensagens somem |
| ❌ | ✅ | Fila some, mensagens somem junto |
| ✅ | ✅ | Fila e mensagens sobrevivem |
Conceitos adicionais
Dead Letter Exchange (DLX) é um dos mecanismos mais importantes para resiliência e depuração no RabbitMQ. Ele é uma “fila do fim da fila” – um lugar para onde as mensagens vão quando não podem ser processadas normalmente.
Situações comuns:
| Situação | Descrição | Exemplo |
|---|---|---|
| 1. Mensagem rejeitada | Consumidor rejeita com requeue=false | channel.basicReject(deliveryTag, false) |
| 2. TTL expirado | Mensagem expirou na fila (ninguém consumiu a tempo) | Fila com x-message-ttl: 60000 (60s) |
| 3. Fila cheia | Tamanho máximo da fila foi atingido | Fila com x-max-length: 1000 |
| 4. Mensagem expirada no header | A própria mensagem tem um prazo de validade | expiration: 60000 nas propriedades |
Poison Pill é uma mensagem que, por algum motivo, sempre falha ao ser processada.
DLQ (Dead Letter Queue) é a fila de destino, onde as mensagens problemáticas ficam armazenadas para análise posterior.
Fluxo:
- A mensagem está em
orders.queue. - O consumidor falha e faz
nack/rejectcomrequeue=false. - O RabbitMQ remove a mensagem da fila principal.
- O RabbitMQ publica a mensagem na DLX configurada.
- A DLX roteia a mensagem para uma ou mais filas, normalmente uma DLQ.