Um exchange recebe mensagens dos produtores e as encaminha para uma ou mais filas. Em vez de enviar mensagens diretamente às filas, os produtores sempre publicam em um exchange, que define o destino de cada mensagem com base nas regras de roteamento.
Como funciona o roteamento de mensagens
Uma mensagem percorre o ApsaraMQ for RabbitMQ em quatro etapas:
O produtor publica uma mensagem em um exchange.
O exchange avalia a mensagem conforme suas regras de roteamento.
Com base nos bindings entre o exchange e as filas, o exchange encaminha a mensagem para uma ou mais filas correspondentes.
Cada fila armazena a mensagem até que um consumidor a recupere e processe.
Dois conceitos são fundamentais nesse processo de roteamento:
Binding: Vínculo entre um exchange e uma fila. Cada binding pode incluir uma chave de roteamento ou argumentos de cabeçalho usados pelo exchange para filtrar mensagens.
Chave de roteamento: Atributo do tipo string associado a cada mensagem. Os exchanges comparam essa chave com as chaves de binding das filas vinculadas para determinar o destino da mensagem.
Tipos de exchange
O ApsaraMQ for RabbitMQ oferece suporte a seis tipos de exchange, cada um com uma estratégia de roteamento diferente.
|
Tipo de exchange |
Estratégia de roteamento |
Caso de uso típico |
|
Correspondência exata da chave de roteamento |
Encaminhar uma mensagem para uma fila específica |
|
|
Correspondência da chave de roteamento com curingas |
Encaminhar mensagens para filas por categoria ou padrão |
|
|
Transmissão para todas as filas vinculadas |
Enviar a mesma mensagem para todos os consumidores |
|
|
Correspondência de atributos de cabeçalho |
Roteamento por múltiplos campos de metadados em vez de chave de roteamento |
|
|
Entrega atrasada + roteamento configurável |
Entregar mensagens após um atraso especificado |
|
|
Hash consistente da chave de roteamento ou cabeçalho |
Distribuir mensagens entre filas por peso |
Exchanges Direct
Um exchange direct encaminha a mensagem para a fila cuja chave de binding corresponde exatamente à chave de roteamento da mensagem.
Quando usar um exchange direct:
Distribuição de tarefas em que cada tipo mapeia para uma fila de processamento dedicada
Roteamento de logs em que cada nível (erro, aviso, informação) vai para uma fila separada
Cenários que exigem entrega unicast baseada em um identificador de string simples
Exemplo de roteamento

|
Mensagem |
Chave de roteamento |
Chave de binding |
Fila de destino |
|
Mensagem A |
|
|
Fila A |
|
Mensagem B |
|
|
Fila B |
A Mensagem A possui a chave de roteamento img.create. O exchange identifica que a Fila A está vinculada com a mesma chave e, portanto, encaminha a Mensagem A para a Fila A. A Mensagem B segue a mesma lógica: sua chave de roteamento img.log corresponde à chave de binding da Fila B.
Exchanges Topic
Um exchange topic encaminha mensagens para filas cujas chaves de binding correspondem à chave de roteamento da mensagem por meio de padrões com curingas. As chaves de roteamento e de binding são strings delimitadas por pontos (por exemplo, files.cn.hz), e as chaves de binding podem incluir dois curingas:
*(asterisco): corresponde exatamente a um segmento. Por exemplo,files.cn.*.storecorresponde afiles.cn.hz.storeefiles.cn.sz.store, mas não corresponde afiles.cn.store(segmento ausente) oufiles.cn.hz.sz.store(segmento extra).#(hash): corresponde a zero ou mais segmentos. Por exemplo,files.cn.hz.#corresponde afiles.cn.hz,files.cn.hz.storeefiles.cn.hz.store.backup.
Uma chave de binding composta apenas por # corresponde a qualquer chave de roteamento, fazendo o exchange topic se comportar como um exchange fanout.
Quando usar um exchange topic:
Distribuição de dados por localização geográfica, como rotear eventos de vendas regionais para consumidores específicos de cada região
Processamento de tarefas em segundo plano em que vários workers lidam com subconjuntos específicos de tarefas
Feeds de notícias ou eventos em que os consumidores se inscrevem em mensagens por categoria ou tag
Cenários que exigem entrega seletiva de mensagens multicast
Exemplo de roteamento

