javascript - Procesos en segundo plano en Node.js
¿Cuál es un buen enfoque para manejar procesos en segundo plano en una aplicación NodeJS?
Escenario: Después de que un usuario publica algo en una aplicación, quiero procesar los datos, solicitar datos adicionales de recursos externos, etc. Todo esto consume bastante tiempo, así que quiero sacarlo del ciclo de solicitud/respuesta. Lo ideal sería tener una cola de trabajos donde puedas colocar rápidamente un trabajo y un demonio o ejecutor de tareas siempre tome el más antiguo y lo procese.
En RoR lo habría hecho con algo como Delayed Job. ¿Cuál es el equivalente de esta API en Node?
Respuesta #1
Si quieres algo ligero, que se ejecute en el mismo proceso que el servidor, recomiendo encarecidamente Bull. Tiene una API simple que permite un control detallado sobre tus colas.
Si estás familiarizado con Resque de Ruby, hay una implementación en Node llamada Node-resque
Bull y Node-resque están todos respaldados por Redis, que es omnipresente entre las colas de trabajo de Node.js. Serían capaces de hacer lo que hace DelayedJob de RoR, es cuestión de características específicas que quieras y tus preferencias de API.
Respuesta #2
Los trabajos en segundo plano no están directamente relacionados con el trabajo de su servicio web, por lo que no deberían estar en el mismo proceso. A medida que escale, el uso de memoria de los trabajos en segundo plano afectará el rendimiento del servicio web. Pero puede ponerlos en el mismo repositorio de código si quiere, lo que tenga más sentido.
Una buena opción para el intercambio de mensajes entre los dos procesos sería Redis, si está bien perder algún mensaje de vez en cuando. Si quieres que "ningún mensaje se quede atrás", necesitarás un intermediario más pesado como Rabbit. Tu proceso de servicio web puede publicar y tu proceso de trabajo en segundo plano puede suscribirse.
No es necesario que los dos procesos se alojen juntos, pueden estar en máquinas virtuales separadas, contenedores de Docker, lo que sea que uses. Esto te permite escalar sin mucho problema.
Respuesta #3
Si estás usando MongoDB, recomiendo Agenda. De esa manera, no se están ejecutando instancias separadas de Redis y características como la programación, la gestión de colas y la interfaz web están todas presentes. La interfaz de Agenda es opcional y, por supuesto, se puede ejecutar por separado.
También recomendaría configurar una abstracción débilmente acoplada entre la lógica de tu aplicación y el sistema de colas/programación para que todo el sistema de procesamiento en segundo plano pueda ser reemplazado si es necesario. En otras palabras, mantén la mayor parte de la lógica de aplicación/procesamiento alejada de tus definiciones de trabajos de Agenda para mantenerlas ligeras.