2013-07-30 21 views
5

Quindi sto iniziando a utilizzare node.js per un progetto che sto facendo.Processo figlio per attività intensiva CPU?

Quando un client effettua una richiesta, il mio server node.js recupera da un altro server un json e quindi lo riformatta in un nuovo json che viene servito a questo client. Tuttavia, il json che il server dei nodi ha ricevuto dall'altro server può potenzialmente essere abbastanza grande e quindi il "massaggio" dei dati è piuttosto intenso.

Ho letto da poche ore come node.js non è ottimo per le attività di cpu e la risposta principale che ho visto è quella di generare un processo figlio (in pratica un file .js che attraversa un diversa istanza di nodo) che si occupa di tutte le attività intensive della cpu che potrebbero bloccare il ciclo dell'evento principale.

Quindi diciamo che ho 20.000 utenti simultanei, il che significherebbe che genererà 20.000 lavori di livello OS poiché sta eseguendo questi processi figlio.

Ti sembra una buona idea? (Un server Web diverso crea solo 20.000 thread sullo stesso processo.)

Non sono sicuro se dovrei eseguire un processo figlio. Ma ho bisogno di fare un compito intensivo non blocco della CPU. Qualche idea su cosa dovrei fare?

risposta

-2

Le persone che dicono che non sanno come progettare soluzioni.

NodeJS è esattamente quello che dice, è un nodo e deve essere trattato come tale.

Nel tuo esempio, l'istanza del nodo si connette a un API esterno e afferra json per elaborare e inviare indietro.

cioè 1. Ottenere // server.com/getJSON 2. Elaborare il JSON 3. Messaggio // server.com/postJSON

Allora, cosa fai? Chiedetevi che il tempo è un problema? se sì, allora il nodo non è la soluzione Tuttavia se sei più interessato alla potenza di elaborazione grezza quindi invece di 1 richiesta fatta in 4 secondi

Sei interessato a 200 richieste che finiscono in 10 secondi, ma ogni individuo ne prende il pieno 10 secondi.

Diagnostica per quanto tempo il tuo JSON deve eseguire il massaggio, se è inferiore a 1 secondo. Basta eseguire 4 istanze di nodo invece di 1.

Tuttavia se è più complesso di quello, spezzare il json in segmenti da elaborare. E utilizzare i callback asincroni per elaborare ogni segmento

process.nextTick (function (doProcess (Segment1); process.nextTick (function() {doProcess (segment2)

ogni doProcess chiama il prossimo doProcess

Nodo js saranno negoziate tempo tra le richieste.

ora prendere questa soluzione e la scala troppo 4 istanze di nodo per server, e 2-5 server

e improvvisamente si dispone di una solutio estremamente scalabile e conveniente n.

+0

segmentare un file JSON, creare 4 istanze nodo per server e 2-5 server? e ora ho una soluzione estremamente scalabile ed economica? .. mago. – foreyez

+0

È più semplice di quello che sembra. Questo 2-5 server è per un'enorme quantità di throughput. Sono anni in linea da dove sei. NodeJS è stato creato per essere usato come un nodo in un sistema, è il minimo indispensabile per fare tutto ciò che vuoi. Non è una soluzione pre-scalata alla scalabilità, tuttavia è possibile progettare un ottimo sistema utilizzandolo. – miketheprogrammer

8

Il motore Javascript V8 che alimenta il nodo è in realtà pretty fast comparedto manyserver-side languages.

Il problema è che il modello di evento di Node è molto simile a cooperative multitasking - le operazioni di una particolare richiesta continueranno fino a quando non cede il controllo al ciclo di eventi di Javascript, quindi attività CPU elevate bloccheranno il ciclo (ovvero una selezione casuale di gli utenti otterranno prestazioni perfette e un altro gruppo otterrà dei timeout, invece delle prestazioni che degradano con garbo con il carico).

Così, per le attività ad alta intensità di CPU, ci sono diverse soluzioni che è possibile utilizzare:

  1. Si può trattare il codice come una pipeline di elaborazione, e semplicemente process.nextTick tra i pezzi significativi di trattamento per ridurre la latenza media (pur aumentando il minimo assoluto), fondamentalmente essendo più "cooperativi" e non permettendo a nessuno di richiedere la CPU per molto tempo.
  2. Se il lavoro è puro Javascript (non è necessario alcun modulo Node), è possibile utilizzare la libreria node-webworker-threads per scaricare il lavoro a carico della CPU sui thread. Tuttavia, generare costantemente nuovi thread è probabilmente una cattiva idea, quindi probabilmente vorrai un pool di thread su cui accodare il lavoro da cui questi worker estraggono e rimettono in coda. In tal caso ...
  3. Si crea un pool di processori figlio e si utilizza lo stesso meccanismo di accodamento, in cui la dimensione del pool dipende dalla% di richieste che richiedono il percorso intensivo della CPU, il numero totale di richieste e il tollerabile aumento della latenza consentito per queste richieste.
Problemi correlati