2012-02-14 11 views
8

Sto usando il modulo nodejs + websocket per stabilire una connessione tra il client e il server attraverso una websocket. Il server emette più volte dati al client: so che è una connessione TCP, ma lascia che cancelli ogni dubbio a riguardo. Le "emette" sono sequenziali? Se il primo "emit" è stato fatto al tempo 1s e il secondo "emit" al tempo 2s, il client riceverà di sicuro il primo emit e poi il secondo? Cosa succede se il primo emettitore non viene ancora ricevuto e il secondo viene emesso? Sono emette il blocco delle chiamate?Websocket: i dati del server vengono inviati in modo sincrono?

+0

http://stackoverflow.com/q/11804721/632951 – Pacerier

risposta

21

WebSockets è basato su TCP. TCP garantisce la consegna e l'ordine dei pacchetti. Inoltre, a differenza di TCP, WebSockets è basato sui messaggi, il che significa che i messaggi WebSocket vengono ricevuti come un intero messaggio (TCP è in streaming e "i messaggi" potrebbero essere frammentati dal punto di vista dell'ascoltatore)

In node.js, due emetti che sono chiamati dallo stesso contesto (la stessa funzione) uno dopo l'altro saranno consegnati in questo ordine. Tuttavia, se le tue emette sono in due richiami diversi, non puoi sempre garantire quando Node.js pianificherà tali callback e quindi le emette potrebbero essere riordinate perché i callback pianificati sono stati riordinati.

Aggiornamento:

Ecco un esempio di espandere sul motivo per cui la natura guidata caso di Node.js può provocare sorprendente riordino delle WebSocket emette/invia:

fs.readFile(file1,function(e,data) { ws.send(data); }); 
fs.readFile(file2,function(e,data) { ws.send(data); }); 

L'ordine che file1 e file2 verranno consegnati al browser non è prevedibile (anche la dimensione del file non è una garanzia di quando spareranno a causa di cose come la memorizzazione nella cache, la frammentazione del file system, ecc.). Anche se il file di lettura di file2 viene chiamato dopo 1 secondo utilizzando un setTimeout, il browser potrebbe ancora riceverli fuori ordine (ad esempio se file1 è molto più grande e richiede 3 secondi per leggere l'invio di file1 avverrà dopo l'invio per file2) .

Quindi sì, le emittenze/le mandate verranno ricevute nel browser nell'ordine in cui sono chiamate in Node.js, ma a causa della natura asincrona degli eventi di Node.js, le emittenze/le mandate potrebbero non avvenire nell'ordine aspettarsi.

La natura asincrona basata sugli eventi di Node.js è ciò che fornisce a Node.js un'eccellente efficienza e prestazioni, ma se non si è abituati a questo tipo di programmazione basata sul callback, può avere risultati sorprendenti.

+0

"Tuttavia, se le emette sono in due richiami diversi, non è sempre possibile garantire quando Node.js pianificherà tali richiamate e quindi le emette potrebbero essere riordinate perché i callback pianificati sono stati riordinati." - se la richiamata 1 ha funzionato prima della richiamata 2, ed entrambe emettono, l'emit * di callback * verrà eseguito prima dell'emissione di callback 2. – einaros

+1

@einaros, è vero, ma il mio punto è che i callback sono intrinsecamente asincroni, quindi non puoi garantire l'ordine in cui sparano. Anche se si registra la richiamata A 1 secondo prima di registrare la richiamata B, se la routine con callback A richiede 3 secondi per completare e B impiega solo 1 secondo, allora B avverrà prima di A anche se A è stato registrato per primo. E ogni callback che sta sparando sul completamento dell'I/O avrà spesso tempi imprevedibili. – kanaka

+0

Dato che le richiamate registrate in un ordine specifico per un evento specifico verranno sempre eseguite in tale ordine, non vedo come il resto si riferisca alla domanda dell'OP. È ovvio che se gli eventi che attivano le emesse cambiano ordine; le emette cambieranno anche ordine. – einaros

4

I messaggi arrivano al cliente nell'ordine corretto.

+2

Quindi qual è l '"ordine corretto"? Se due processi inviano ** simulatosamente ** 1 nanosecondo, il server riceve le chiamate in questo ordine? – Pacerier

+3

@Pacerier La tua domanda racchiude una contraddizione in termini. – EJP

Problemi correlati