2012-04-19 20 views
9

Soy bastante nuevo en Node.js y tengo una solicitud para una aplicación que recibiría una carga útil de paquetes UDP y la procesaría.Cómo configurar un servidor UDP muy rápido node.js

Estoy hablando de más de 400 mensajes por segundo, que llegarían a algo así como 200,000 mensajes/minuto.

He escrito un código para configurar un servidor UDP (tomado de los documentos aquí http://nodejs.org/api/all.html#all_udp_datagram_sockets en realidad) pero está perdiendo algo alrededor del 5% de los paquetes.

Lo que realmente necesito desarrollar es un servidor que obtenga el paquete y lo envíe a otro trabajador haga el trabajo con el mensaje. Pero parece que enhebrar en node.js es una pesadilla.

Esta es mi núcleo como es:

var dgram = require("dgram"); 
var fs = require("fs"); 
var stream = fs.createWriteStream("received.json",{ flags: 'w', 
    encoding: "utf8", 
    mode: 0666 }); 

var server = dgram.createSocket("udp4"); 
server.on("message", function (msg, rinfo) { 
    console.log("server got: " + msg + " from " + 
    rinfo.address + ":" + rinfo.port); 
    stream.write(msg); 
}); 

server.on("listening", function() { 
    var address = server.address(); 
    console.log("server listening " + 
     address.address + ":" + address.port); 
}); 

server.bind(41234); 
// server listening 0.0.0.0:41234 
+2

Recuerde que los datagramas, a diferencia de los sockets TCP, no están garantizados como recibo. En cambio, los datagramas se centran en la velocidad, sin reconocer los mensajes individuales. – skeggse

+0

Son cosas como estas las que me hicieron cambiar a Go y nunca mirar hacia atrás. –

+0

@AParacha Por favor, elabore, estoy escuchando: D –

Respuesta

2

Te faltan conceptos, NodeJS no está destinado a ser multi-hilo en términos de que quieres decir, las solicitudes deben ser manejados en un ciclo. No existe otro hilo por lo que no ocurre ningún cambio de contexto. En un entorno multinúcleo, puede crear un clúster a través del módulo de clúster del nodo. Tengo una publicación de blog sobre este here.

Establece los procesos principales en los procesos hijos de la horquilla, y SÓLO los procesos secundarios deben vincularse a un puerto. Sus procesos principales manejarán el equilibrio de carga entre los niños.

Nota: En mi blog, me hizo i < os.cpus().length/2; pero debe ser i < os.cpus().length;

+0

Lo siento, creo que no me explicó bastante bien, pero la cosa es: como cliente UDP puedo enviar más de 10k paquetes UDP en un segundo, pero el servidor UDP falta alrededor del 5% en un entorno localhost a localhost. De todos modos, mi servidor ya es bastante receptivo, responde más de 1000 (1kb) mensajes/segundo, lo cual es suficiente para mí. – Panthro

+0

Usted ha escrito "Lo que realmente necesito desarrollar es un servidor que obtenga el paquete y se lo envíe a otro trabajador que haga el trabajo con el mensaje", pero supongo que quiere reducir la tasa de error del 5%. ¿Puedes volver a escribir tu pregunta? – Mustafa

0

escribí un servicio de reenvío de jabón/xml con una estructura similar, y se encontró que la información vendría en 2 paquetes. Necesitaba actualizar mi código para detectar 2 mitades del mensaje y volver a unirlas. Este tamaño de carga puede ser más un problema HTTP que un problema udp, pero mi sugerencia es que agregue el registro para escribir todo lo que está recibiendo y luego revisarlo con un peine de dientes finos. Parece que estarías registrando lo que estás obteniendo ahora, pero es posible que tengas que profundizar en el 5% que estás perdiendo.

¿Cómo sabes que es 5%? si vuelve a enviar ese tráfico, ¿siempre será 5%? son los mismos mensajes siempre perdidos.

Creé un servidor UDP para datos de llamadas voip/sip usando ruby ​​y Event Machine, y hasta ahora todo ha ido bien. (Tengo curiosidad acerca de su enfoque de prueba, estaba haciendo todo por netcat, o un pequeño cliente de ruby, nunca hice 10k mensajes)

Cuestiones relacionadas