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!
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
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) –