CoelloMQ. Parte 2. Comprensión dos intercambios

Exchange — intercambiador ou punto de intercambio. Envíanlle mensaxes. Exchange distribúe a mensaxe nunha ou varias filas. El encamiña as mensaxes a unha cola en función das conexións creadas (bindings) entre el e a cola.

Exchange non é Proceso de Erlang. Por razóns de escalabilidade exchange - esta é unha liña (enlace a un módulo con código onde se atopa a lóxica de enrutamento) na base de datos integrada mnesia. 1 intercambiadores consumirán só 1 MB de memoria.

Índice analítico

Intercambio Directo

Direct exchange - úsase cando sexa necesario entregar a mensaxe a colas específicas. A mensaxe publícase ao intercambiador cun específico clave de enrutamento e métese en todas as filas que están conectadas a este intercambiador cunha clave de enrutamento similar. A clave de enrutamento é unha cadea. A correspondencia atópase usando comprobando a equivalencia das cadeas.

Representación gráfica do fluxo de mensaxes:

CoelloMQ. Parte 2. Comprensión dos intercambios

В rabbitmq hai un concepto intercambiador predeterminado. É direct exchange sen nome. Se se usa o intercambiador predeterminado, a mensaxe encamiñarase a unha cola cun nome igual a clave de enrutamento de mensaxes.

Intercambio de temas

Topic exchange – semellante direct exchange permite o enrutamento selectivo comparando a clave de enrutamento. Pero, neste caso, a clave está dada segundo o modelo. Ao crear un modelo, use 0 ou máis palabras (letras AZ и az e números 0-9), separados por un punto, así como símbolos * и #.

  • * - pode ser substituído por exactamente 1 a palabra
  • # - pode ser substituído por 0 ou máis palabras

Representación gráfica do fluxo de mensaxes:

CoelloMQ. Parte 2. Comprensión dos intercambios

Desde a versión RabbitMQ 2.4.0 algoritmo de enrutamento para topic exchange comezou a traballar ata 145 veces máis rápido. Conseguírono introducindo un enfoque probar a implementación, que implica representar patróns como unha estrutura en árbore. Por exemplo modelos a.b.c, a.*.b.c, a.#.c и b.b.c estará representada pola seguinte estrutura:

CoelloMQ. Parte 2. Comprensión dos intercambios

A busca de coincidencia dun patrón realízase partindo da raíz e procedendo de arriba a abaixo.

Características:

  • o uso deste intercambiador pode converterse unha boa opción para o posible desenvolvemento futuro da aplicación, porque os modelos sempre se poden personalizar para que a mensaxe se publique do mesmo xeito direct exchange ou fanout exchange
  • modelos que usan * moito máis rápidoque os modelos que usan #.
  • topic exchange máis lento direct exchange

Intercambio de fanout

Fanout exchange - todas as mensaxes son entregadas a todas as filas aínda que se especifique unha clave de enrutamento na mensaxe.

Características:

  • RabbitMQ non funciona con chaves de enrutamento e modelos que ten un efecto positivo na produtividade. Este é o máis rápido exchange;
  • todos os consumidores deben poder procesar todas as mensaxes;

Representación gráfica do fluxo de mensaxes:

CoelloMQ. Parte 2. Comprensión dos intercambios

Intercambio de cabeceiras

Headers exchange - encamiña as mensaxes ás filas asociadas en función da comparación de pares de propiedades (clave, valor). headers ligazóns e propiedades de mensaxes similares. headers é un Dictionary<ключ, значение>.

Se engades unha clave especial ao dicionario x-match con valor any, entón a mensaxe envíase se hai unha coincidencia parcial de pares (clave, valor). Este comportamento é semellante ao do operador or.

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

Chave predeterminada x-match contén o valor all. Isto significa que a mensaxe envíase se os pares (chave, valor) coinciden exactamente. Este comportamento é semellante ao do operador and.

Representación gráfica do fluxo de mensaxes:

CoelloMQ. Parte 2. Comprensión dos intercambios

Características:

  • flexibilidade adicional
  • sobrecarga computacional adicional. Todos os pares (clave, valor) dun atributo headers debe ordenarse polo nome da chave antes de calcular os valores de enrutamento de mensaxes. Máis lento que outros tipos de intercambio.

Intercambio de hashing consistente

Este intercambiador é enchufar и non incorporado в RabbitMQ.

Consistent-hashing exchange (intercambio con hash consistente): úsase cando hai varias filas que son posibles destinatarios dunha mensaxe e cando precisa equilibrar a carga entre elas. A conexión dunha mensaxe coa cola prodúcese por peso (valor de cadea condicional de 0 - n).

