Implementación de brokers de mensajería distribuidos con RabbitMQ

Juan G Gomez
Bancolombia Tech
Published in
5 min readNov 5, 2021

“Un bróker de mensajería es un patrón arquitectónico para la validación, la transformación y el enrutamiento de mensajes. Es un mecanismo mediador de la comunicación entre aplicaciones, permitiendo minimizar el grado de conocimiento mutuo que estas aplicaciones necesitan tener, para poder intercambiar mensajes, implementando así efectivamente su desacoplamiento”.

RabbitMQ es uno de los broker de mensajería open source más usado.

Existen múltiples razones o casos de uso por los cuales son útiles los bróker de mensajería distribuidos:

· Recopilar mensajes de varios bróker a un bróker central.

· Distribuir la carga de una cola a varios bróker.

· Ejecutar una migración a otro bróker sin detener a todos los productores o consumidores mientras se hace.

· Difundir mensajes a múltiples bróker aislados.

En el contexto Bancolombia tenemos un caso de uso en el cual un Módulo Administrativo envía mensajes a diferentes Canales haciendo uso de patrones de mensajería.

Para materializar el patrón de eventos desde el Módulo Administrativo a los diferentes Canales se hace uso de un bróker de RabbitMQ centralizado.

Para garantizar independencia y aislamiento de fallos entre los diferentes Canales y el Módulo Administrativo, proponemos hacer uso de la estrategia de federación en la cual tanto el Módulo Administrativo como los Canales gobiernan su propio bróker de RabbitMQ.

Implementando estrategia de Federación con RabbitMQ

RabbitMQ nos permite implementar estrategias de bróker distribuidos haciendo uso del plugin de federación. Este plugin provee:

· Federación a nivel exchange.

· Federación a nivel de colas.

El plugin de federación de RabbitMQ contempla dos conceptos básicos:

· Upstream: Es el bróker donde el mensaje ha sido publicado originalmente.

· Downstream: Es el bróker al cual serán transmitidos los mensajes publicados originalmente en otro bróker (upstream).

El funcionamiento básico de la federación consiste en enrutar un mensaje que es publicado en un broker upstream a un broker downstream.

Es importante anotar que la capacidad de federación de RabbitMQ permite que varios downstream puedan estar enlazados a distintos upstream.

Escenario 1. Un downstream conectado a un único upstream
Escenario 2. Varios downstream conectados a un único upstream
Escenario 3. Un downstream conectados a varios upstream
Escenario 4. Varios downstream conectados a varios upstream

Federación a nivel de exchange

Cuando se usa RabbitMQ, los mensajes son publicados en un exchange el cual los enruta a una o varias colas. Con la federación de exchanges, es posible hacer que RabbitMQ distribuya esos mensajes a cualquier otro bróker, es decir, los mensajes que lleguen a los exchanges federados también serán reenviados a los bróker downstream.

La configuración de la conexión y políticas de federación se hacen siempre en el downstream, miremos un ejemplo:

Pre-requisitos:

· Conocimientos básicos en RabbitMQ.

· Docker desktop instalado.

1. Instalación RabbitMQ local (Upstream y Downstream)

# For upstream

docker run -it — rm — name rabbitmq_upstream -p 5672:5672 -p 15672:15672 rabbitmq:3.9-management

# For downstream

docker run -it — rm — name rabbitmq_downstream -p 3672:5672 -p 35672:15672 rabbitmq:3.9-management

Es importante que expongamos cada bróker por puertos diferentes.

2. Instalación plugin de federación

Para instalar el plugin de federación ingresamos al bash de cada contenedor haciendo uso del siguiente comando:

docker exec -it rabbitmq_upstream /bin/sh

Una vez dentro del bash ejecutamos los siguientes comandos:

rabbitmq-plugins enable rabbitmq_federationrabbitmq-plugins enable rabbitmq_federation_management

Y repetimos el procedimiento para el downstream

Para verificar la correcta instalación del plugin podemos ingresar a la consola de RabbitMQ y en la opción admin validar que se encuentren disponibles las opciones de federación.

En el menú de la derecha debemos observar las opciones Federation Status y Federation Upstreams

3. Configuración upstream

Ingresamos a la consola administrativa del downstream y en la opción Federation Upstreams agregamos los datos del broker para establecer el enlace.

Se asigna un nombre al upstream y se otorga la cadena de conexión o URI. Esta URI responde a la estructura protocolo:// usuario:password@servidor:puerto/virtual-host

· Protocolo: amqp o amqps.

· Usuario: usuario creado existente en el broker upstream.

· Password: contraseña del usuario del upstream.

· Servidor: host o dirección ip del servidor donde corre el upstream.

· Puerto: puerto para conexión al upstream mediando amqp (5672 por defecto).

· Virtual Host: virtual host del upstream donde se encuentra el exchange a federar.

4. Configuración política federación exchange

Una vez configuramos el upstream, procedemos a crear la política de federación en la cual se define el exchange.

Ingresamos a la opción Admin/Policies.

· Se asigna un nombre a la política.

· Mediante una expresión regular se indica al pattern y los exchanges que se van a federar con la política.

· En Apply to se indica que la política se aplicará a nivel de exchanges.

· Finalmente con el Definition federation-upstream-set=all se indica a cuáles upstream definidos en el broker será aplicada la política.

Una vez creada la política, validamos en la opción “Admin/Federation Status” el estado del enlace entre el Downstream y el Upstream.

Una vez configurado el upstream y la política de federación, es posible enviar un mensaje al exchange del upstream y propagarlo al mismo exchange en el downstream y las respectivas colas que tenga enlazadas.

Transmisión de mensaje entre brokers a través de Federación.

Conclusiones

En este artículo realizamos una breve introducción a la estrategia de federación con RabbitMQ. Revisamos cómo configurar una federación de RabbitMQ a nivel de exchange y una prueba de pasar un mensaje directamente de un bróker de RabbitMQ a otro.

RabbitMQ distribuido mediante federación es una estrategia fácil de implementar que nos permite habilitar diferentes casos de uso como distribuir carga entre diferentes bróker o ejecutar migraciones de los mismos con un alto grado de desacople y flexibilidad.

--

--