2010-08-09 8 views
5

ho un programma di chat che spinge i dati JSON da Apache/PHP per Node.js, tramite un socket TCP:Come mantenere Node.js da messaggi di socket dividere in porzioni più piccole

// Node.js (Javascript) 
phpListener = net.createServer(function(stream) 
{ 
    stream.setEncoding("utf8"); 
    stream.on("data", function(txt) 
    { 
     var json = JSON.parse(txt); 

     // do stuff with json 
    } 
} 
phpListener.listen("8887", 'localhost'); 

// Apache (PHP) 
$sock = stream_socket_client("tcp://localhost:8887"); 
$written = fwrite($sock, $json_string); 
fclose($sock); 

Il problema è, se la stringa JSON è abbastanza grande (oltre a circa 8k), il messaggio di output viene diviso in più blocchi e il parser JSON ha esito negativo. PHP restituisce il valore $ scritto come la lunghezza corretta della stringa, ma il gestore di eventi data genera due o più volte.

Devo associare la funzione a un evento diverso o esiste un modo per memorizzare il testo in cache tra gli eventi, in modo tale da non soccombere a condizioni di competizione in condizioni di carico intenso? O qualche altra soluzione a cui non avessi pensato?

Grazie!

risposta

2

Si dovrebbe provare a utilizzare un buffer per memorizzare i dati in quanto Node.js tende a suddividere i dati per migliorare le prestazioni.

http://nodejs.org/api.html#buffers-2

si può tamponare tutta la vostra richiesta, e quindi chiamare la funzione con i dati memorizzati in esso.

+2

La soluzione è buona ma non è Node.js che sta eseguendo la suddivisione, è il sistema operativo sul server o il sistema operativo sul client o il modem/router su entrambe le estremità o un router sul proprio ISP o un router lungo la strada. Questo è come funziona Internet. È possibile configurare il sistema operativo sia sul client che sul server per utilizzare i pacchetti jumbo per ridurre la frammentazione, ma non si può garantire che la rete non frammenta i pacchetti (a meno che, naturalmente, entrambi si trovino sulla stessa LAN). – slebetman

+1

Ciao, hai ragione il più delle volte è il sistema operativo o il server che divide le cose, ma anche node.js divide le richieste di input per le prestazioni, come indicato nella documentazione. Spero che i pacchetti jumbo di IPv6 possano aiutarci a evitarlo, ma la mia ipotesi è che i server continueranno a suddividere roba per motivi di prestazioni comunque (almeno sul Web) –

1

I socket TCP non gestiscono il buffering per l'utente. Come potrebbe? Non sa quale protocollo di livello applicazione stai usando e quindi non ha idea di cosa sia un "messaggio". Spetta a te progettare e implementare un altro protocollo su di esso e gestire qualsiasi buffering necessario.

Tuttavia, Node.js ha un protocollo di livello applicazione incorporato su TCP che gestisce automaticamente il buffering per voi: il modulo http. Se si usa il modulo http invece del modulo tcp per questo, non è necessario preoccuparsi della frammentazione e del buffering dei pacchetti.

+2

No, il modulo http non bufferizza nemmeno il messaggio completo per voi. Il nodo è costruito attorno ai dati in streaming. Perché è più efficiente. Quindi devi fare il tuo buffering in ogni momento o usare un framework di livello superiore che lo faccia per te. – Marco

Problemi correlati