ConejoMQ. Parte 2. Comprender los intercambios

Exchange — intercambiador o punto de cambio. Se le envían mensajes. Exchange distribuye mensaje en una o más colas. Él enruta mensajes a una cola basado en las conexiones creadas (bindings) entre él y la cola.

Exchange no es proceso erlang. Por razones de escalabilidad exchange - esta es una línea (enlace a un módulo con código donde se encuentra la lógica de enrutamiento) en la base de datos incorporada memoria. Mil intercambiadores consumirán sólo 1 MB de memoria.

tabla de contenidos

Intercambio directo

Direct exchange - usado cuando sea necesario entregar mensajes a colas específicas. El mensaje se publica en el intercambiador con un mensaje específico. clave de enrutamiento y ingresa a todas las colas que están conectadas a este intercambiador con una clave de enrutamiento similar. La clave de enrutamiento es una cadena.. La coincidencia se encuentra usando comprobar la equivalencia de las cadenas.

Representación gráfica del flujo de mensajes:

ConejoMQ. Parte 2. Comprender los intercambios

В rabbitmq hay un concepto intercambiador predeterminado. Lo direct exchange sin nombre. Si se utiliza el intercambiador predeterminado, el mensaje se enrutará a una cola con un nombre igual a clave de enrutamiento de mensajes.

Intercambio de temas

Topic exchange - similar direct exchange permite el enrutamiento selectivo comparando la clave de enrutamiento. Pero, en este caso, la clave está dada por patrón. Al crear una plantilla, utilice 0 o más palabras (letras AZ и az y numeros 0-9), separados por un punto, así como símbolos * и #.

  • * - puede ser reemplazado por exactamente 1 palabra
  • # - puede ser reemplazado por 0 o más palabras

Representación gráfica del flujo de mensajes:

ConejoMQ. Parte 2. Comprender los intercambios

Desde la versión RabbitMQ 2.4.0 algoritmo de enrutamiento para topic exchange comenzó a trabajar hasta 145 veces más rápido. Lo lograron introduciendo un enfoque implementación de prueba, que implica representar patrones como una estructura de árbol. Por ejemplo plantillas a.b.c, a.*.b.c, a.#.c и b.b.c estará representado por la siguiente estructura:

ConejoMQ. Parte 2. Comprender los intercambios

La búsqueda de un patrón coincidente se realiza empezando desde la raíz y avanzando de arriba a abajo.

Características:

  • el uso de este intercambiador puede convertirse una buena opción para un posible desarrollo futuro de la aplicación, porque Las plantillas siempre se pueden personalizar para que el mensaje se publique de la misma manera. direct exchange o fanout exchange
  • plantillas que utilizan * mucho mas rápidoque las plantillas que utilizan #.
  • topic exchange mas lento direct exchange

Intercambio de distribución

Fanout exchangetodos los mensajes se entregan a todas las colas incluso si se especifica una clave de enrutamiento en el mensaje.

Características:

  • RabbitMQ no funciona con claves y plantillas de enrutamiento lo que tiene un efecto positivo en la productividad. este es el mas rapido exchange;
  • todos los consumidores deben poder procesar todos los mensajes;

Representación gráfica del flujo de mensajes:

ConejoMQ. Parte 2. Comprender los intercambios

Intercambio de encabezados

Headers exchange - enruta mensajes a colas asociadas basándose en la comparación de pares de propiedades (clave, valor) headers enlaces y propiedades de mensajes similares. headers representa Dictionary<ключ, значение>.

Si agrega una clave especial al diccionario x-match con valor any, entonces el mensaje se enruta si hay una coincidencia parcial de pares (clave, valor). Este comportamiento es similar al del operador. or.

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

Clave predeterminada x-match contiene el valor all. Esto significa que el mensaje se enruta si los pares (clave, valor) coinciden exactamente. Este comportamiento es similar al del operador. and.

Representación gráfica del flujo de mensajes:

ConejoMQ. Parte 2. Comprender los intercambios

Características:

  • flexibilidad adicional
  • sobrecarga computacional adicional. Todos los pares (clave, valor) de un atributo headers debe ordenarse por nombre de clave antes de calcular los valores de enrutamiento de mensajes. Más lento que otros tipos de intercambio.

Intercambio de hash consistente

Este intercambiador es enchufar и no incorporado в RabbitMQ.

Consistent-hashing exchange (intercambio con hash consistente): se usa cuando hay varias colas que son destinatarios potenciales de un mensaje y cuando es necesario equilibrar la carga entre ellas. La conexión de un mensaje con la cola se produce por peso (valor de cadena condicional de 0 - n).

Peso equivalente de colas: indica que cada cola recibirá aproximadamente la misma cantidad mensajes (cada mensaje se colocará en una sola cola). No existe una garantía completa de distribución uniforme de mensajes..

Representación gráfica del flujo de mensajes:

ConejoMQ. Parte 2. Comprender los intercambios

Hash calculado en función de la clave de enrutamiento o la propiedad headers mensajes. Si todos los mensajes publicados tuvieran diferentes claves de enrutamiento o headers, entonces la distribución se realizará en peso. De lo contrario, se utilizará la clave de enrutamiento o headers.

Debería ayudar cuando el rendimiento del consumidor necesita crecer más que una solución con varios consumidores utilizando una sola cola.

Combinando intercambiadores (E2E)

El comportamiento de todos los intercambiadores se puede combinar mediante la comunicación. Intercambio a Intercambio (La combinación de intercambiadores no está incluida en la especificación AMQP. Esta es una extensión del protocolo desde el lado. RabbitMQ).

Representación gráfica del flujo de mensajes:

ConejoMQ. Parte 2. Comprender los intercambios

Por E2E podemos encontrar la configuración escalable adecuada para satisfacer los requisitos actuales y crecientes.

Crear intercambio

La creación de un intercambiador se produce mediante sincronización. RPC solicitud al servidor. La solicitud se realiza mediante el método Exchange.Declare, llamado con parámetros:

  • nombre del intercambiador
  • tipo de intercambiador
  • otras opciones

Ejemplo de creación exchange con RabbitMQ.Cliente:

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

  • exchange — el nombre del intercambiador que queremos crear. El nombre debe ser único
  • type — tipo de intercambiador
  • durable - si está instalado trueentonces exchange será permanente. Se almacenará en el disco y puede sobrevivir a un reinicio del servidor/broker. si el valor falseentonces exchange es temporal y se eliminará cuando se reinicie el servidor/broker
  • autoDelete - eliminación automática. Exchange se eliminará cuando se eliminen todas las colas asociadas con él
  • arguments - argumentos opcionales. La mayoría de las veces, especifican mediante argumentos. alternative exchange (intercambiador alternativo). Si un mensaje no puede viajar por la ruta original, se puede enviar a un intercambiador alternativo para que lo enrute por una ruta diferente.

ConejoMQ. Parte 2. Comprender los intercambios

si la creación exchange tal vez, entonces el servidor enviará al cliente un síncrono RPC responder Exchange.DeclareOk. si la creación imposible (hubo una negativa a la solicitud Exchange.Declare) entonces el canal se cerrara servidor usando un comando asíncrono Channel.Close y el cliente obtendrá una excepción OperationInterruptedExceptionOperationInterruptedException, que contendrá el código de error y su descripción.

Se debe crear un intercambiador antes de publicar mensajes. Si publica un mensaje en algún intercambiador inexistente, RabbitMQ lo eliminará silenciosamente.

Creando Exchange a través de GUI

Ir al panel de administración RabbitMQ bajo usuario guest (nombre de usuario: guest y contraseña: guest). Tenga en cuenta que el usuario guest solo se puede conectar desde localhost. Ahora vamos a la pestaña Exchanges y haga clic en Add a new exchange. Rellena las propiedades:

ConejoMQ. Parte 2. Comprender los intercambios

La mayoría de las propiedades se han descrito anteriormente. Aquí observamos que si configuramos Internal, entonces el intercambio sólo se puede utilizar para E2E. Producer no podrá enviar mensajes a dicho intercambio.

Conclusión

Al desarrollar un sistema, es conveniente describir la topología. enrutamiento utilizando una gráfica. Pero antes de comenzar a construir un gráfico, vale la pena resaltar las rutas con mucho tráfico, porque ellos son los que exigen mayor rendimiento (actuación). A continuación, puedes clasificar el tráfico. Y sólo entonces empezar a construir.

Si en el gráfico construido hay conjunto finito claves de enrutamiento, entonces vale la pena buscar varias fanout exchange, que están relacionados 1:1 con la clave de enrutamiento. recordamos que fanout exchange el más rápido.

Si el número de rutas tiende al infinito, vale la pena prestar atención topic exchange o, si la plantilla no es necesaria, puede seleccionar direct exchnge, porque el es mas rapido topic exchange.

Combinaciones de diferentes exchange debería ayudarte a encontrar el correcto configuración escalable, que cumple con los requisitos del sistema actuales y crecientes.

número exchange y las colas deben ser mínimas en comparación con el número de rutas.

En el próximo artículo comenzaremos a comprender las colas y los enlaces con más detalle.

referencias

Fuente: habr.com

Añadir un comentario