2011-11-16 20 views
5

Con nodejs, o eventlet o qualsiasi altro server non bloccante, cosa succede quando una determinata richiesta richiede molto tempo, blocca quindi tutte le altre richieste?Che cosa succede quando una singola richiesta impiega molto tempo con questi server io non bloccanti?

Esempio, una richiesta arriva e prende 200ms per calcolare, questo bloccherà altre richieste poiché ad es. nodejs utilizza un singolo thread.

Significa che il tuo 15K al secondo scenderà sostanzialmente b/c del tempo effettivo necessario per calcolare la risposta per una determinata richiesta.

Ma questo mi sembra sbagliato, quindi mi sto chiedendo cosa succede veramente, perché non riesco a immaginare come funzionino le cose.

risposta

1

Sei esattamente corretto. Gli sviluppatori Nodejs devono essere consapevoli di ciò o le loro applicazioni saranno completamente non performanti, se il codice in esecuzione lungo non è asincrono.

Tutto ciò che richiede molto tempo deve essere eseguito in modo asincrono.

1

Tutto in node.js viene eseguito in parallelo internamente. Tuttavia, il tuo codice funziona rigorosamente in serie. Se si dorme per un secondo in node.js, il server rimane inattivo per un secondo. Non è adatto per le richieste che richiedono molti calcoli. I/O è parallelo e il tuo codice esegue I/O tramite callback (quindi il tuo codice non è in esecuzione durante l'attesa per l'I/O).

Sulla maggior parte delle piattaforme moderne, node.js fa i thread per I/O. Utilizza libev, che utilizza i thread in cui funziona meglio sulla piattaforma.

+0

C'è una grande spiegazione [qui] (http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/) che è sostanzialmente ciò che hai detto, ma spiega un po 'di più. –

1

Questo è fondamentalmente vero, almeno se non si utilizza la nuova funzione cluster che bilancia le connessioni in entrata tra più lavoratori generati automaticamente. Tuttavia, se lo si utilizza, la maggior parte delle altre richieste verrà comunque completata rapidamente.

Modifica: i lavoratori sono processi.

1

Si può pensare al ciclo degli eventi come 10 persone in fila per pagare le bollette. Se qualcuno sta prendendo troppo tempo per pagare il conto (bloccando così il ciclo degli eventi), le altre persone dovranno semplicemente per appendere intorno in attesa del loro turno per venire .. e in attesa ...

In other words:

Poiché il ciclo degli eventi è in esecuzione su un singolo filo, è molto importante che non blocchiamo è esecuzione facendo pesanti calcoli nelle funzioni di callback o sincrono I/o. Passare a una grande collezione di valori/oggetti con una funzione di callback impedisce il ciclo degli eventi da di elaborare altri eventi nella coda.

6

Se "blocchi" dipende o meno dalla definizione di "blocco". In genere, il blocco significa che la CPU è essenzialmente inattiva, ma il thread corrente non è in grado di fare nulla perché è in attesa di I/O o simili. Questo tipo di cose non tende ad accadere in node.js a meno che non si utilizzino le funzioni di I/O sincrone non raccomandate. Invece, le funzioni ritornano rapidamente e quando l'attività di I/O inizia a completarsi, il callback viene chiamato e tu lo prendi da lì. Nel frattempo, è possibile elaborare altre richieste.

Se si sta facendo qualcosa di computazionale nel nodo, nient'altro sarà in grado di utilizzare la CPU fino a quando non sarà terminata, ma per una ragione molto diversa: la CPU è effettivamente occupata. In genere questo non è ciò che le persone intendono quando dicono "bloccare", invece, è solo un lungo calcolo.

200 ms è un tempo lungo per qualcosa da intraprendere se non coinvolge I/O e sta semplicemente facendo calcoli. Questo probabilmente non è il genere di cose che dovresti fare nel nodo, per essere onesti. Una soluzione più nello spirito del nodo consisterebbe nell'avere quel tipo di crunch numerico in un altro programma (non javascript) che viene chiamato dal nodo e che richiama la richiamata quando completa. Supponendo di avere una macchina multi-core (o l'altro programma in esecuzione su una macchina diversa), il nodo può continuare a rispondere alle richieste mentre l'altro programma si assottiglia.

Ci sono casi in cui un cluster (come altri hanno menzionato) potrebbe aiutare, ma dubito che il tuo sia davvero uno di quelli. I cluster sono fatti apposta per quando si hanno un sacco di piccole richieste che insieme sono più di un singolo core della CPU in grado di gestire, non nel caso in cui si abbiano richieste singole che richiedono centinaia di millisecondi ciascuna.