2013-06-17 15 views
13

Scusate la mia ignoranza, sto imparando attualmente come utilizzare Node proveniente da uno sfondo PHP in cui non ho davvero avuto alcuna interazione con Apache o con la gestione del server. Sto usando Heroku per ospitare i miei progetti Node, spinti direttamente dall'IDE Cloud9.Elaborazione figlio Node.js su Heroku con Dyno singolo

Da quello che ho letto, un dump di Heroku è un singolo processo web, l'acquisto di dinamiche aggiuntive ti consentirà di gestire più traffico in arrivo perché aumentando i dinhi aumenterai la dimensione della quantità di richieste che puoi gestire con in qualsiasi momento.

So che il nodo è un sistema a thread singolo che gestisce le richieste una per una, consentendo di generare processi figlio per tutto ciò che potrebbe richiedere del tempo (come richieste di database, elaborazione di file, ecc.).

Quindi cosa succede in Heroku se si genera un processo figlio con un singolo dino? Non ha bisogno di un altro banco su cui lavorare? Sicuramente se Node sta eseguendo un singolo processo e ho solo un processo disponibile nel mio singolo dyno, qualsiasi processo aggiuntivo dovrà essere gestito da quello stesso?

Oppure ho tutto sbagliato?

+1

Non è necessario avviare processi di nodo separati per fare richieste di database e l'elaborazione dei file avviene in modo asincrono ... non doverlo fare è il vantaggio di nodejs. Se stai generando un numero non deterministico di "thread/processi" di lavoro, stai assolutamente utilizzando NodeJS in modo errato. E con quella risposta, credo che dovresti essere in grado di rispondere alla tua stessa domanda. Se desideri maggiori dettagli, fammi sapere! – ChrisCM

+0

Grazie per la risposta, Chris. Potrei non essermi spiegato correttamente - la mia conoscenza del Nodo al momento non si estende troppo al di fuori di quella dettagliata nel libro Node Beginner, in cui un esempio usa 'var exec = require (" child_process "). Exec;' e poi usa la funzione 'exec' nell'esecuzione di una costosa operazione shell per dimostrare il codice non bloccante. Quindi, come ho capito, in questo esempio l'operazione di shell viene rinviata a un altro processo in modo che il processo principale possa continuare a ricevere nuove richieste e successivamente ricevere una richiamata per visualizzare la risposta della richiesta iniziale. – mibbler

+0

Ho inviato i miei commenti come risposta. – ChrisCM

risposta

7

La tua comprensione di exec è approssimativamente corretta, la mia preoccupazione è che la stai usando quando non hai bisogno di farlo ... Nella tua domanda menzioni solo i tipi di I/O di eeprations, che il nodo gestisce in modo molto efficiente all'interno è il modello di eventi a thread singolo di fare le cose. Pur essendo a thread singolo, il modello di eventi consente l'esecuzione del codice senza bloccare il ciclo dell'evento principale (a meno che non si eseguano operazioni MOLTO CPU intensive ..., di quali richieste Database e di elaborazione file non sono incluse) Detto questo, si dovrebbe Non è necessario lanciare un addizionale banco per fare quello che vuoi.

Pensa a un banco di prova come un singolo processore. Qualunque cosa tu possa fare su una macchina che ha un singolo processore puoi farlo sul tuo banco di prova, senza costi aggiuntivi o dinamiche create. Tuttavia, un banco di prova ha una memoria considerevolmente inferiore rispetto a un singolo processore del core processor. Quindi, qualsiasi sottoprocesso che si desidera generare non ha bisogno di un altro banco di prova per l'esecuzione. Ogni processo di master che desideri eseguire, avrà bisogno del suo banco di prova.

var http = require('http'); 

http.createServer(function (req, res) { 

    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.end('An amount of data that will take 1 second to send');//This will not block the event loop 
}).listen(1337, '127.0.0.1'); 

var http = require('http'); 
http.createServer(function (req, res) { 

    while(true) { 
     break after 1 second; //this will block the event loop for 1 second 
    } 

    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.end('Hello World\n'); 
}).listen(1337, '127.0.0.1'); 

Considerare i due server nel codice sopra. Entrambi i server hanno circa un secondo di lavoro da fare. Il primo esempio può servire migliaia di richieste al secondo, il secondo solo 1. Invio di dati, richieste di database, richieste server, file IO, ecc ... tutto si comporterebbe come il primo esempio ... pochissime cose in Node si comportano come il secondo esempio. Se si dispone di qualcosa che rientra nel secondo esempio, è preferibile scegliere una lingua diversa, piuttosto che provare a forzare il nodo a funzionare per un caso d'uso per cui è stato progettato molto male.

+0

Oh, ok. Quindi sembra che stia scambiando un singolo processo con un singolo thread ..?Sai se esiste un limite alla quantità di processi che posso eseguire su un banco di prova? – mibbler

+0

Mi piacerebbe fortemente scoraggiarvi dal lanciare un'abbondanza di processi. Se si ritiene che il processo del nodo richieda l'avvio di più di 1 o 2 operatori per un processore, è probabile che non si utilizzi il nodo correttamente o il caso d'uso sarebbe più adatto per un diverso linguaggio di programmazione. Scriverò un piccolo codice demo per te. Detto questo, il numero è probabilmente limitato solo da qualunque sistema operativo che heroku sta usando, non da eventuali limitazioni che desiderano piazzare su di te. – ChrisCM

+1

Quindi la tua vera limitazione è probabilmente RAM. Dynos può supportare 512 MB di RAM (l'ultima volta che ho controllato, che era un po 'di tempo fa). Quando forzi un processo, la memoria di quel processo viene con te, copiata nel suo ambiente. Quindi, supponendo un processo da 100 MB, è possibile generare 5 processi di questo tipo. (La matematica qui non è esattamente esatta, questa è solo una panoramica, l'analisi comparativa potrebbe essere in ordine) – ChrisCM

Problemi correlati