A veces, cuando trabajamos con proyectos que requieren mucho asincronismo, como por ejemplo, procesamiento de archivos ó de un gran volumen de data, nos topamos con la tarea de tener que resolver de la mejor manera esto… ¿Pero de que forma? ¿Hago la petición y espero a que me responda… por más que tarde mucho? NO.
Ya voy a enseñarles una manera de resolver esto de manera muy L-Gante, PERO PRIMERO, vamos con un poco de contexto:
Imagínense el caso de un procesador de pagos, si, ese de color azul. Estos tipos de soluciones pueden llegar a necesitar procesar muchísimas requests (o peticiones) por segundo (un número inimaginable) y cada una involucra mucha data y tiempo de procesamiento. El sistema debe recibir la petición, procesarla y responderle de manera rápida y eficiente al usuario, suena sencillo, pero a gran escala es muy difícil.
Para esto, se usa algo que llaman sistemas de colas (queues systems), que lo que hace, básicamente, es que cada petición que entre, la pone en una cola y las va resolviendo de manera asincrónica, mientras tanto, nosotros podemos decirle al usuario que se está procesando la solicitud (o algo así).
Queues (ki-us)
Existen distintos “comportamientos” para un sistema de colas, lo más comunes son LIFO y FIFO.
En términos básicos:
LIFO : Ultimo en entrar, primero en salir
FIFO : Primero en entrar, primero en salir
La elección dependerá mucho del sistema, quizás, para procesar pagos, la mejor opción es FIFO, porque quizás es preferible procesar las que entraron primero por temas de tiempo, pero como dije, depende de lo que necesitemos.
Para implementar esta tecnología disponemos de distintas librerías/frameworks que nos ayudan, voy a recomendar dos:
BullMQ y RabbitMQ
Dependiendo del lenguaje o que tan poderoso es lo que necesitemos podemos elegir uno o el otro.
BullMQ
Es una librería para Node.JS que implementa un sistema de colas utilizando Redis como soporte (necesitamos correr Redis de fondo, sea con Docker ó localmente).
La utilicé para un proyecto y respondió muy bien a lo que necesitaba, la podemos combinar con TypeScript y nos queda algo muy lindo y utilizable.
Link al documento de referencia
Nos permite crear Jobs LIFO y FIFO, priorizar unos antes que otros, programar o demorar la ejecución de algunos y reintentos de jobs fallidos.
RabbitMQ
Si venís del palo de .NET es probable que conozcas esta tecnología o las hayas escuchado nombrar, ya que es muy utilizada ahí.
RabbitMQ es un sistema de colas MUY poderoso, open-source y se puede utilizas con múltiples tecnologías.
Link al documento de referencia
Soporta, entre otras cosas, encolamiento de mensajes, scheduling, múltiples protocolos, etc. Es más poderosa que la opción anterior.
Conclusiones
La idea de implementar un sistema de colas no ahorraría muchos dolores de cabeza a la hora de tener que procesar solicitudes complejas o en cantidad, ¿Cuál sistema usar? Eso dependerá de la complejidad del proyecto. BullMQ está mejor integrado con Node.JS y Nest.JS, pero RabbitMQ es mucho mas potente y nos permite barajar distintas posibilidades.
Recomendación de la semana:
Love, Death & Robots
Todos los capítulos de esta serie son distintos, cada animación e historia son realizados por personas diferentes, donde cada uno nos deja una lección ó una algo divertido. Son todos relatos de Ciencia Ficción, así que ya sabes, si sos fan como yo, es un MUST verlo. Esta disponible en Netflix y hace poco se estrenó la tercer temporada.