2012-06-16 18 views
5

Come posso salvare lo stato dell'applicazione per un nodo.js Applicazione costituita principalmente da richiesta HTTP?Salvataggio dello stato dell'applicazione in Node.js

Ho uno script in Node.JS che funziona con un'API RESTful per importare un numero elevato (10.000+) di prodotti in un'applicazione E-Commerce. L'API ha un limite sulla quantità di richieste che possono essere fatte e stiamo fissando per rispolverare quel limite. In una precedente esecuzione lo script è terminato con uno Error: connect ETIMEDOUT probabilmente a causa del superamento dei limiti API. Mi piacerebbe essere in grado di provare a connettersi 5 volte e se non riesce a riprendere dopo un'ora quando il limite è stato ripristinato.

Sarebbe anche utile salvare i progressi in caso di incidente (interruzione di corrente, arresti anomali della rete, ecc.). Ed essere in grado di riprendere la sceneggiatura dal punto in cui era stata interrotta.

So che Node.js funziona come una gigantesca coda di eventi, tutte le richieste http e i loro callback vengono inseriti in quella coda (insieme ad altri eventi). Questo lo rende un obiettivo primario per il salvataggio dello stato di esecuzione corrente. Altri piacevoli (non del tutto necessari per questo progetto) sarebbero stati in grado di distribuire il lavoro tra più macchine su reti diverse per aumentare il throughput.

Quindi c'è un modo esistente per farlo? Un quadro forse? O devo implementarlo io stesso, in tal caso, qualsiasi risorsa utile su come questo può essere fatto sarebbe apprezzato.

+0

Quello che vuoi è una * coda di lavoro permanente *. Ce ne sono molti; uno piuttosto bello è [Kue] (http://learnboost.github.com/kue/) (build su redis). –

+0

Penso che tu abbia assolutamente ragione. Kue è piuttosto brillante.Quindi, fondamentalmente nel produttore, leggerei il mio file di dati e nel consumatore potrei aggiungere/aggiornare ciascun prodotto. Quindi ogni prodotto sarebbe un lavoro separato. –

risposta

3

io non sono sicuro di cosa si intende quando si dice

So che Node.js funziona come un gigantesco evento-coda, tutte le richieste HTTP e le loro funzioni di callback vengono messe in quella coda (insieme ad alcuni altri eventi). Questo lo rende un obiettivo primario per il salvataggio dello stato di esecuzione corrente

Non esitate a commentare o spiegare su questo se lo trovate rilevante per la risposta.

Detto questo, se siete semplicemente alla ricerca di un meccanismo di persistenza per questo compito particolare, potrebbe raccomandare Redis, per alcuni motivi:

  • Permette atomic operations su molti tipi di dati; ad esempio, se in Redis era presente una voce denominata num_requests_made che rappresentava il numero di richieste inoltrate, è possibile incrementare facilmente questo numero in Redis utilizzando INCR num_requests_made ed è garantito che sia atomico, rendendo più semplice il ridimensionamento su più worker.
  • Ha several data types che potrebbe rivelarsi utile per le vostre esigenze; ad esempio, una semplice stringa potrebbe rappresentare il numero di richieste API effettuate durante un certo periodo di tempo (come nel punto precedente); è possibile memorizzare i dettagli sulla richiesta API non riuscita che deve essere nuovamente inviata in un elenco; ecc.
  • Fornisce pub/sub mechanisms che consente di comunicare facilmente tra più istanze del programma.

Se questo sembra interessante o utile e non siete già familiarità con Redis, consiglio vivamente di provare il interactive tutorial, che introduce ad alcuni tipi di dati e comandi per loro. Un altro buon materiale di lettura è A fifteen minute introduction to Redis data types.

+0

Quindi Redis sembra molto simile a MongoDB con l'eccezione che Mongo non ha funzionalità Pub/Sub. La distribuzione non è un grosso problema per me per questo progetto poiché la velocità di sviluppo è. Ho già lavorato con Mongo in Node.js (Mongoose). Quindi penso che potrebbe essere meglio attenersi ad esso, a meno che tu non pensi diversamente? Inoltre stavo parlando del ciclo pari in Node.js quando ho menzionato la coda e come tutto viene elaborato in ordine e internamente rappresentato come una o più code. –

+0

Redis si concentra di più sull'atomicità e la velocità, ma sì, se conosci Mongo puoi sicuramente farlo funzionare per questa applicazione e usare qualche altro strumento pub/sub se vuoi (ZeroMQ, RabbitMQ, ecc.), Anche se lo faccio pensa che Redis sia più adatto a meno che tu non stia facendo un vero e proprio deposito di documenti (e Kue è comunque supportato da Redis). Per quanto riguarda la coda degli eventi, penso di vedere cosa stai guidando, ma non sono sicuro di come avresti raggiunto e salvato lo stato senza far rotolare qualcosa di personalizzato. –

+0

Sì grazie Brandon :). Entrambe le risposte mi hanno davvero aiutato ad ottenere un migliore senso dell'orientamento. Aprirò una domanda di follow-up. Se tu o @ dan-d potete aggiungere una risposta che descrive come usare Kue per fare qualcosa di simile, la contrassegnerò come risposta, grazie :). –

Problemi correlati