2010-08-09 11 views
5

Tengo un programa de chat que empuja los datos JSON de Apache/PHP para Node.js, a través de un socket TCP:¿Cómo mantener Node.js de mensajes de conexión dividir en partes más pequeñas

// 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); 

El problema es decir, si la cadena JSON es lo suficientemente grande (alrededor de 8k), el mensaje de salida se divide en múltiples fragmentos y el analizador JSON falla. PHP devuelve el valor de $ escrito como la longitud correcta de la cadena, pero el controlador de eventos de datos se dispara dos o más veces.

¿Debo fijar la función de un evento diferente, o hay una manera de almacenar en caché texto a través desencadena el evento, de manera que no va a sucumbir a las condiciones de carrera bajo carga pesada? ¿O alguna otra solución en la que no haya pensado?

Gracias!

Respuesta

2

debería intentar usar un buffer, para almacenar en caché los datos, como Node.js tiende a dividir los datos con el fin de mejorar el rendimiento.

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

se puede amortiguar toda su petición, y luego llamar a la función con los datos almacenados en ella.

+2

La solución es buena pero no es Node.js que está haciendo la división, o bien es el sistema operativo en el servidor o el sistema operativo en el cliente o el módem/router en cada extremo o un router de su ISP o una enrutador en el camino. Así es como funciona Internet. Puede configurar el sistema operativo tanto en el cliente como en el servidor para usar paquetes jumbo para reducir la fragmentación, pero no puede garantizar que la red no fragmente los paquetes (a menos que, por supuesto, ambos estén en la misma LAN). – slebetman

+1

Hola, tienes razón en que la mayoría de las veces es el sistema operativo o el servidor que divide cosas, pero también node.js divide las solicitudes de entrada para el rendimiento, como se indica en la documentación. Espero que los paquetes jumbo de IPv6 nos ayuden a evitarlo, pero supongo que los servidores seguirán dividiendo cosas por razones de rendimiento de todos modos (al menos en la Web) –

1

sockets TCP no manejan el almacenamiento en búfer para usted. ¿Cómo podría? No sabe qué protocolo de capa de aplicación está utilizando y, por lo tanto, no tiene idea de qué es un "mensaje". Depende de usted diseñar e implementar otro protocolo encima y manejar cualquier almacenamiento en memoria intermedia necesario.

Pero, Node.js tiene incorporado un protocolo de capa de aplicación en la parte superior de TCP que maneja automáticamente el búfer para usted: el módulo HTTP. Si utiliza el módulo http en lugar del módulo tcp para esto, no tendrá que preocuparse por la fragmentación de paquetes y el almacenamiento en búfer.

+2

No, el módulo http tampoco guarda el mensaje completo para usted. El nodo se basa en la transmisión de datos. Porque es más eficiente. Por lo tanto, debe realizar su propio búfer en todo momento o utilizar un marco de nivel superior que lo haga por usted. – Marco

Cuestiones relacionadas