Producer, exchange, queue, consumer
2 min de leitura
O RabbitMQ é um message broker: ele recebe mensagens, decide pra onde elas vão e entrega pra quem tiver interessado. Toda a configuração que você vai fazer gira em torno de quatro peças.
As quatro peças
- Producer (produtor) - quem publica a mensagem. Geralmente uma API, mas pode ser um worker em background, um console app, qualquer coisa que rode código.
- Exchange - o roteador. Recebe a mensagem do produtor e decide pra qual fila mandar.
- Queue (fila) - onde a mensagem fica guardada esperando alguém consumir. É FIFO: primeiro que entra, primeiro que sai.
- Consumer (consumidor) - quem lê e processa. Pode ser outro serviço, e nada impede que seja o mesmo serviço que publicou.
Se você for guardar uma coisa deste nó, guarda essa
O produtor não manda mensagem pra fila. Ele manda pra exchange.
Esse é o erro de modelo mental mais comum de quem começa - a pessoa imagina que publica direto na fila, e aí não entende por que a mensagem "sumiu" ou por que chegou em três lugares.
Quem decide o destino é a exchange, olhando a routing key que veio na mensagem e comparando com as binding keys das filas ligadas nela. Fila não escolhe mensagem: ela é escolhida.
// o publish aponta pra exchange, não pra fila
channel.publish(
"pedidos", // exchange
"order.created", // routing key - a exchange usa isso pra rotear
Buffer.from(JSON.stringify({ pedidoId: 42 }))
)
E aquele tutorial que publica direto na fila? Ele usa a default exchange, uma exchange sem nome que o RabbitMQ já cria e que entrega pra fila com o nome exato da routing key. Parece que você publicou na fila, mas passou por uma exchange do mesmo jeito. Você vai ver isso no nó da primeira fila.
Uma armadilha que vale saber desde já
Mensagem publicada numa exchange que não tem binding compatível simplesmente some. Sem erro, sem exceção, sem log gritando com você - o RabbitMQ considera que fez o trabalho dele: procurou fila que casasse, não achou, descartou.
É de longe a causa número um do clássico "publiquei e o consumidor não recebeu nada". Antes de sair debugando o consumidor, confere se a binding key da fila casa com a routing key que você publicou.
Dica: se preferir ver isso acontecendo em vez de ler, existe um simulador visual onde dá pra montar exchange, fila e binding e acompanhar o caminho da mensagem. É opcional - a trilha inteira funciona sem ele.
Três coisas que você acabou de aprender:
- Producer → exchange → fila → consumer. Sempre nessa ordem, sem atalho.
- Routing key vai na mensagem; binding key fica na ligação entre exchange e fila. O roteamento é a comparação entre as duas.
- Mensagem sem binding compatível é descartada em silêncio. Não espere um erro.
No próximo nó a gente entra no primeiro tipo de exchange - a direct - e vê como essa comparação de chaves funciona na prática.
// Quiz
Você publicou uma mensagem e o consumidor não recebeu nada, sem erro e sem log. Qual a causa mais provável?