|
Mensagem |
Chave de roteamento |
Chave de binding correspondente |
Fila de destino |
|
Mensagem A |
|
|
Fila A |
|
Mensagem B |
|
|
Fila A, Fila B |
|
Mensagem C |
|
|
Fila B |
Mensagem A (
files.cn.hz): O curinga#emfiles.cn.hz.#corresponde a zero segmentos finais; assim, a Mensagem A vai para a Fila A. Ela não corresponde afiles.cn.*.storeporque não existe um quarto segmento.Mensagem B (
files.cn.hz.store): Corresponde afiles.cn.hz.#(um segmento final) e afiles.cn.*.store(*corresponde ahz); portanto, vai tanto para a Fila A quanto para a Fila B.Mensagem C (
files.cn.sz.store): Corresponde afiles.cn.*.store(*corresponde asz), mas não afiles.cn.hz.#(o terceiro segmentoszdifere dehz); logo, vai apenas para a Fila B.
Exchanges Fanout
Um exchange fanout encaminha todas as mensagens para todas as filas vinculadas, independentemente das chaves de roteamento. O exchange ignora completamente a chave de roteamento.
Quando usar um exchange fanout:
Transmitir atualizações de configuração ou status para todos os serviços do sistema
Enviar atualizações de placar em tempo real para todos os clientes móveis conectados
Distribuir mensagens para todos os participantes de um chat em grupo
Cenários que exigem entrega broadcast
Exemplo de roteamento

