Exchange — um exchange ou ponto de troca. Nele, as mensagens são enviadas. Exchange distribui a mensagem para uma ou várias filas. Ele roteia mensagens para a fila com base nas relações criadas (binds) entre ele e a fila.
Exchange não é . Por questões de escalabilidade, exchange — é uma string (link para o módulo com o código, onde está a lógica de roteamento) na base de dados embutida . 1 mil exchanges consumirão apenas 1MB de memória.
Índice
- RabbitMQ. Parte 3. Entendendo as Queues e Bindings
- RabbitMQ. Parte 4. Entendendo o que são mensagens e frames
- RabbitMQ. Parte 5. Desempenho da publicação e consumo de mensagens
- RabbitMQ. Parte 6. Visão geral dos módulos Federation e Shovel
- RabbitMQ. Parte 7. Detalhes sobre Connection e Channel
- RabbitMQ. Parte 8. RabbitMQ no .NET
- RabbitMQ. Parte 9. Monitoramento
Direct Exchange
Direct exchange — é utilizado quando é necessário entregar a mensagem em filas específicas.A mensagem é publicada em um exchange com um determinado chave de roteamento e vai para todas as filas que estão ligadas a esse exchange com uma chave de roteamento similar. A chave de roteamento é uma string. A correspondência é feita através da verificação das strings por equivalência..
Uma representação gráfica do fluxo de mensagens:

Em rabbitmq existe o conceito de exchange padrão. Este é um direct exchange sem nome. Se um exchange padrão é utilizado, a mensagem será roteada para a fila cujo nome é igual à chave de roteamento da mensagem..
Topic Exchange
Topic exchange — similarmente direct exchange permite o roteamento seletivo ao comparar a chave de roteamento. Porém, neste caso, a chave é definida por um padrão. Ao criar um padrão, são utilizados 0 uma ou mais palavras (letras AZ e az e números 0-9), separados por ponto, assim como os símbolos * e #.
*— pode ser substituído exatamente por1uma palavra#— pode ser substituído por0uma ou mais palavras.
Uma representação gráfica do fluxo de mensagens:

A partir da versão RabbitMQ 2.4.0 o algoritmo de roteamento para topic exchange passou a funcionar até 145 vezes mais rápido. Eles conseguiram isso implementando a abordagem , que envolve a representação dos padrões como uma estrutura de árvore. Por exemplo, os padrões a.b.c, a.*.b.c, a.#.c e b.b.c serão representados pela seguinte estrutura:

A correspondência do padrão é feita iniciando pela raiz e seguindo de cima para baixo.
Características:
- a aplicação deste exchange pode se tornar uma boa escolha para um possível desenvolvimento futuro do aplicativo, pois os modelos podem sempre ser ajustados para que a mensagem seja publicada de maneira semelhante
direct exchangeoufanout exchange - modelos que utilizam
*muito mais rápido, do que os modelos que utilizam#. topic exchangemais devagardirect exchange
Fanout Exchange
Fanout exchange – todas as mensagens são entregues em todas as filas mesmo se a mensagem tiver uma chave de roteamento especificada.
Características:
RabbitMQnão funciona com chaves de roteamento e modelos o que tem um efeito positivo sobre o desempenho. Este é o mais rápidoexchange;- todos os consumidores devem ser capazes de processar todas as mensagens;
Uma representação gráfica do fluxo de mensagens:

Headers Exchange
Headers exchange – direciona mensagens para filas relacionadas com base na comparação de pares (chave, valor) das propriedades headers vinculações e propriedades semelhantes da mensagem. headers representa Dictionary<chave, valor>.
Se uma chave especial for adicionada ao dicionário x-match com o valor qualquer, a mensagem é roteada quando há uma correspondência parcial dos pares (chave, valor). Esse comportamento é semelhante ao operador ou.
var bindingArguments = new Dictinary<String, Object>();
bindingArguments.add("x-match", "any");Por padrão, a chave x-match contém o valor all. Isso significa que a mensagem é roteada quando há uma correspondência total dos pares (chave, valor). Esse comportamento é semelhante ao operador e.
Uma representação gráfica do fluxo de mensagens:

