¿Qué es un intercambio? Qué son las claves de enrutamiento y los bindings? Cómo se asocian los intercambios y las colas entre sí? Cuándo debo utilizarlos y cómo? Este artículo explica los diferentes tipos de intercambios en RabbitMQ y los escenarios de cómo utilizarlos.
Los mensajes no se publican directamente en una cola. En su lugar, el productor envía los mensajes a un intercambio. Los intercambios son agentes de enrutamiento de mensajes, definidos por el host virtual dentro de RabbitMQ. Un exchange es responsable de enrutar los mensajes a diferentes colas con la ayuda de atributos de cabecera, bindings y claves de enrutamiento.
Abinding es un «enlace» que se configura para enlazar una cola a un exchange.
La clave de enrutamiento es un atributo del mensaje que el intercambio mira cuando decide cómo enrutar el mensaje a las colas (dependiendo del tipo de intercambio).
Los intercambios, las conexiones y las colas pueden configurarse con parámetros como duradero, temporal y eliminación automática al crearse. Los intercambios duraderos sobreviven a los reinicios del servidor y duran hasta que se eliminan explícitamente. Los intercambios temporales existen hasta que RabbitMQ se apaga. Los intercambios autoborrados se eliminan una vez que el último objeto vinculado se desvincula del intercambio.
En RabbitMQ, hay cuatro tipos diferentes de intercambios que enrutan el mensaje de manera diferente utilizando diferentes parámetros y configuraciones de vinculación. Los clientes pueden crear sus propios intercambios o utilizar los intercambios predefinidos que se crean cuando el servidor se inicia por primera vez.
- El productor publica un mensaje en el intercambio.
- El intercambio recibe el mensaje y ahora es responsable del enrutamiento del mensaje.
- Se debe establecer un bind entre la cola y el intercambio. En este caso, tenemos enlaces a dos colas diferentes del intercambio. El intercambio enruta el mensaje a las colas.
- Los mensajes permanecen en la cola hasta que son manejados por un consumidor.
- El consumidor maneja el mensaje.
Si no está familiarizado con RabbitMQ y el encolamiento de mensajes, leaRabbitMQ para principiantes – ¿qué es RabbitMQ?antes de leer sobre los intercambios, las claves de enrutamiento, las cabeceras y los enlaces.
Intercambio directo
Un intercambio directo entrega mensajes a las colas basándose en una clave de enrutamiento de mensajes. La clave de enrutamiento es un atributo del mensaje añadido a la cabecera del mensaje por el productor. Piense en la clave de enrutamiento como una «dirección» que el intercambio está usando para decidir cómo enrutar el mensaje.Un mensaje va a la(s) cola(s) con la clave de enlace que coincide exactamente con la clave de enrutamiento del mensaje.
El tipo de intercambio directo es útil para distinguir los mensajes publicados al mismo intercambio usando un simple identificador de cadena.
El intercambio por defecto que los brokers AMQP deben proporcionar para el intercambio directo es «amq.direct».
Imagina que la cola A (create_pdf_queue) en la imagen de abajo (Figura de intercambio directo) está ligada a un intercambio directo (pdf_events) con el binding keypdf_create.Cuando un nuevo mensaje con clave de enrutamientopdf_createar llega al intercambio directo, el intercambio lo enruta a la cola en la que elbinding_key = routing_key, en el caso a la cola A (create_pdf_queue).
Escenario 1
- Intercambio: pdf_events
- Cola A: create_pdf_queue
- Clave de enlace entre el intercambio (pdf_events) y la cola A (create_pdf_queue): pdf_create
Escenario 2
- Intercambio: pdf_events
- Cola B: pdf_log_queue
- Clave de enlace entre el intercambio (pdf_events) y la cola B (pdf_log_queue): pdf_log
Ejemplo
Ejemplo: Un mensaje con clave de enrutamientopdf_logse envía al intercambiopdf_events.Los mensajes se enrutan a pdf_log_queue porque la clave de enrutamiento (pdf_log) coincide con la clave de enlace (pdf_log).
Si la clave de enrutamiento del mensaje no coincide con ninguna clave de enlace, el mensaje se descarta.
Intercambio por defecto
El intercambio por defecto es un intercambio directo predeclarado sin nombre, normalmente referido por una cadena vacía. Cuando se utiliza el intercambio por defecto, el mensaje se entrega a la cola con un nombre igual a la clave de enrutamiento del mensaje. Cada cola se vincula automáticamente al intercambio predeterminado con una clave de enrutamiento que es igual al nombre de la cola.
Intercambio de temas
Los intercambios de temas enrutan los mensajes a las colas basándose en las coincidencias con comodines entre la clave de enrutamiento y el patrón de enrutamiento, que se especifica en la vinculación de la cola. Los mensajes se dirigen a una o varias colas en función de la coincidencia entre una clave de enrutamiento de mensajes y este patrón.
La clave de enrutamiento debe ser una lista de palabras, delimitada por un punto (.). Los ejemplos sonagreements.usyagreements.eu.stockholmque en este caso identifica los acuerdos que se establecen para una empresa con oficinas en muchos lugares diferentes. Los patrones de enrutamiento pueden contener un asterisco («*») para coincidir con una palabra en una posición específica de la clave de enrutamiento (por ejemplo, un patrón de enrutamiento de «acuerdos.*.*.b.*» sólo coincide con las claves de enrutamiento donde la primera palabra es «acuerdos» y la cuarta palabra es «b»). Un símbolo de libra («#») indica una coincidencia de cero o más palabras (por ejemplo, un patrón de enrutamiento de «acuerdos.eu.berlin.#» coincide con cualquier clave de enrutamiento que comience con «acuerdos.eu.berlin»).
Los consumidores indican qué temas les interesan (como suscribirse a un feed para una etiqueta individual). El consumidor crea una cola y establece un enlace con un patrón de enrutamiento determinado al intercambio. Todos los mensajes con una clave de enrutamiento que coinciden con el patrón de enrutamiento se enrutan a la cola y permanecen allí hasta que el consumidor consume el mensaje.
El intercambio por defecto que los brokers AMQP deben proporcionar para el intercambio de temas es «amq.topic».
Escenario 1
La imagen de la derecha muestra un ejemplo en el que el consumidor A está interesado en todos los acuerdos de Berlín.
- Intercambio: acuerdos
- Cola A: berlin_acuerdos
- Patrón de enrutamiento entre el intercambio (acuerdos) y la cola A (berlin_acuerdos): acuerdos.eu.berlin.#
- Ejemplo de clave de enrutamiento de mensajes que coincide: agreements.eu.berlin y agreements.eu.berlin.headstore
Escenario 2
El consumidor B está interesado en todos los acuerdos.
- Intercambio: acuerdos
- Cola B: todos_acuerdos
- Patrón de enrutamiento entre intercambio (acuerdos) y cola B (todos_acuerdos): acuerdos.#
- Ejemplo de clave de enrutamiento de mensajes que coincide: acuerdos.eu.berlin y acuerdos.us
Escenario 3
El consumidor C está interesado en todos los acuerdos de las centrales europeas.
- Intercambio: acuerdos
- Cola C: headstore_agreements
- Patrón de enrutamiento entre intercambio (acuerdos) y cola C (headstore_agreements): acuerdos.eu.*.headstore
- Ejemplo de claves de enrutamiento de mensajes que coincidirán: agreements.eu.berlin.headstore y agreements.eu.stockholm.headstore
Ejemplo
Un mensaje con clave de enrutamiento agreements.eu.berlinse envía a la bolsaagreements.Los mensajes se dirigen a la colaberlin_agreementsporque el patrón de enrutamiento de «agreements.eu.berlin.#» coincide con las claves de enrutamiento que empiezan por «agreements.eu.berlin». El mensaje también se enruta a la cola acuerdos_todosporque la clave de enrutamiento (acuerdos.eu.berlin) coincide con el patrón de enrutamiento (acuerdos.#).
Intercambio fanout
Un intercambio fanout copia y enruta un mensaje recibido a todas las colas que están vinculadas a él independientemente de las claves de enrutamiento o la coincidencia de patrones como con los intercambios directos y de temas. Las claves proporcionadas simplemente serán ignoradas.
Los intercambios Fanout pueden ser útiles cuando el mismo mensaje necesita ser enviado a una o más colas con consumidores que pueden procesar el mismo mensaje de diferentes maneras.
La imagen de la derecha (Intercambio Fanout) muestra un ejemplo en el que un mensaje recibido por el intercambio es copiado y enrutado a las tres colas vinculadas al intercambio. Podría tratarse de actualizaciones deportivas o meteorológicas que deberían enviarse a cada dispositivo móvil conectado cuando ocurre algo, por ejemplo.
El intercambio por defecto que los brokers AMQP deben proporcionar para el intercambio de temas es «amq.fanout».
Escenario 1
- Intercambio: sport_news
- Cola A: Cola de cliente móvil A
- Enlace: Vinculación entre el intercambio (sport_news) y la cola A (cola de clientes móviles A)
Ejemplo
Se envía un mensaje al intercambioport_news.El mensaje se enruta a todas las colas (cola A, cola B, cola C) porque todas las colas están vinculadas al intercambio. Las claves de enrutamiento proporcionadas se ignoran.
Intercambio de cabeceras
Un intercambio de cabeceras enruta los mensajes basándose en argumentos que contienen cabeceras y valores opcionales. Los intercambios de cabeceras son muy similares a los intercambios de temas, pero enrutan los mensajes basándose en los valores de las cabeceras en lugar de las claves de enrutamiento. Un mensaje coincide si el valor de la cabecera es igual al valor especificado en el enlace.
Un argumento especial llamado «x-match», añadido en el enlace entre el intercambio y la cola, especifica si todas las cabeceras deben coincidir o sólo una. Cualquier cabecera común entre el mensaje y la vinculación cuenta como una coincidencia, o todas las cabeceras referenciadas en la vinculación tienen que estar presentes en el mensaje para que coincida. La propiedad «x-match» puede tener dos valores diferentes: «any» o «all», donde «all» es el valor por defecto. Un valor de «all» significa que todos los pares de cabecera (clave, valor) deben coincidir, mientras que un valor de «any» significa que al menos uno de los pares de cabecera debe coincidir. Las cabeceras pueden construirse utilizando una gama más amplia de tipos de datos, enteros o hash por ejemplo, en lugar de una cadena. El tipo de intercambio de cabeceras (utilizado con el argumento de vinculación «any») es útil para dirigir mensajes que contienen un subconjunto de criterios conocidos (no ordenados).
El intercambio por defecto que los brokers AMQP deben proporcionar para el intercambio de temas es «amq.headers».
Ejemplo
Escenario 3
El mensaje 3 se publica en el intercambio con argumentos de cabecera de (clave = valor): «formato = zip», «tipo = log».
Cabe destacar que en un intercambio de cabecera, el orden real de los pares clave-valor en el mensaje es irrelevante.
Intercambio de cartas muertas
Si no se puede encontrar una cola que coincida con el mensaje, el mensaje se descarta silenciosamente. RabbitMQ proporciona una extensión AMQP conocida como «Dead Letter Exchange», que proporciona la funcionalidad para capturar los mensajes que no son entregables.
Por favor, envíenos un correo electrónico a [email protected] si tiene alguna sugerencia sobre el contenido que falta o cualquier otro comentario.