Una introducción a RabbitMQ, un corredor que se ocupa de mensajes

Una introducción a RabbitMQ, agente de mensajes, modelo AMQP y más.

En los sistemas distribuidos, la comunicación entre varias aplicaciones juega un papel importante. La transmisión eficaz de mensajes entre aplicaciones siempre fue una decisión crucial en el diseño del sistema. Una de las soluciones elegantes para pasar mensajes por su sistema distribuido es un intermediario de mensajes.

En los sistemas distribuidos, la comunicación entre varias aplicaciones juega un papel importante. La transmisión eficaz de mensajes entre aplicaciones siempre fue una decisión crucial en el diseño del sistema. Una de las soluciones elegantes para pasar mensajes por su sistema distribuido es un intermediario de mensajes.

Aportan el desacoplamiento entre las aplicaciones y proporcionan una forma eficaz de comunicarse. Con los corredores de mensajes, una aplicación no necesita conocimiento previo de sus destinatarios para comunicarse.

Sin embargo, ¿qué es RabbtiMQ? ¿Cómo encaja RabbitMQ en esta imagen? Además, ¿qué es AMQP?

Al final de este artículo, podremos responder estas preguntas. También agregué algunas animaciones para que pueda visualizar los conceptos de RabbitMQ.

Entonces, ¿estás emocionado? ¡Yo soy! Si alguna vez tuvo dificultades para comprender a los agentes de mensajes, como yo, este artículo es el lugar adecuado para comenzar su viaje. Quédate conmigo ?

Agente de mensajes

En general, un corredor es una persona que facilita las transacciones entre un comprador y un vendedor. Un ejemplo podría ser un agente inmobiliario o un corredor de bolsa.

De manera similar, si queremos intercambiar mensajes entre dos componentes de software distribuidos, necesitamos un mediador. Este mediador se conoce como el intermediario de mensajes. Recibe mensajes entrantes de un remitente y los envía a un destinatario. De esta forma el emisor y el receptor pueden quedar totalmente aislados.

Otra analogía para un agente de mensajes puede ser una oficina de correos (consulte la Figura 1). Tomemos un escenario en el que enviará una carta a su primo que vive en otra ciudad. Entonces, según esta analogía, usted es un productor, su primo es un consumidor y la oficina de correos es un corredor de mensajes.

RabbitMQ como agente de mensajes

Ahora sabemos que el propósito de un agente de mensajes es enrutar mensajes de un productor a un consumidor. Examinemos uno de esos agentes de mensajes: RabbitMQ. Es uno de los corredores de mensajes más utilizados en estos días.

La forma en que RabbitMQ enruta los mensajes depende del protocolo de mensajería que implemente. RabbitMQ admite múltiples protocolos de mensajería. Sin embargo, el que nos interesa es AMQP. Es un acrónimo de Advanced Message Queue Server Protocol.

Entonces, sin más preámbulos, echemos un vistazo más de cerca al modelo de protocolo AMQP.

Protocolo avanzado de Message Queue Server

El modelo conceptual de AMQP es bastante simple y directo. Tiene tres entidades:

  1. Cola
  2. Unión
  3. Intercambiar

Cuando un editor envía un mensaje a RabbitMQ, primero llega a un intercambio. El intercambio luego distribuye copias de estos mensajes a las colas conectadas de diversas formas. Finalmente, los consumidores reciben estos mensajes.

Considere un mensaje como un dato. Es necesariamente un paquete con una carga útil y algunos metadatos. La carga útil contiene datos completos, mientras que los metadatos son propiedades utilizadas por RabbitMQ.

La Figura 2 muestra una representación gráfica del modelo AMQP.

AMQP es un protocolo programable. Los programadores tienen la libertad de usar bibliotecas para configurar entidades (intercambio, enlace y cola) según sus propias necesidades. Un administrador de RabbitMQ no tiene ninguna función en la configuración de estas entidades.

Hay muchas bibliotecas disponibles para trabajar con RabbitMQ. Puede elegir entre Nodejs, Python, .Net, Java y muchos más.

Colas

Estas colas son de alguna manera similares a las colas de nuestras clases de estructura de datos. Las colas de RabbitMQ también siguen la metodología FIFO: primero en entrar, primero en salir. Una cola es un lugar donde RabbitMQ almacena mensajes / datos.

Los programadores pueden configurar colas a través de las bibliotecas de programación disponibles. Puede hacer que una cola sea duradera (con la Durabilitypropiedad) para proteger sus datos en caso de que el corredor falle. También puede proporcionar un nombre (con la Namepropiedad) a una cola. Aparte de Namey Durability, una cola tiene algunas otras propiedades como eliminación automática, exclusiva y argumentos.

Antes de seguir adelante, es importante comprender quién es un consumidor directo de estas colas. Además, ¿de cuántas formas puede un usuario consumir mensajes de una cola?

Consumidores

Los consumidores son los que van a utilizar los mensajes almacenados en una cola. Es posible conectar más de un consumidor a una cola a la vez. Los consumidores pueden sacar el mensaje de la cola al agruparlo o las colas pueden incluso enviar el mensaje a varios consumidores conectados.

Fijaciones

Los enlaces son las reglas que define una cola al establecer una conexión con un intercambio. Puede tener una cola conectada a varios intercambios. Cada cola también está conectada a un intercambio predeterminado. Un intercambio utilizará estos enlaces para enrutar mensajes a las colas.

