javascript - Guardar el estado de la aplicación en Node.js
network-programming distributed (1)
¿Cómo puedo guardar el estado de la aplicación para una aplicación node.js que consiste principalmente en una solicitud HTTP?
Tengo un script en Node.JS que funciona con una API RESTful para importar un gran número (más de 10.000) de productos en una aplicación de E-Commerce. La API tiene un límite en la cantidad de solicitudes que se pueden realizar y estamos mirando para repasar ese límite. En una ejecución anterior, la secuencia de comandos salió con un Error: connect ETIMEDOUT
probablemente debido a exceder los límites de la API. Me gustaría poder conectarme 5 veces y, si eso falla, reanudarlo después de una hora cuando se restableció el límite.
También sería beneficioso guardar el progreso en caso de caída (caída de energía, bloqueo de la red, etc.). Y ser capaz de reanudar el guión desde el punto que dejó.
Sé que Node.js funciona como una gigantesca cola de eventos, todas las solicitudes http y sus callbacks se ponen en esa fila (junto con algunos otros eventos). Esto lo convierte en un objetivo principal para guardar el estado de la ejecución actual. Otro placer (no totalmente necesario para este proyecto) sería poder distribuir el trabajo entre varias máquinas en diferentes redes para aumentar el rendimiento.
Entonces, ¿hay una forma existente de hacerlo? Un marco tal vez? O debo implementarlo yo mismo, en ese caso, se agradecerán todos los recursos útiles sobre cómo se puede hacer esto.
No estoy seguro de lo que quieres decir cuando dices
Sé que Node.js funciona como una gigantesca cola de eventos, todas las solicitudes http y sus callbacks se ponen en esa fila (junto con algunos otros eventos). Esto lo convierte en un objetivo principal para guardar el estado de ejecución actual
Por favor, siéntase libre de comentar o exponer sobre esto si lo encuentra relevante para la respuesta.
Dicho esto, si simplemente está buscando un mecanismo de persistencia para esta tarea en particular, podría recomendar Redis , por algunas razones:
- Permite operaciones atómicas en muchos tipos de datos; por ejemplo, si tiene una entrada en Redis llamada
num_requests_made
que representa el número de solicitudes realizadas, puede incrementar este número fácilmente en Redis usandoINCR num_requests_made
, y se garantiza que será atómica, lo que facilita la escala a múltiples trabajadores. - Tiene varios tipos de datos que podrían ser útiles para sus necesidades; por ejemplo, una cadena simple podría representar el número de solicitudes API realizadas durante un cierto período de tiempo (como en el punto anterior); es posible que almacene detalles sobre la solicitud API fallida que deben volver a enviarse en una lista; etc.
- Proporciona mecanismos de pub / sub que le permiten comunicarse fácilmente entre varias instancias del programa.
Si esto le parece interesante o útil y aún no está familiarizado con Redis, le recomiendo que pruebe el tutorial interactivo , que le presenta algunos tipos de datos y comandos para ellos. Otra buena pieza de material de lectura es Una introducción de quince minutos a los tipos de datos de Redis .