RabbitMQ: Exchanges

BI Geek / Backend  / RabbitMQ: Exchanges
RabbitMQ: exchanges

RabbitMQ: Exchanges

Anteriormente hablábamos sobre qué es RabbitMQ y su funcionamiento. A continuación vamos a analizar en detalle uno de sus elementos fundamentales: los exchanges.

Los clientes pueden crear sus propios exchanges o utilizar aquellos por defecto, que son creados al iniciar el servidor por primera vez. Existen diferentes tipos de exchange que enrutan el mensaje de manera diferente utilizando diferentes parámetros y configuraciones de bindings.

 

Direct Exchange

Este tipo es útil cuando se desea distinguir los mensajes publicados en el mismo exchange utilizando un identificador simple. Entrega mensajes a colas basándose en las routing keys de los mensajes. La routing key es un atributo añadido al encabezado del mensaje por el productor. Puede verse como una “dirección” que el exchange usa para decidir dónde enrutar el mensaje. Un mensaje va a la/s cola/s cuya binding key coincida exactamente con la routing key del mensaje. Si la routing key no coincide con ninguna binding key, será descartado.

El direct exchange del broker por defecto es “amq.direct”.

Exchange por defecto

Es un direct exchange pre-declarado sin nombre, generalmente referido por la cadena vacía “”. Cuando se usa este exchange, el mensaje será entregado a la cola cuyo nombre sea igual a la routing key del mensaje. Cada cola se enlaza automáticamente al exchange por defecto con una routing key que es igual que el nombre de la cola.

 

Topic Exchange

Este tipo de exchanges enrutan mensajes a colas basadas en coincidencias de comodines entre la routing key y algo llamado routing pattern especificado por el binding de la cola. Los mensajes se enrutan a una o varias colas en función de si hay coincidencia entre una routing key de mensaje y este patrón.

La routing key debe ser una lista de palabras, delimitada por un punto (.). Los routing pattern pueden contener un asterisco (“*“) para hacer coincidir una palabra en una posición específica de la routing key (por ejemplo, un patrón de enrutamiento de “a. *. *. b.*” sólo coincidirá con routing keys donde la primera palabra es “a” y la cuarta palabra es “b“). Un símbolo numeral (“#”) indica coincidencia en cero o más palabras (por ejemplo, un routing pattern de “a.b.c.#” coincide con cualquier routing key que comience por “a.b.c“).

Los consumidores indican en qué topics están interesados. El consumidor crea una cola y establece un binding con un routing pattern dado para el exchange. Todos los mensajes con una routing key que coincida con el routing pattern se enrutarán a la cola y permanecerán allí hasta que el consumidor consuma el mensaje.

El topic exchange por defecto es “amq.topic”.

 

Fanout Exchange

Este exchange copia y enruta un mensaje recibido a todas las colas que están vinculadas a él, independientemente de las routing keys o la coincidencia de patrones como pasaba con los exchanges anteriores. Las keys proporcionadas simplemente serán ignoradas.

Este tipo de exchanges pueden ser útiles cuando el mismo mensaje debe enviarse a una o más colas con consumidores que pueden procesar el mismo mensaje de diferentes maneras.

El fanout exchange por defecto es “amq.fanout”.

 

Headers Exchange

Estos exchanges son muy similares a los topic exchanges, pero se enruta en función de los valores de cabeceras en lugar de las routing key. Un mensaje se considera coincidente si el valor de la cabecera es igual al valor especificado en el binding.

Un argumento especial llamado ‘x-match’ indica si deben coincidir todas las cabeceras o sólo una. La propiedad ‘x-match’ puede tener dos valores diferentes: ‘any’ o ‘all’. El valor ‘all’, que es el valor predeterminado, significa que todos los pares de cabeceras (clave, valor) deben coincidir, mientras que el valor ‘any’ significa que al menos uno de los pares de cabeceras debe coincidir. Este tipo de exchange (usado con ‘any’) es útil para direccionar mensajes que pueden contener un subconjunto (desordenado) de criterios conocidos.

El headers exchange proporcionado por defecto por el broker es “amq.headers”.

 

 

Dead Letter Exchange

Si no se puede encontrar una cola coincidente para un mensaje, el mensaje se eliminará silenciosamente. RabbitMQ proporciona una extensión AMQP conocida como ‘Dead Letter Exchange’ que proporciona funcionalidad para capturar mensajes que no se pueden entregar.

 

Referencias

www.rabbitmq.com