5

No soy un maestro de node.js, por lo que me gustaría tener más puntos de vista sobre esto.Creación de una aplicación node.js de alto rendimiento con clúster y nodo-webworker

Estoy creando un servidor web HTTP node.js que debe manejar no solo muchas conexiones simultáneas sino también trabajos de larga ejecución. Por defecto node.js se ejecuta en un proceso, y si hay un fragmento de código que tarda mucho tiempo en ejecutarse, cualquier conexión posterior debe esperar hasta que el código finalice lo que está haciendo en la conexión anterior.

Por ejemplo:

var http = require('http'); 
http.createServer(function (req, res) { 

    doSomething(); // This takes a long time to execute 

    // Return a response 
}).listen(1337, "127.0.0.1"); 

Así que estaba pensando para ejecutar todos los trabajos de larga ejecución en hilos separados utilizando el node-webworker biblioteca:

var http = require('http'); 
var sys = require('sys'); 
var Worker = require('webworker'); 
http.createServer(function (req, res) { 

    var w = new Worker('doSomething.js'); // This takes a long time to execute 

    // Return a response 
}).listen(1337, "127.0.0.1"); 

Y para que todo el asunto con más prestaciones, lo También se pensó usar cluster para crear un nuevo proceso de nodo para cada núcleo de CPU.

De esta manera espero equilibrar las conexiones del cliente a través de diferentes procesos con cluster (digamos 4 procesos de nodo si lo ejecuto en un núcleo cuádruple), y luego ejecutar el trabajo de larga ejecución en hilos separados con node-webworker.

¿Hay algún problema con esta configuración?

Respuesta

0

Es posible que desee comprobar Q-Oper8 en su lugar, ya que debe proporcionar una arquitectura más flexible para este tipo de cosas. Información completa en:

https://github.com/robtweed/Q-Oper8

+1

Última actualización hace 2 años –

3

veo que este post está a pocos meses de edad, pero yo quería proporcionar un comentario a esto en el caso de que alguien se presente.

"De manera predeterminada, node.js se ejecuta en un proceso, y si hay un fragmento de código que tarda mucho tiempo en ejecutarse, cualquier conexión posterior debe esperar hasta que el código finalice lo que está haciendo en la conexión anterior".

^- Esto no es del todo cierto. Si doSomething(); debe completarse antes de devolver la respuesta, entonces sí, pero si no es así, puede hacer uso de la funcionalidad asíncrona disponible para usted en el núcleo de Node.js, y volver inmediatamente, mientras este elemento se procesa en el fondo.

Un ejemplo rápido de lo que estoy explicando puede verse añadiendo el siguiente código en su servidor:

setTimeout(function(){ 
    console.log("Done with 5 second item"); 
}, 5000); 

Si se pulsa el servidor de un par de veces, usted recibirá una respuesta inmediata en el cliente lado, y eventualmente ver que la consola se llena con los mensajes segundos después de que se envió la respuesta.

1

¿Por qué no simplemente copia y pega el código en un archivo y ejecutarlo sobre JXcore como

$ jx mt-keep:4 mysourcefile.js 

y ver cómo se realiza. Si necesita un multihilo real sin abandonar la seguridad del enhebrado simple, intente con JX. es 100% node.JS 0.12+ compatible. Puede engendrar los hilos y ejecutar una aplicación node.js completa dentro de cada uno de ellos por separado.

Cuestiones relacionadas