Comprendiendo las colas con RabbitMQ (II)

Alfredo Bautista Santos
4 min readMar 12, 2020

--

¡Hola a todos! En esta segunda parte nos metemos de lleno en el código

Nuestro wrapper para la conexión

En este caso he decido tener la conexión a RabbitMQ en un fichero común rabbit.js

Las funciones más destacables son la encapsulación de los metodos de conectarse y crear un canal utilizando promesas:

Con esto conseguimos tener un método de arranque mucho mas simple y limpio

Donde nos devolverá el canal que debemos usar para comunicarnos con el servidor.

Dentro de este fichero también podemos encapsular las funciones para hablar con la cola

Únicamente debemos pasarle el canal por el que se debe comunicar y los datos que debe transferir, abstrayendo a los clientes de la cola.

Nuestro Endpoint

Crearemos un servidor web utilizando express para hacerlo más sencillo, como Middlewares utilizaremos express.json y CORS

En nuestro servidor web utilizamos la función de start para que cuando la conexión este lista levantemos el servidor donde tendremos dos endpoints:

  • /status nos devolverá si hay un canal de comunicación
  • /createKey mandará la orden a la cola de comenzar a crear la llave

Hay un punto de fallo, no se está comprobando el body del request por lo que al estar mal formado podría provocar una excepción

Generador de llaves

Nuestro generador de llave hará uso del paquete crypto de nodeJS para utilizar la función generateKeyPair

Nuestro servidor únicamente se conectará al RabbitMQ y esperará a los mensajes que le lleguen de la cola y generará una llave, en este caso esperamos a que la llave esté generada, le introducimos al objeto el email del cliente y lo enviamos a la cola para el envío de correo.

channel.ack nos permite comunicar a RabbitMQ que ese mensaje ha sido procesado correctamente y puede eliminarlo de la cola

Envío de correo

Nuestro encargado de enviar los correos tiene creada una conexión con el servidor de correos y una función con un email por defecto donde unicamente le pasamos la dirección donde debe enviarlo y las llaves como fichero adjunto. Hacemos uso de nodemailer

Enviamos el correo con la llaves y el email y esperamos a que haya una respuesta correcta del servidor de correo para poder eliminar este mensaje de la cola y confirmar que ha sido procesado correctamente.

Cliente

Nuestro cliente será una página donde tendremos una lista de tipos de llaves disponibles y un email a donde enviar el resultado. Después de pulsar el envío hacemos una petición a nuestro endPoint con los datos de los inputs

Despliegue del proyecto

Para poder despegar este proyecto, que contiene mínimo 5 servidores, haremos uso de docker-compose, crearemos un Dockerfile con la configuración de nuestros servidores e indicaremos que depende de nuestro RabbitMQ para poder funcionar, en el siguiente enlace podéis ver el fichero docker-compose.yaml completo

Resumen

Como conclusión podemos ver como el uso de un sistema de cola nos permite simplificar nuestra estructura delegando en pequeños servidores cada función de nuestro sistema. Todos los servidores son muy parecidos entre si ya que únicamente reciben información y cada uno lo procesa y lo devuelve sin conocer demás configuración o componentes del proyecto.

En mi repositorio podéis ver toda la estructura del proyecto y jugar con él https://github.com/alfredobs97/RabbitMQ

¡Un saludo y hasta la próxima!

--

--

Alfredo Bautista Santos
Alfredo Bautista Santos

Written by Alfredo Bautista Santos

Sysadmin and web developer. Co-organizer of GDGMarbella & FlutterConf in Marbella, Spain. Flutter enthusiastic.

Responses (1)