RabbitMQ. Parte 2. Entendiendo Exchanges

Intercambio — un intercambiador o punto de intercambio. Se envían mensajes a él. Intercambio distribuye el mensaje en una o varias colas. Él ruteará los mensajes a la queue basándose en las relaciones creadas (enlaces) entre él y la cola.

Intercambio no es un proceso Erlang. Por razones de escalabilidad, exchange — es una cadena (enlace a un módulo de código donde reside la lógica de enrutamiento) en la base de datos incorporada mnesia. 1.000 intercambiadores consumirán solo 1 MB de memoria.

Tabla de contenido

  • RabbitMQ. Parte 1. Introducción. Erlang, AMQP y RPC
  • RabbitMQ. Parte 2. Entendiendo Exchanges
  • RabbitMQ. Parte 3. Entendiendo Queues y Bindings
  • RabbitMQ. Parte 4. Entendiendo qué son los mensajes y los tramas
  • RabbitMQ. Parte 5. Rendimiento de la publicación y consumo de mensajes
  • RabbitMQ. Parte 6. Resumen de los módulos Federation y Shovel
  • RabbitMQ. Parte 7. Detalles sobre Connection y Channel
  • RabbitMQ. Parte 8. RabbitMQ en .NET
  • RabbitMQ. Parte 9. Monitoreo

Intercambio Directo

intercambio directo — se utiliza cuando es necesario entregar un mensaje a colas específicas. El mensaje se publica en el intercambiador con una clave de enrutamiento y va a todas las colas que están asociadas a este intercambiador con una clave de enrutamiento similar. La clave de enrutamiento es una cadena. La búsqueda de coincidencias se realiza mediante la verificación de cadenas por equivalencia..

Representación gráfica del flujo de mensajes:

RabbitMQ. Parte 2. Entendiendo Exchanges

En rabbitmq existe el concepto de intercambiador por defecto. Esto es intercambio directo sin nombre. Si se aplica el intercambiador por defecto, el mensaje será enrutado a la cola con un nombre igual a la clave de enrutamiento del mensaje.

Intercambio por Temas

intercambio por temas – de manera similar, intercambio directo permite realizar enrutamientos selectivos mediante la comparación de la clave de enrutamiento. Pero, en este caso, la clave se establece según un patrón. Al crear un patrón, se utilizan 0 una o más palabras (letras AZ y az y cifras 0-9), separadas por puntos, así como símbolos * y #.

  • * — puede ser reemplazado por exactamente 1 «replica» (por ejemplo, la función snd_ctl_add_slave() fue reemplazada por snd_ctl_add_replica()), lo que provocó
  • # — puede ser reemplazado por 0 una o más palabras

Representación gráfica del flujo de mensajes:

RabbitMQ. Parte 2. Entendiendo Exchanges

A partir de la versión RabbitMQ 2.4.0 el algoritmo de enrutamiento para intercambio por temas empezó a trabajar hasta 145 seis veces más rápido. Lograron esto mediante la implementación de un enfoque trie implementation, que implica representar patrones en forma de estructura de árbol. Por ejemplo, los patrones a.b.c, a.*.b.c, a.#.c y b.b.c se representarán con la siguiente estructura:

RabbitMQ. Parte 2. Entendiendo Exchanges

La búsqueda de coincidencias para el patrón comienza en la raíz y se sigue de arriba hacia abajo.

Características:

  • la aplicación de este intercambiador puede ser una buena elección para el posible desarrollo futuro de la aplicación,ya que los patrones siempre se pueden ajustar para que el mensaje se publique de manera similar a intercambio directo o intercambio fanout,
  • patrones que utilizan * es mucho más rápido., que patrones que utilizan #.
  • intercambio por temas más lentamente intercambio directo

Intercambio Fanout

intercambio fanout – todos los mensajes se entregan a todas las colas incluso si se especifica una clave de enrutamiento en el mensaje.

Características:

  • RabbitMQ no trabaja con claves de enrutamiento y patrones, lo que afecta positivamente al rendimiento. Este es el más rápido. exchange;
  • todos los consumidores deben poder procesar todos los mensajes;

Representación gráfica del flujo de mensajes:

RabbitMQ. Parte 2. Entendiendo Exchanges

Intercambio de Encabezados

Intercambio de encabezados — dirige los mensajes a las colas relacionadas en función de la comparación de pares (clave, valor) de propiedad encabezados y la propiedad similar del mensaje. encabezados representa un Diccionario<clave, valor>.

Si se agrega una clave especial al diccionario x-match con el valor cualquiera, entonces el mensaje se enruta en caso de coincidencia parcial de pares (clave, valor). Este comportamiento es análogo al operador o.

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

De forma predeterminada, la clave x-match contiene el valor todo. Esto significa que el mensaje se enruta en caso de coincidencia total de pares (clave, valor). Este comportamiento es análogo al operador y.

Representación gráfica del flujo de mensajes:

RabbitMQ. Parte 2. Entendiendo Exchanges

