Tecnologias/03 - Filas/02 - RabbitMQ2 min
Exchanges, Bindings e Roteamento no RabbitMQ
Definições
- Exchange: recebe uma publicação e decide os destinos.
- Binding: liga um destino ao exchange e pode definir um critério de roteamento.
- Routing key: texto informado na publicação para participar dessa decisão.
- Fila: conserva a mensagem para consumo conforme suas regras.
| Exchange | Regra |
|---|---|
direct |
Correspondência exata da routing key com o binding |
topic |
Correspondência por segmentos: * casa um segmento e # casa zero ou mais |
fanout |
Encaminha para todos os destinos vinculados, sem usar a routing key |
headers |
Decide com base nos cabeçalhos e critérios do binding |
O exchange padrão tem nome vazio e associa cada fila ao seu próprio nome como chave. A aparência de publicar “diretamente na fila” usa esse exchange. Referência: exchanges.
Exemplo
Exchange: eventos, tipo topic
Fila faturamento: binding pedido.criado
Fila auditoria: binding pedido.#
Fila email: binding pedido.*
Publicar pedido.criado chega às três filas.
Publicar pedido.pagamento.aprovado chega apenas à auditoria nesse exemplo:
* não cobre os dois segmentos depois de pedido.
Um binding controla para quais filas uma publicação vai. A escolha de qual consumidor processará uma entrega dentro de cada fila é outra etapa.
Mensagem sem destino
Se nenhuma regra encontrar uma fila, a publicação pode ser descartada ou seguir um
mecanismo alternativo configurado. No AMQP 0-9-1, mandatory permite receber de volta
publicações sem destino. A aplicação precisa tratar esse retorno.
Um publisher confirm positivo não significa, por si só, que a mensagem encontrou a fila pretendida ou que um consumidor executou o trabalho. Referência: confiabilidade e roteamento.
Aprofundamento aplicado
Testar a topologia como parte do contrato
Um produtor pode publicar corretamente e o evento não chegar ao serviço pretendido porque o binding não corresponde. A verificação deve incluir a routing key real, o tipo do exchange e as filas vinculadas no ambiente.
| Routing key | Binding pedido.* |
Binding pedido.# |
|---|---|---|
pedido |
Não | Sim |
pedido.criado |
Sim | Sim |
pedido.pagamento.aprovado |
Não | Sim |
No padrão topic, pontos separam palavras, * corresponde a uma e # a zero ou mais.
Referência: exchanges.
Exercício: publique cada chave em uma topologia de estudo e confira as filas que recebem. Remova um binding e trate o retorno quando a publicação for irroteável. Resultado esperado: diferenciar ausência de rota de falha do consumidor.
Uma evolução de nomenclatura, como pedido.pago para pagamento.aprovado, exige
migração dos contratos e bindings. Alterar só o produtor pode deixar consumidores
funcionando sem receber novos eventos.
Relacionado: 1. RabbitMQ · 3. Confirmações, Retry e DLQ no RabbitMQ.
Parte de RabbitMQ