2012-03-22 11 views
5

Così sto solo iniziando a tuffarsi nel nodo e capisco che l'I/O è non bloccante e che il ciclo degli eventi sta bloccando, ma quello che mi chiedo è:Un server Node.js può accettare richieste in entrata mentre la coda eventi è bloccata?

Se si dispone di codice che sta bloccando la coda degli eventi, il server sarà ancora in grado di posizionare le richieste in arrivo alla fine della coda o tutte scadranno/rimbalzeranno?

+0

Questa è una buona domanda a qualcuno che abbia familiarità con gli interni di Node.js può rispondere. I * sospetto * che la libreria C++ dell'oggetto '' http'' stia gestendo l'I/O effettivo in un thread separato, quindi * dovrebbe * essere in coda sulle richieste (forse non aggiungere effettivamente gli eventi alla coda finché non viene dato il ciclo degli eventi controllo di nuovo e gli eventi in sospeso vengono interpretati e aggiunti?) –

+0

Da quello che ho letto so che l'I/O è asincrono, ma dopo aver brevemente cercato su google l'interno di come funziona la programmazione asincrona, leggo che async non genera nuovi thread? È vero? –

+0

"la programmazione asincrona promuove l'uso della stessa thread per elaborare più richieste, in modo sequenziale, ma senza richiedere il blocco del thread, come vedremo in seguito le operazioni eseguite dalle richieste verranno eseguite" a pezzi "." http: // www. theserverside.com/discussions/thread.tss?thread_id=61693 –

risposta

2

Questo non ha nulla a che fare con il nodo, o almeno questa discussione finora introduce alcuna prova di comportamento del nodo.

Lo stack TCP stesso accetta la connessione in una propria coda senza l'aiuto del programma che sta utilizzando il socket di accettazione. Se la coda si riempie, vengono fatte ulteriori richieste di attesa fino a quando la coda di connessione TCP non ha spazio. Tali connessioni "inaccettabili" non vengono rimbalzate, anche se potrebbero scadere se le cose si ritardano veramente.

La linea di fondo, tuttavia, è che la risposta di esempio, utilizzando curl, non prova nulla oltre il comportamento di base dello stack TCP, ma che probabilmente non importa, perché la preoccupazione del poster originale era che le connessioni potessero rimbalzare. Ciò avverrà solo se il tuo server è sovraccarico (o forse scritto male) che è sovraccaricato in modo efficace e il dumping di alcune richieste è la migliore possibilità che abbia di fornire almeno qualche servizio ad alcuni utenti.

+0

Grazie, mi piace molto questa risposta. Non ero a conoscenza dello stack TCP –

9

Sì. Il server è ancora in grado di accodare le richieste. Per dimostrare, ho creato il seguente file che blocca per 10 secondi, l'ho eseguito e ho incurvato il server su un altro terminale.

require('http').createServer(function(req, res) { 
    console.log('got a request!'); 
    res.end('hello world!\n'); 
}).listen(3000); 

var t = Date.now(); 
console.log('blocking..'); 
while(t + 10000 > Date.now()); 
console.log('not blocking anymore'); 

Il risultato esecuzione è

blocking.. 
not blocking anymore 
got a request! 
+0

Va bene, penso che lo risponda bene. Mi chiedo se le richieste in entrata siano state messe in coda dopo il blocco e quindi abbiano effettuato il login 'ha ottenuto una richiesta' o se la richiesta in entrata è stata collocata in coda DURANTE il blocco e quindi 'ha ottenuto una richiesta' è stato licenziato dopo il ciclo degli eventi è stato liberato. –

+0

Questo risponde comunque all'aspetto più importante della domanda, le richieste in arrivo non sono rimbalzate ... che era la mia preoccupazione principale. Grazie buon signore –

+0

Se l'I/O è veramente asincrono avrebbe dovuto essere posizionato durante il blocco, ma se la coda degli eventi è bloccata non vedo come sarebbe in grado di accettare più eventi ...a meno che la coda stessa si trovi nell'ambiente asincrono e ogni evento sia gestito nell'ambiente di blocco ... credo che la domanda sia che la coda di eventi si trovi nell'ambiente asincrono o di blocco ... ma per tutti gli scopi intensivi, la domanda è risposta. Posso dormire la notte. –

Problemi correlati