Características:

  • flexibilidad adicional
  • costos adicionales de cálculo. Todos los pares (clave, valor) del atributo encabezados deben ordenarse por el nombre de la clave antes de calcular los valores de enrutamiento del mensaje. Más lento que otros tipos de intercambio.

Intercambio de Hash Consistente

Este intercambiador es un complemento y no incorporado en RabbitMQ.

Intercambio de hash consistente (intercambio con hashing consistente) - se usa cuando hay varias colas que son posibles receptores del mensaje y cuando es necesario equilibrar la carga entre ellas. La asociación del mensaje con la cola se produce en función del peso (un valor de cadena condicional de 0 - n).

El peso equivalente de las colas indica que a cada cola llegará aproximadamente la misma cantidad de mensajes (cada mensaje se depositará solo en una cola). No hay garantía total de distribución uniforme de los mensajes.

Representación gráfica del flujo de mensajes:

RabbitMQ. Parte 2. Entendiendo Exchanges

Hash se calcula en función de la clave de enrutamiento o de la propiedad encabezados del mensaje. Si todos los mensajes publicados tenían diferentes claves de enrutamiento o encabezados, entonces la distribución se realizará según el peso. De lo contrario, se utilizará la clave de enrutamiento o encabezados.

Debería ayudar cuando la capacidad de los consumidores necesite crecer más allá de la solución con varios consumidores utilizando una sola cola.

Combinación de intercambios (E2E)

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

Representación gráfica del flujo de mensajes:

RabbitMQ. Parte 2. Entendiendo Exchanges

Gracias a E2E podemos encontrar la configuración escalable adecuada que satisfaga tanto las demandas actuales como las crecientes.

Creación de Exchange

La creación de un intercambiador se realiza a través de una sincronización RPC al servidor. La solicitud se lleva a cabo mediante el método Exchange.Declare, que se invoca con los parámetros:

  • nombre del intercambiador
  • tipo de intercambiador
  • otros parámetros

Ejemplo de creación exchange con RabbitMQ.Client:

//...
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
  • tipo — tipo de intercambiador
  • durable — si se establece true, entonces exchange será permanente. Se almacenará en el disco y podrá sobrevivir al reinicio del servidor / corredor. Si el valor false, entonces exchange es temporal y será eliminado cuando el servidor / corredor se reinicie
  • autoDelete — eliminación automática. Intercambio será eliminado cuando se eliminen todas las colas relacionadas con él
  • arguments — argumentos opcionales. Más comúnmente, a través de los argumentos se definen alternative exchange (intercambiador alternativo). Si el mensaje no puede pasar por la ruta original, se puede enviar a un intercambiador alternativo para ser enrutado por otro camino.

RabbitMQ. Parte 2. Entendiendo Exchanges

Si la creación exchange posiblemente, el servidor enviará al cliente un RPC una respuesta Exchange.DeclareOk. Si la creación no es posible (se produjo un error en la solicitud Exchange.Declare), entonces el canal se cerrará por el servidor a través de un comando asincrónico Channel.Close y el cliente recibirá una excepción OperationInterruptedException, que contendrá un código de error y su descripción.

El intercambiador debe ser creado antes de publicar mensajes. Si publicas un mensaje en un intercambiador inexistente — RabbitMQ lo eliminará silenciosamente.

Creación de Exchange a través de la interfaz gráfica

Accedemos al panel de administración RabbitMQ con el usuario invitado (nombre de usuario: invitado y contraseña: invitado). Tenga en cuenta que el usuario invitado solo puede conectarse desde el host local. Ahora vamos a la pestaña Intercambios y hacemos clic en Agregar un nuevo intercambiador. Llenamos las propiedades:

RabbitMQ. Parte 2. Entendiendo Exchanges

La mayoría de las propiedades se han descrito anteriormente. Aquí destacamos que si se establece Interna, el intercambiador solo podrá usar E2E. Producer no podrá enviar mensajes a tal intercambiador.

Conclusión

Al desarrollar un sistema, es conveniente describir la topología de enrutamiento mediante un grafo. Pero antes de comenzar a construir el grafo, es importante destacar los caminos con mayor tráfico, ya que estos requieren mayor capacidad de ancho de banda (rendimiento). A continuación, se puede clasificar el tráfico. Y luego proceder a la construcción.

Si en el grafo construido existe un conjunto finito de claves de enrutamiento, entonces es recomendable considerar varios intercambio fanout,, que están ligados 1:1 a la clave de enrutamiento. Recuerda que intercambio fanout, es el más rápido.

Si el número de rutas tiende a ser infinito, es importante prestar atención a intercambio por temas o, si no se necesita patrón, se puede elegir direct exchange, ya que es más rápido. intercambio por temas.

Combinaciones de diferentes exchange deberían ayudar a encontrar la configuración correcta , que satisfaga tanto los requisitos actuales como los crecientes del sistema., y el número de colas debe ser mínimo en comparación con el número de rutas.

Cantidad exchange En el siguiente artículo comenzaremos a profundizar en Queues y Bindings.

En el siguiente artículo, comenzaremos a profundizar en las colas y enlaces.

Enlaces

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster