Implementación de brokers de mensajería distribuidos con RabbitMQ
“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”.
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 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.
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.
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.
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.