|
Mensagem |
Chave de roteamento |
Fila de destino |
|
Mensagem A |
|
Fila A, Fila B |
|
Mensagem B |
|
Fila A, Fila B |
|
Mensagem C |
|
Fila A, Fila B |
As três mensagens possuem chaves de roteamento diferentes, mas o exchange fanout entrega cada mensagem tanto para a Fila A quanto para a Fila B. As chaves de roteamento não têm efeito.
Exchanges Headers
Um exchange headers encaminha mensagens com base em atributos de cabeçalho em vez de chaves de roteamento. Funciona como um exchange direct mais flexível: em vez de corresponder a uma única string de chave de roteamento, compara múltiplos pares chave-valor nos cabeçalhos da mensagem.
Como funciona a correspondência
Ao vincular uma fila a um exchange headers, defina um conjunto de pares chave-valor como argumentos de binding. Quando um produtor publica uma mensagem, ele configura pares chave-valor nos cabeçalhos da mensagem. O exchange compara os cabeçalhos da mensagem com os argumentos de binding de cada fila para decidir o destino.
Um argumento de binding especial, x-match, controla a estratégia de correspondência:
|
Valor de x-match |
Comportamento |
|
|
A mensagem deve corresponder a todos os argumentos de binding (exceto o próprio |
|
|
A mensagem deve corresponder a pelo menos um argumento de binding (exceto o próprio |
Um cabeçalho corresponde a um argumento de binding quando uma das seguintes condições é verdadeira:
A chave e o valor do cabeçalho são idênticos à chave e ao valor do argumento de binding.
A chave do cabeçalho corresponde à chave do argumento de binding, e o valor do argumento de binding está vazio.
Quando usar um exchange headers:
Rotear mensagens por múltiplas dimensões de metadados (por exemplo, tipo de conteúdo, prioridade e origem)
Distribuir conteúdo categorizado ou tagueado, como artigos de notícias filtrados por tópico e formato
Cenários em que o roteamento baseado em uma única chave de string é muito limitante
Exemplo de roteamento

Configuração de binding:
|
Fila |
Argumentos de binding |
|
Fila A |
|
|
Fila B |
|
Resultados do roteamento:
|
Mensagem |
Cabeçalhos da mensagem |
Fila de destino |
Motivo |
|
Mensagem A |
|
Fila A, Fila B |
Corresponde a todos os argumentos da Fila A ( |
|
Mensagem B |
|
Fila B |
Não corresponde à Fila A porque |
|
Mensagem C |
|
Fila B |
Não corresponde à Fila A porque |
Exchanges x-delayed-message
O ApsaraMQ for RabbitMQ é compatível com exchanges x-delayed-message fornecidos pelo RabbitMQ open-source. Enquanto o RabbitMQ open-source exige um plug-in para usar exchanges x-delayed-message, o ApsaraMQ for RabbitMQ não requer instalação de plug-ins.
Um exchange x-delayed-message retém uma mensagem por uma duração especificada antes de entregá-la a uma fila. Defina o cabeçalho x-delay (em milissegundos) em cada mensagem para controlar o atraso.
O exchange usa o argumento x-delayed-type (especificado no momento da declaração) para determinar seu comportamento de roteamento. Os seguintes tipos de exchange são suportados como valores de x-delayed-type:
Direct
Topic
Fanout
Headers
Por exemplo, um exchange x-delayed-message com x-delayed-type=direct encaminha mensagens por correspondência exata da chave de roteamento — mas somente após o término do período de atraso.
Para mais informações, consulte Mensagens atrasadas.
Exemplo de roteamento
O exemplo a seguir mostra um exchange x-delayed-message com x-delayed-type definido como direct.

|
Mensagem |
x-delay |
Chave de roteamento |
Chave de binding |
Fila de destino |
|
Mensagem A |
3000 |
|
|
Fila A |
|
Mensagem B |
4000 |
|
|
Fila B |
Mensagem A: O exchange recebe a Mensagem A e aguarda 3.000 milissegundos (3 segundos) antes de entregá-la à Fila A.
Mensagem B: O exchange recebe a Mensagem B e aguarda 4.000 milissegundos (4 segundos) antes de entregá-la à Fila B.
Exchanges x-consistent-hash
O ApsaraMQ for RabbitMQ é compatível com exchanges x-consistent-hash fornecidos pelo RabbitMQ open-source. Enquanto o RabbitMQ open-source exige um plug-in para usar exchanges x-consistent-hash, o ApsaraMQ for RabbitMQ não requer instalação de plug-ins.
Um exchange x-consistent-hash usa hash consistente para distribuir mensagens entre as filas vinculadas. Ele calcula um hash a partir da chave de roteamento da mensagem ou de um valor de cabeçalho especificado e mapeia esse hash para uma fila. Mensagens com a mesma chave de roteamento (ou valor de cabeçalho) sempre vão para a mesma fila.
Os exchanges x-consistent-hash não oferecem suporte a roteamento baseado em ID de mensagem, ID de correlação ou timestamp.
Regras de roteamento
Origem do hash: Por padrão, o exchange aplica hash na chave de roteamento. Para aplicar hash em um valor de cabeçalho, declare o exchange com o parâmetro
hash-headere especifique o nome do cabeçalho. Os produtores devem incluir esse cabeçalho em suas mensagens. Se o cabeçalho especificado estiver ausente, todas as mensagens serão encaminhadas para a mesma fila aleatória.Prioridade: Se tanto uma chave de roteamento quanto
hash-headerestiverem presentes, o exchange usa o valor dehash-header.Peso da fila: Ao vincular uma fila, defina a chave de binding como um número inteiro de 1 a 20. Esse valor representa o peso da fila — um peso maior significa que a fila recebe uma parcela maior de mensagens. Valores acima de 20 são tratados como 20.
Restrições de binding: Se existirem múltiplos bindings para uma fila, apenas o primeiro binding com um valor inteiro positivo entra em vigor. Exclua o binding existente antes de alterar o peso de uma fila.
Quando usar um exchange x-consistent-hash:
Distribuir carga de trabalho entre múltiplas filas de consumidores com pesos configuráveis
Exemplo de roteamento
O exemplo a seguir mostra um exchange x-consistent-hash que roteia pela chave de roteamento.

Mensagens:
|
Mensagem |
Chave de roteamento |
|
Mensagem A |
|
|
Mensagem B |
|
|
Mensagem C |
|
Bindings de fila:
|
Fila |
Chave de binding (peso) |
|
Fila A |
1 |
|
Fila B |
2 |
O exchange aplica hash na chave de roteamento de cada mensagem e a mapeia para uma fila. A Fila A tem peso 1 e a Fila B tem peso 2; portanto, aproximadamente um terço das mensagens vai para a Fila A e dois terços vão para a Fila B.