CoelhoMQ. Parte 2. Compreendendo as Exchanges

Exchange — permutador ou ponto de troca. Mensagens são enviadas para ele. Exchange distribui a mensagem em uma ou mais filas. Ele roteia mensagens para uma fila com base em links criados (bindings) entre ele e a fila.

Exchange não é Processo Erlang. Por razões de escalabilidade exchange é uma string (um link para o módulo com o código onde está a lógica de roteamento) no banco de dados incorporado mnésia. 1 mil trocadores consumirão apenas 1 MB de memória.

Índice analítico

Troca Direta

Direct exchange - usado quando necessário entregar uma mensagem para filas específicas. A mensagem é publicada no exchanger com um endereço específico chave de roteamento e entra em todas as filas associadas a este trocador com uma chave de roteamento semelhante. A chave de roteamento é uma string. A correspondência é feita usando verificando strings para igualdade.

Representação gráfica do fluxo de mensagens:

CoelhoMQ. Parte 2. Compreendendo as Exchanges

В rabbitmq existe um conceito trocador padrão. Ele direct exchange sem nome. Se o trocador padrão for usado, a mensagem será roteada para uma fila com nome igual a chave de roteamento de mensagens.

Troca de tópicos

Topic exchange – semelhante direct exchange permite o roteamento seletivo comparando a chave de roteamento. Mas, neste caso, a chave é dada por padrão. Ao criar um modelo, use 0 ou mais palavras (letras AZ и az e números 0-9), separados por um ponto, bem como símbolos * и #.

  • * - pode ser substituído por exatamente 1 palavra
  • # - pode ser substituído por 0 ou mais palavras

Representação gráfica do fluxo de mensagens:

CoelhoMQ. Parte 2. Compreendendo as Exchanges

A partir da versão RabbitMQ 2.4.0 algoritmo de roteamento para topic exchange comecei a trabalhar até 145 vezes mais rápido. Eles conseguiram isso implementando a abordagem implementação de trie, o que implica a representação de modelos como uma estrutura em árvore. Por exemplo modelos a.b.c, a.*.b.c, a.#.c и b.b.c será representado pela seguinte estrutura:

CoelhoMQ. Parte 2. Compreendendo as Exchanges

A correspondência de padrões é pesquisada começando pela raiz e indo de cima para baixo.

Características:

  • o uso deste trocador pode se tornar uma boa escolha para possível desenvolvimento futuro de aplicativos, porque os modelos sempre podem ser personalizados para que a mensagem seja publicada de forma semelhante direct exchange ou fanout exchange
  • modelos que usam * muito mais rapidodo que modelos que usam #.
  • topic exchange mais devagar direct exchange

Troca de fãs

Fanout exchange - todas as mensagens são entregues em todas as filas mesmo se uma chave de roteamento for especificada na mensagem.

Características:

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

Representação gráfica do fluxo de mensagens:

CoelhoMQ. Parte 2. Compreendendo as Exchanges

Troca de Cabeçalhos

Headers exchange - roteia mensagens para filas relacionadas com base em uma comparação de pares de propriedades (chave, valor) headers ligação e propriedade de mensagem semelhante. headers Representa Dictionary<ключ, значение>.

Se você adicionar uma chave especial ao dicionário x-match com valor any, a mensagem será roteada se os pares (chave, valor) corresponderem parcialmente. Este comportamento é semelhante ao operador or.

var bindingArguments = new Dictinary<String, Object>();
bindingArguments.add("x-match", "any");

Chave padrão x-match contém um valor all. Isso significa que a mensagem é roteada quando os pares (chave, valor) correspondem completamente. Este comportamento é semelhante ao operador and.

Representação gráfica do fluxo de mensagens:

CoelhoMQ. Parte 2. Compreendendo as Exchanges

Características:

  • flexibilidade adicional
  • sobrecarga computacional adicional. Todos os pares (chave, valor) de um atributo headers deve ser classificado por nome de chave antes de calcular os valores de roteamento de mensagens. Mais lento que outros tipos de troca.

Troca de hash consistente

Este trocador é plugar и não embutido в RabbitMQ.

Consistent-hashing exchange (troca consistente com hash) - usado quando há múltiplas filas que são potenciais destinatários de uma mensagem e quando é necessário balancear a carga entre elas. A mensagem é associada à fila por peso (um valor de string condicional de 0 - n).