Características:
- flexibilidade adicional
- sobrecargas adicionais de computação. Todos os pares (chave, valor) do atributo
headersdevem ser ordenados por nome da chave antes de calcular os valores de roteamento da mensagem. Mais lento do que outros tipos de exchange.
Consistent-Hashing Exchange
Este exchange é uma e não embutido em RabbitMQ.
Consistent-hashing exchange (exchange com hashing consistente) – é utilizado quando há várias filas que são potenciais destinatárias da mensagem e quando é necessário equilibrar a carga entre elas. A relação da mensagem com a fila ocorre com base no peso (um valor de string condicional de 0 - n).
O peso equivalente das filas – indica que uma quantidade aproximadamente igual de mensagens (cada mensagem será colocada apenas em uma fila). Não há garantia total de que a distribuição das mensagens será uniforme.
Uma representação gráfica do fluxo de mensagens:

Hash é calculado com base na chave de roteamento ou propriedade headers da mensagem. Se todas as mensagens publicadas tiverem chaves de roteamento diferentes ou headers, a distribuição ocorrerá com base no peso. Caso contrário, será utilizada a chave de roteamento ou headers.
Deve ajudar quando a largura de banda do consumidor precisar crescer mais do que a solução com múltiplos consumidores usando uma única fila.
Combinação de exchanges (E2E)
O comportamento de todas as exchanges pode ser combinado por meio de conexão Exchange-to-Exchange (a combinação de exchanges não está incluída na especificação AMQP. Esta é uma extensão do protocolo do lado RabbitMQ).
Uma representação gráfica do fluxo de mensagens:

De E2E podemos encontrar a configuração escalável correta que atende tanto às demandas atuais quanto às crescentes.
Criação de Exchange
A criação da exchange ocorre através de uma solicitação síncrona RPC ao servidor. A solicitação é feita pelo método Exchange.Declare, invocando com os parâmetros:
- nome da exchange
- tipo da exchange
- outros parâmetros
Exemplo de criação exchange com :
//...
channel.ExchangeDeclare(
exchange: "my_exchange",
type: "direct",
durable: "false",
autoDelete: "false",
arguments: null
);
//...exchange— nome da exchange que queremos criar. O nome deve ser únicotipo— tipo da exchangedurável— se definido comoverdadeiro, entãoexchangeserá persistente. Ele será armazenado no disco e poderá sobreviver à reinicialização do servidor/broker. Se o valorfalso, entãoexchangefor temporário e será removido quando o servidor/broker for reiniciadoautoDelete— remoção automática.Exchangeserá removido quando todas as filas associadas a ele forem removidasarguments— argumentos opcionais. Na maioria das vezes, através dos argumentos define-sealternative exchange(exchange alternativo). Se a mensagem não puder passar pela rota original, ela pode ser enviada para a exchange alternativa para ser roteada por outro caminho.

Se a criação exchange talvez, o servidor enviará ao cliente uma resposta síncrona RPC uma resposta Exchange.DeclareOk. Se a criação é impossível (ocorreu um erro na solicitação Exchange.Declare), então o canal será fechado pelo servidor através de um comando assíncrono Channel.Close e o cliente receberá uma exceção , que conterá o código de erro e sua descrição.
A exchange deve ser criada antes da publicação de mensagens. Se você publicar uma mensagem em uma exchange inexistente — RabbitMQ ela será silenciosamente descartada.
Criação de Exchange através da interface gráfica
Acesse o painel do administrador RabbitMQ como usuário guest (username: guest e password: guest). Observe que o usuário guest pode se conectar apenas a partir do host local. Agora vamos para a aba Exchanges e clique em Add a new exchange. Preencha as propriedades:

A maior parte das propriedades foi descrita acima. Aqui notamos que se definir Interno, então a troca só poderá ser utilizada para E2E. Producer não poderá enviar mensagens para tal troca.
Conclusão
Ao desenvolver o sistema, é conveniente descrever a topologia usando um grafo. Mas antes de começar a construir o grafo, é importante identificar os caminhos com maior tráfego, pois são eles que exigem uma maior largura de banda (desempenho). Em seguida, é possível classificar o tráfego. E só então começar a construção.
Se no grafo construído existir um conjunto finito de chaves de roteamento, é válido considerar várias fanout exchange, que estão relacionadas 1:1 com a chave de roteamento. Lembre-se que fanout exchange é a mais rápida.
Se o número de rotas tende ao infinito, é importante prestar atenção em topic exchange ou, se o padrão não for necessário, pode-se escolher troca direta, pois é mais rápida. topic exchange.
Combinações diferentes exchange devem ajudar a encontrar a configuração escalável correta, que atenda tanto às necessidades atuais quanto às crescentes do sistema.
Quantidade exchange e o número de filas deve ser mínimo em relação ao número de rotas.
No próximo artigo, começaremos a explorar mais detalhadamente as Filas e Vínculos.
Links
Fonte: habr.com
