O que é uma troca? O que são chaves de roteamento e encadernações? Como as trocas e filas de espera estão associadas entre si? Quando devo usá-las e como? Este artigo explica os diferentes tipos de trocas no RabbitMQ e cenários para como usá-los.
Mensagens não são publicadas diretamente para uma fila. Ao invés disso, o produtor envia mensagens para uma troca. Trocas são agentes de roteamento de mensagens, definidos pelo host virtual dentro do RabbitMQ. Uma troca é responsável pelo encaminhamento das mensagens para diferentes filas com a ajuda de atributos de cabeçalho, bindings e chaves de encaminhamento.
Abinding é um “link” que você configura para vincular uma fila a uma troca.
Eliminar key é um atributo de mensagem que a troca observa quando decide como encaminhar a mensagem para filas (dependendo do tipo de troca).
Mudanças, conexões, e filas podem ser configuradas com parâmetros como duráveis, temporários, eauto deleteup na criação. As trocas duradouras sobrevivem ao reinício do servidor e duram até serem explicitamente apagadas. As trocas temporárias existem até que o RabbitMQ seja desligado. Trocas apagadas automaticamente são removidas assim que o último objeto vinculado é desvinculado da troca.
No RabbitMQ, existem quatro tipos diferentes de trocas que roteiam a mensagem de forma diferente usando parâmetros e configurações de bindings diferentes. Os clientes podem criar suas próprias trocas ou usar as trocas predefinidas que são criadas quando o servidor inicia pela primeira vez.
- O produtor publica uma mensagem para a troca.
- A troca recebe a mensagem e agora é responsável pelo roteamento da mensagem.
- A troca deve ser configurada entre a fila e a troca. Neste caso, temos a vinculação a duas filas diferentes da troca. A troca encaminha a mensagem para as filas.
- As mensagens ficam na fila até serem tratadas por um consumidor.
- O consumidor trata da mensagem.
Se você não está familiarizado com o RabbitMQ e a fila de mensagens, leia RabbitMQ para iniciantes – o que é RabbitMQ?antes de ler sobre trocas, chaves de roteamento, cabeçalhos, e bindings.
Ponto de Troca Direto
Uma troca direta entrega mensagens para filas baseadas em uma chave de roteamento de mensagens. A chave de roteamento é um atributo de mensagem adicionado ao cabeçalho da mensagem pelo produtor. Pense na chave de roteamento como um “endereço” que a troca está usando para decidir como rotear a mensagem. Uma mensagem vai para a(s) fila(s) com a chave de vinculação que corresponde exatamente à chave de roteamento da mensagem.
O tipo de troca direta é útil para distinguir mensagens publicadas para a mesma troca usando um identificador de string simples.
A troca por defeito os corretores AMQP devem fornecer para a troca directa é “amq.direct”.
Imagine que a fila A (create_pdf_queue) na imagem abaixo (Direct Exchange Figure) está ligada a uma troca directa (pdf_events) com a chave binding keypdf_create.Quando uma nova mensagem com o keypdf_create do roteiro chega na troca direta, a troca a encaminha para a fila onde a chave binding_key = routing_key,no caso da fila A (criar_pdf_queue).
Cenário 1
- Mudança: pdf_events
- fila A: create_pdf_queue
- Chave de ligação entre a troca (pdf_events) e a Fila A (create_pdf_queue): pdf_create
Scenario 2
- Mudança: pdf_events
- Queue B: pdf_log_queue
- Chave de ligação entre a troca (pdf_events) e a Fila B (pdf_log_queue): pdf_log
Exemplo
Exemplo: Uma mensagem com keypdf_logis de roteamento enviada para o evento exchangeepdf_events. As mensagens são roteadas para pdf_log_queue porque a chave de roteamento (pdf_log) corresponde à chave de encadernação (pdf_log).
Se a chave de roteamento da mensagem não corresponder a nenhuma chave de encadernação, a mensagem é descartada.
Padrão troca
A troca por defeito é uma troca directa pré-declarada sem nome, normalmente referida por uma string vazia. Quando você usa a troca padrão, sua mensagem é entregue na fila com um nome igual à chave de roteamento da mensagem. Cada fila é automaticamente ligada à troca padrão com uma chave de roteamento igual ao nome da fila.
Topic Exchange
Topic exchanges route messages to queues based on wildcard matches between the routing key and the routing pattern, which is specified by the queue binding. As mensagens são encaminhadas para uma ou muitas filas baseadas na correspondência entre uma chave de roteamento de mensagens e este padrão.
A chave de roteamento deve ser uma lista de palavras, delimitada por um ponto (.). Exemplos disso são os acordos.usandaracordos.eu.estocolmo, que neste caso identifica acordos que são estabelecidos para uma empresa com escritórios em vários locais diferentes. Os padrões de roteamento podem conter um asterisco (“*”) para corresponder a uma palavra em uma posição específica da chave de roteamento (por exemplo, um padrão de roteamento de “acordos.*.*.b.*” só corresponde a chaves de roteamento onde a primeira palavra é “acordos” e a quarta palavra é “b”). Um símbolo de libra (“#”) indica uma correspondência de zero ou mais palavras (por exemplo, um padrão de roteamento de “agreements.eu.berlin.#” corresponde a qualquer chave de roteamento começando com “agreements.eu.berlin”).
Os consumidores indicam em quais tópicos eles estão interessados (como assinar um feed para uma tag individual). O consumidor cria uma fila e estabelece uma ligação com um determinado padrão de roteamento para a troca. Todas as mensagens com uma chave de roteamento que correspondem ao padrão de roteamento são roteadas para a fila e ficam lá até o consumidor consumir a mensagem.
A troca padrão dos corretores AMQP deve fornecer para a troca do tópico é “amq.topic”.
Scenario 1
A imagem à direita mostra um exemplo onde o consumidor A está interessado em todos os acordos em Berlim.
- Câmbio: acordos
- fila A: acordos_de_bérlin_acordos
- Padrão de rota entre troca (acordos) e Fila A (acordos_de_bérlin): acordos.eu.berlin.#
- Exemplo da chave de encaminhamento de mensagens que combina: agreements.eu.berlin e agreements.eu.berlin.headstore
Scenario 2
Consumidor B está interessado em todos os acordos.
- Câmbio: acordos
- fila B: todos_acordos
- Padrão de roteamento entre intercâmbio (acordos) e fila B (todos_acordos): acordos.#
- Exemplo da chave de roteamento de mensagens que combina: agreements.eu.berlin e agreements.us
Cenário 3
Consumidor C está interessado em todos os acordos para as lojas europeias.
- Câmbio: acordos
- fila C: acordos_da_fila
- Padrão de roteamento entre intercâmbio (acordos) e Fila C (acordos_da_fila): acordos.eu.*.headstore
- Exemplo de chaves de roteamento de mensagens que irão corresponder: agreements.eu.berlin.headstore e agreements.eu.stockholm.headstore
Exemplo
Uma mensagem com acordos de chaves de roteamento.eu.berlinis enviado para os acordos de troca. As mensagens são encaminhadas para o queueberlin_agreementsbecause the routing pattern of “agreements.eu.berlin.#” match the routing keys beginning with “agreements.eu.berlin”. A mensagem também é encaminhada para o queueall_agreementsbecause the routing key (agreements.eu.berlin) matches the routing pattern (agreements.#).
Fanout Exchange
A fanout exchange copies and routes a received message to all queueholders that are bound to it regardless of routing keys or pattern matching as with direct and topic exchanges. As chaves fornecidas serão simplesmente ignoradas.
A troca de fanout pode ser útil quando a mesma mensagem precisa ser enviada para uma ou mais filas com consumidores que podem processar a mesma mensagem de maneiras diferentes.
A imagem à direita (Fanout Exchange) mostra um exemplo onde uma mensagem recebida pela troca é copiada e encaminhada para as três filas vinculadas à troca. Poderia ser atualizações esportivas ou meteorológicas que devem ser enviadas para cada dispositivo móvel conectado quando algo acontece, por exemplo.
A troca padrão dos corretores AMQP deve fornecer para o tópico troca é “amq.fanout”.
Scenario 1
- Exchange: sport_news
- Queue A: Fila de clientes móveis A
- Binding: Encadernação entre a troca (sport_news) e a Fila A (Fila do cliente móvel A)
Exemplo
É enviada uma mensagem para a exchangeport_news. A mensagem é encaminhada para todas as filas (Fila A, Fila B, Fila C) porque todas as filas estão ligadas à troca. Desde que as chaves de roteamento sejam ignoradas.
Cheaders Exchange
A headers trocam mensagens de rotas com base em argumentos contendo cabeçalhos e valores opcionais. Trocas de cabeçalhos são muito semelhantes a trocas de tópicos, mas mensagens de rota baseadas em valores de cabeçalho em vez de chaves de roteamento. Uma mensagem corresponde se o valor do cabeçalho for igual ao valor especificado no binding.
Um argumento especial chamado “x-match”, adicionado no binding entre troca e fila, especifica se todos os cabeçalhos devem corresponder ou apenas um. Ou qualquer cabeçalho comum entre a mensagem e a contagem do binding como uma correspondência, ou todos os cabeçalhos referenciados no binding precisam estar presentes na mensagem para que ela corresponda. A propriedade “x-match” pode ter dois valores diferentes: “qualquer” ou “todos”, onde “todos” é o valor padrão. Um valor de “all” significa que todos os pares de cabeçalhos (chave, valor) devem coincidir, enquanto o valor de “any” significa que pelo menos um dos pares de cabeçalhos deve coincidir. Os cabeçalhos podem ser construídos usando uma gama mais ampla de tipos de dados, inteiro ou hash, por exemplo, em vez de uma string. O tipo de troca de cabeçalhos (usado com o argumento binding “any”) é útil para direcionar mensagens que contenham um subconjunto de critérios conhecidos (não ordenados).
A troca padrão de corretores AMQP deve fornecer para a troca de tópicos é “amq.headers”.
Exemplo
Scenario 3
Mensagem 3 é publicada para a troca com argumentos de cabeçalho de (chave = valor): “format = zip”, “type = log”.
É importante notar que numa troca de cabeçalho, a ordem real dos pares chave-valor na mensagem é irrelevante.
Morte da troca de cartas
Se não for encontrada uma fila correspondente para a mensagem, a mensagem é silenciosamente descartada. RabbitMQ fornece uma extensão AMQP conhecida como “Dead Letter Exchange”, que fornece a funcionalidade de capturar mensagens que não podem ser entregues.
Por favor envie-nos um e-mail para [email protected] você tem alguma sugestão sobre conteúdo faltante ou outro feedback.