RabbitMQ. Parte 2. Entendendo os Exchanges

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 é um processo Erlang. 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 mnesia. 1 mil exchanges consumirão apenas 1MB de memória.

Índice

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:

RabbitMQ. Parte 2. Entendendo os Exchanges

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 por 1 uma palavra
  • # — pode ser substituído por 0 uma ou mais palavras.

Uma representação gráfica do fluxo de mensagens:

RabbitMQ. Parte 2. Entendendo os Exchanges

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 trie implementation, 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:

RabbitMQ. Parte 2. Entendendo os Exchanges

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 exchange ou fanout exchange
  • modelos que utilizam * muito mais rápido, do que os modelos que utilizam #.
  • topic exchange mais devagar direct 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:

  • RabbitMQ não funciona com chaves de roteamento e modelos o que tem um efeito positivo sobre o desempenho. Este é o mais rápido exchange;
  • todos os consumidores devem ser capazes de processar todas as mensagens;

Uma representação gráfica do fluxo de mensagens:

RabbitMQ. Parte 2. Entendendo os Exchanges

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:

RabbitMQ. Parte 2. Entendendo os Exchanges

Características:

  • flexibilidade adicional
  • sobrecargas adicionais de computação. Todos os pares (chave, valor) do atributo headers devem 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 plugin 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:

RabbitMQ. Parte 2. Entendendo os Exchanges

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:

RabbitMQ. Parte 2. Entendendo os Exchanges

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 RabbitMQ.Client:

//...
channel.ExchangeDeclare(
    exchange: "my_exchange",
    type: "direct",
    durable: "false",
    autoDelete: "false",
    arguments: null
);
//...

  • exchange — nome da exchange que queremos criar. O nome deve ser único
  • tipo — tipo da exchange
  • durável — se definido como verdadeiro, então exchange será persistente. Ele será armazenado no disco e poderá sobreviver à reinicialização do servidor/broker. Se o valor falso, então exchange for temporário e será removido quando o servidor/broker for reiniciado
  • autoDelete — remoção automática. Exchange será removido quando todas as filas associadas a ele forem removidas
  • arguments — argumentos opcionais. Na maioria das vezes, através dos argumentos define-se alternative 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.

RabbitMQ. Parte 2. Entendendo os Exchanges

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 OperationInterruptedException, 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:

RabbitMQ. Parte 2. Entendendo os Exchanges

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 de roteamento 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

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster