Comprendiendo las colas con RabbitMQ (II)
¡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!