Peso equivalente das filas: indica que recibirá cada fila aproximadamente a mesma cantidade mensaxes (cada mensaxe colocarase só nunha cola). Non existe unha garantía total de distribución uniforme das mensaxes.

Representación gráfica do fluxo de mensaxes:

CoelloMQ. Parte 2. Comprensión dos intercambios

Hash calculado en función da clave ou propiedade de enrutamento headers mensaxes. Se todas as mensaxes publicadas tivesen claves de enrutamento diferentes ou headers, entón a distribución producirase por peso. En caso contrario, utilizarase a clave de enrutamento ou headers.

Debería axudar cando o rendemento dos consumidores necesita crecer máis que unha solución con varios consumidores usando unha única cola.

Intercambiadores combinados (E2E)

O comportamento de todos os intercambiadores pódese combinar mediante a comunicación Intercambio a Intercambio (Os intercambiadores combinados non están incluídos na especificación AMQP. Esta é unha extensión do protocolo desde o lado RabbitMQ).

Representación gráfica do fluxo de mensaxes:

CoelloMQ. Parte 2. Comprensión dos intercambios

A costa de E2E podemos atopar a configuración escalable adecuada para satisfacer os requisitos actuais e crecentes.

Crear intercambio

A creación dun intercambiador prodúcese mediante o sincrónico RPC solicitude ao servidor. A solicitude realízase mediante o método Exchange.Declarechamado con parámetros:

  • nome do intercambiador
  • tipo de intercambiador
  • outros parámetros

Exemplo de creación exchange con axuda RabbitMQ.Cliente:

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

  • exchange — o nome do intercambiador que queremos crear. O nome debe ser único
  • type - Tipo de intercambiador
  • durable - se está instalado true, Entón exchange será permanente. Almacenarase no disco e pode sobrevivir a un reinicio do servidor/corretor. Se o valor false, Entón exchange é temporal e eliminarase cando se reinicie o servidor/corredor
  • autoDelete - eliminación automática. Exchange eliminarase cando se eliminen todas as filas asociadas a el
  • arguments - argumentos opcionais. Na maioría das veces, especifican mediante argumentos alternative exchange (intercambiador alternativo). Se unha mensaxe non pode viaxar pola ruta orixinal, pódese enviar a un intercambiador alternativo para ser encamiñada por un camiño diferente.

CoelloMQ. Parte 2. Comprensión dos intercambios

Se creación exchange quizais, entón o servidor enviará ao cliente un sincrónico RPC responder Exchange.DeclareOk. Se creación é imposible (a solicitude foi denegada Exchange.Declare), entón a canle pecharase servidor mediante un comando asíncrono Channel.Close e o cliente recibirá unha excepción OperationInterruptedException, que conterá o código de erro e a súa descrición.

Debe crearse un intercambiador antes de publicar mensaxes. Se publicas unha mensaxe a algún intercambiador inexistente - RabbitMQ eliminarao silenciosamente.

Creando Exchange mediante GUI

Vaia ao panel de administración RabbitMQ baixo usuario guest (nome de usuario: guest e contrasinal: guest). Teña en conta que o usuario guest só se pode conectar desde localhost. Agora imos á pestana Exchanges e fai clic en Add a new exchange. Completa as propiedades:

CoelloMQ. Parte 2. Comprensión dos intercambios

A maioría das propiedades foron descritas anteriormente. Aquí observamos que se establecemos Internal, entón o intercambio só se pode usar para E2E. Producer non poderá enviar mensaxes a tal intercambio.

Conclusión

Ao desenvolver un sistema, é conveniente describir a topoloxía enrutamento utilizando unha gráfica. Pero antes de comezar a construír un gráfico, paga a pena destacar os camiños con moito tráfico, porque son eles os que demandan maior rendemento (actuación). A continuación, pode clasificar o tráfico. E só entón comezar a construír.

Se na gráfica construída hai conxunto finito claves de enrutamento, entón paga a pena mirar para varias fanout exchange, que son 1:1 relacionados coa clave de enrutamento. Lembrámolo fanout exchange o máis rápido.

Se o número de rutas tende ao infinito, entón debes prestarlle atención topic exchange ou, se o modelo non é necesario, pode seleccionar direct exchnge, porque el é máis rápido topic exchange.

Combinacións de diferentes exchange debería axudarche a atopar o correcto configuración escalable, que cumpre os requisitos do sistema actuais e os crecentes.

Número exchange e as colas deben ser mínimas en comparación co número de rutas.

No seguinte artigo comezaremos a comprender as colas e os enlaces con máis detalle.

referencias

Fonte: www.habr.com

Engadir un comentario