2012-06-16 10 views
5

¿Cómo puedo guardar el estado de la aplicación para una aplicación node.js que consiste principalmente en una solicitud HTTP?Guardando estado de la aplicación en Node.js

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, el script 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 cola de eventos gigante, todas las solicitudes http y sus callbacks se ponen en esa cola (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.

¿Existe alguna forma 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.

+0

Lo que quiere es una * cola de trabajos persistente *. Hay muchos de ellos; uno bastante bueno es [Kue] (http://learnboost.github.com/kue/) (construir en redis). –

+0

Creo que tienes toda la razón. Kue es bastante brillante.Así que básicamente en el productor estaría leyendo mi archivo de datos y en el consumidor podría agregar/actualizar cada producto. Entonces, cada producto sería un trabajo separado. –

Respuesta

3

no estoy seguro de lo que quiere decir cuando se dice

Sé que Node.js funciona como un gigante evento de cola, todas las peticiones HTTP y sus devoluciones de llamada te pone en esa cola (junto con algunos otros eventos). Esto lo convierte en un objetivo principal para guardar el estado de la ejecución actual

Puede comentarlo o exponerlo si lo considera relevante para la respuesta.

Dicho esto, si usted está buscando simplemente un mecanismo de persistencia para esta tarea en particular, me podría recomendar Redis, por varias razones:

  • Permite atomic operations 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 usando INCR num_requests_made, y se garantiza que será atómica, lo que facilita la escala a varios trabajadores.
  • Tiene several data types que podría ser útil 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 pub/sub mechanisms que le permitiría comunicarse fácilmente entre varias instancias del programa.

Si esto suena interesante o útil y usted no está familiarizado con Redis, le recomiendo probar el interactive tutorial, que le introduce en unos pocos tipos de datos y comandos para ellos. Otra buena pieza de material de lectura es A fifteen minute introduction to Redis data types.

+0

Entonces, Redis parece muy similar a MongoDB, con la excepción de que Mongo no tiene características de Pub/Sub. La distribución no es tan importante para mí para este proyecto como lo es la velocidad de desarrollo. Ya he trabajado con Mongo en Node.js (Mongoose). Entonces, creo que es mejor seguir con esto, a menos que pienses lo contrario. También estaba hablando sobre el bucle par en Node.js cuando mencioné la cola y cómo todo se procesa en orden y se representa internamente como una o más colas. –

+0

Redis se centra más en la atomicidad y la velocidad, pero sí, si conoces a Mongo definitivamente puedes hacer que funcione para esta aplicación y usar alguna otra herramienta de pub/sub si alguna vez quisiste (ZeroMQ, RabbitMQ, etc.), aunque yo sí piense que Redis se adapta mejor a menos que esté haciendo un almacenamiento de documentos real (y Kue está respaldado por Redis de todos modos). En cuanto a la cola de eventos, creo que veo a lo que conduces, pero no estoy seguro de cómo llegar y guardar el estado sin rodar algo personalizado. –

+0

Sí, gracias Brandon :). Ambas respuestas realmente me ayudaron a tener un mejor sentido de la orientación. Abriré una pregunta de seguimiento. Si usted o @dan-d pueden agregar una respuesta que describa cómo usar Kue para hacer algo similar, lo marcaré como la respuesta, gracias :). –

Cuestiones relacionadas