Intercambios y sus tipos

Un intercambio es una puerta de entrada a RabbitMQ para sus mensajes. La distancia que debe recorrer el mensaje dentro de RabbitMQ depende del tipo de intercambio. Principalmente hay cuatro tipos.

  • Directo
  • Fanout
  • Tema
  • Encabezamiento

Directo

¡El nombre lo explica todo! - Un intercambio directo entrega un mensaje directamente a las colas que satisfacen la siguiente condición:

Routing key == Binding key 

Una clave de enrutamiento es un atributo del mensaje. Por otro lado, una clave de enlace es algo que especifica al crear un enlace entre una cola y un intercambio.

La Figura 3 es una explicación visual de cómo fluyen los mensajes mientras se usa un intercambio directo.

Un mensaje proviene de un productor (círculo verde) con una clave de ruta - img.resize. Una vez que llegue al intercambio (círculo naranja), el intercambio intentará encontrar todas las colas con la clave de enlace - img.resize. En caso de una coincidencia, el mensaje se envía a todas las colas coincidentes (cambiar el tamaño en nuestro caso). Si no se encuentra ninguna coincidencia, el mensaje se puede enviar de vuelta al productor o incluso se puede descartar. ¿Tenemos suerte de haber encontrado una coincidencia en nuestro ejemplo?

[imagen gif]

Una vez que el mensaje llega a la cola deseada (redimensionar en nuestro caso), se distribuyen en forma rotatoria a todos los consumidores conectados (resizer.1 / resizer.2 en nuestro caso).

Al distribuir mensajes de forma rotatoria, RabbitMQ se asegura de que la carga de los mensajes sea equilibrada.

Debes haber notado que la cola llamada crop no recibe ningún mensaje. Porque la clave de enrutamiento en este ejemplo es img.resize. Para enviar mensajes a esta cola, necesitamos enviar mensajes con una clave de enrutamiento que coincida con la clave de enlace ( img.crop por ejemplo).

Fanout

Un intercambio de Fanout ignora las claves de enrutamiento y distribuye un mensaje a todas las colas conectadas. No es de extrañar que se llame Fanout (¿enviar mensajes a todas las colas conectadas?).

Uno de los casos de uso de este tipo de intercambio es la difusión de mensajes.

Tenga en cuenta que RabbitMQ seguirá haciendo round robin si hay más de un consumidor en la cola.

Tema

Un intercambio de temas enruta un mensaje haciendo coincidir la clave de enrutamiento con un patrón en la clave de enlace.

Routing key == Pattern in binding key.

RabbitMQ utiliza dos caracteres comodín para la coincidencia de patrones *y #. Utilice a *para unir 1 palabra y a #para unir 0 o más palabras.

La figura 5 es una descripción visual de un intercambio de temas. Los mensajes con la clave de enrutamiento logs.errorcoincidirán con los patrones logs.errory logs.*. Por lo tanto, estos mensajes terminarán en las colas only error y all logs.

Mientras que para el productor de la parte inferior izquierda, los mensajes con logs.successclave de enrutamiento coincidirán con los patrones de clave de enlace #success y logs.*. Por lo tanto, estos mensajes terminarán en las colas all logsy only success.

[gif]

Este tipo de intercambio tiene una amplia gama de casos de uso. Se puede utilizar en el patrón de publicación-suscripción, distribuyendo datos relevantes a los procesos de los trabajadores que lo deseen y muchos más.

Encabezamiento

Un encabezado es un tipo particular de intercambio que enruta mensajes según las claves presentes en el encabezado del mensaje. Pasa por alto el atributo clave de enrutamiento del mensaje.

Al crear enlaces para un intercambio de encabezados, es posible enlazar una cola para que coincida con más de un encabezado. En tal caso, RabbitMQ debe saber del productor si debe coincidir con todas o con alguna de estas claves.

Un productor / aplicación puede hacer esto proporcionando una bandera adicional llamada 'x-match'. 'x-match' puede tener valores anyo all. El primero exige que solo un valor coincida, mientras que el segundo exige que todos coincidan.

Acuse de recibo del mensaje

Una vez que un mensaje llega a su destino, el corredor debe eliminar el mensaje de la cola. Es necesario porque puede ocurrir un desbordamiento de cola si sigue acumulando mensajes.

Antes de eliminar cualquier mensaje, el corredor debe tener un acuse de recibo de entrega. Hay dos formas posibles de reconocer la entrega de mensajes.

  1. Reconocimiento automático: una vez que un consumidor recibe el mensaje
  2. Reconocimiento explícito: cuando un consumidor devuelve un reconocimiento

En la mayoría de los casos, se utiliza el reconocimiento explícito, ya que se asegura de que el consumidor haya consumido el mensaje sin ninguna conmutación por error.

Que sigue

RabbitMQ es un producto muy maduro y útil. Este artículo es solo una introducción de alto nivel a RabbitMQ. Simplifiqué los conceptos para proporcionar un punto de referencia para que pueda avanzar más. Visite el sitio web de RabbitMQ para conocer temas más complejos.

Espero que les guste el articulo. No olvide aplaudir (¿o aplaudir?). Siga para leer mis próximas historias. Hasta la próxima, sigue haciendo cola.