Peso equivalente das filas – indica que cada fila receberá aproximadamente a mesma quantia mensagens (cada mensagem será colocada em apenas uma fila). Não há garantia completa de distribuição uniforme de mensagens.

Representação gráfica do fluxo de mensagens:

CoelhoMQ. Parte 2. Compreendendo as Exchanges

Hash calculado com base na chave de roteamento ou propriedade headers mensagens. Se todas as mensagens publicadas tivessem chaves de roteamento diferentes, ou headers, então a distribuição ocorrerá por peso. Caso contrário, a chave de roteamento será usada, ou headers.

Deve ajudar quando o rendimento do consumidor precisa crescer mais do que uma solução com vários consumidores usando a mesma fila.

Combinação de trocadores (E2E)

O comportamento de todos os trocadores pode ser combinado usando comunicação Troca para troca (a combinação de trocadores não está incluída na especificação AMQP. Esta é uma extensão de protocolo lateral RabbitMQ).

Representação gráfica do fluxo de mensagens:

CoelhoMQ. Parte 2. Compreendendo as Exchanges

Por E2E podemos encontrar a configuração escalável certa que atenda aos requisitos atuais e crescentes.

Crie uma troca

O trocador é criado usando um síncrono RPC solicitação ao servidor. A solicitação é feita através do método Exchange.Declare, chamado com parâmetros:

  • nome do trocador
  • tipo de trocador
  • outras opções

Exemplo de criação exchange com RabbitMQ.Cliente:

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

  • exchange — o nome do trocador que queremos criar. O nome deve ser único
  • type - tipo de trocador
  • durable - se instalado trueem seguida exchange será permanente. Ele será armazenado em disco e poderá sobreviver à reinicialização do servidor/corretor. Se o valor falseem seguida exchange é temporário e será removido quando o servidor/broker for reiniciado
  • autoDelete - exclusão automática. Exchange será excluído quando todas as filas associadas forem excluídas
  • arguments - argumentos opcionais. Na maioria das vezes, eles especificam por meio de argumentos alternative exchange (trocador alternativo). Se uma mensagem não puder passar pela rota original, ela poderá ser enviada para uma central alternativa para ser roteada por um caminho diferente.

CoelhoMQ. Parte 2. Compreendendo as Exchanges

Se a criação exchange talvez, então o servidor enviará ao cliente uma mensagem síncrona RPC responder Exchange.DeclareOk. Se a criação é impossível (houve recusa no pedido Exchange.Declare), então o canal vai fechar servidor usando um comando assíncrono Channel.Close e o cliente receberá uma exceção OperationInterruptedException, que conterá o código do erro e sua descrição.

Um trocador deve ser criado antes da postagem. Se você publicar uma mensagem em algum trocador inexistente - RabbitMQ remova-o silenciosamente.

Crie uma GUI do Exchange

Vá para o painel de administração RabbitMQ sob usuário guest (nome de usuário: guest e senha: guest). Observe que o usuário guest só pode se conectar do localhost. Agora vamos para a aba Exchanges e clique em Add a new exchange. Preencha as propriedades:

CoelhoMQ. Parte 2. Compreendendo as Exchanges

A maioria das propriedades foi descrita acima. Aqui notamos que se definirmos Internal, então a troca só poderá ser usada para E2E. Producer não poderá enviar mensagens para tal troca.

Conclusão

Ao desenvolver um sistema, é conveniente descrever a topologia roteamento usando um gráfico. Mas antes de começar a construir um gráfico, vale destacar os caminhos com alto tráfego, pois. eles exigem maior rendimento (desempenho). A seguir, você pode classificar o tráfego. E então comece a construir.

Se no gráfico construído houver conjunto finito chaves de roteamento, então, vale a pena olhar para vários fanout exchange, que são 1:1 relacionados à chave de roteamento. Lembre-se disso fanout exchange o mais rápido.

Se o número de rotas tende ao infinito, então você deve prestar atenção a topic exchange ou, se o modelo não for necessário, você pode escolher direct exchnge, porque ele é mais rápido topic exchange.

Combinações de vários exchange deve ajudá-lo a encontrar o caminho certo. configuração escalável, que atende aos requisitos de sistema atuais e crescentes.

Número exchange e as filas devem ser mínimas em comparação com o número de rotas.

No próximo artigo, começaremos a entender mais sobre Queues e Bindings.

referências

Fonte: habr.com

Adicionar um comentário