2012-03-22 17 views
28

¿Puede alguien explicar en detalle cómo funciona el módulo core cluster en Node.js?¿Cómo funciona el módulo de clúster en Node.js?

¿Cómo pueden los trabajadores escuchar un solo puerto?

Hasta donde yo sé, el proceso maestro hace la escucha, pero ¿cómo puede saber qué puertos escuchar desde que los trabajadores se inician después del proceso maestro? ¿Lo comunican de alguna manera al maestro utilizando el canal de comunicación child_process.fork? Y si es así, ¿cómo se transfiere la conexión entrante del puerto del maestro al trabajador?

También me pregunto qué lógica se utiliza para determinar a qué trabajador se le pasa una conexión entrante?

+0

Tengo una pregunta sobre cómo el módulo del clúster enruta las solicitudes TCP. Por ejemplo, tengo el código pubsub de Redis y todos y cada uno de los trabajadores del clúster npm reciben los mensajes; incluso mientras las solicitudes HTTP se enrutan a un solo trabajador. ¿Hay alguna forma de configurar el clúster para que solo un trabajador reciba solicitudes de socket y no todos los trabajadores? Hice esto solo al tener Master Hold al oyente pubsub y luego delegar manualmente a cada uno de los trabajadores. Pero el objetivo del clúster es hacer esto por ti de la caja ... –

Respuesta

12

Sé que esto es una cuestión de edad, pero esto se explica ahora en nodejs.org here:

Los procesos de trabajo se generan utilizando el child_process .fork método, para que puedan comunicarse con el padre a través de IPC y pase el servidor maneja hacia adelante y hacia atrás.

Cuando llama a server.listen (...) en un trabajador, serializa los argumentos y pasa la solicitud al proceso maestro. Si el proceso maestro ya tiene un servidor de escucha que coincida con los requisitos del del trabajador, le pasa el identificador al trabajador. Si no tiene ya tiene un servidor de escucha que coincida con ese requisito, entonces creará uno y pasará el identificador al trabajador.

Esto hace que el comportamiento potencialmente sorprendente en tres casos extremos:

server.listen (FD: {7}) - Debido a que el mensaje se pasa al maestro, descriptor de fichero 7 de la matriz se escuchó en y el identificador pasado al trabajador, en lugar de escuchar la idea del trabajador de a qué se refiere el descriptor de archivo número 7.

server.listen (mango) - escucha en los mangos de forma explícita hará que el trabajador de usar el mango suministrado, en lugar de hablar con el proceso maestro . Si el trabajador ya tiene el identificador, se supone que sabe lo que está haciendo.

servidor.listen (0) - Normalmente, esto hará que los servidores escuchen en un puerto aleatorio . Sin embargo, en un clúster, cada trabajador recibirá el mismo puerto "aleatorio" cada vez que escuche (0). En esencia, el puerto es aleatorio la primera vez, pero es predecible a partir de ese momento. Si desea escuchar en un puerto único, genere un número de puerto basado en el ID del trabajador del clúster .

Cuando todos los procesos aceptan() ing en el mismo recurso subyacente , el sistema operativo equilibra la carga entre ellos muy de manera eficiente. No hay lógica de enrutamiento en Node.js, o en su programa, y no hay estado compartido entre los trabajadores. Por lo tanto, es importante diseñar su programa de modo que no dependa demasiado de los objetos de datos en memoria para cosas como sesiones e inicio de sesión.

Como los trabajadores son todos procesos separados, pueden ser eliminados o reduplicados según las necesidades de su programa, sin afectar a otros trabajadores . Mientras haya algunos trabajadores todavía vivos, el servidor continuará aceptando conexiones. Sin embargo, el nodo no automáticamente administra la cantidad de trabajadores para usted. Es su responsabilidad administrar el grupo de trabajadores para las necesidades de su aplicación.

8

NodeJS utiliza una decisión round-robin para equilibrar la carga entre los procesos secundarios. Le dará a las conexiones entrantes un proceso vacío, basado en el algoritmo RR.

Los elementos secundarios y el elemento primario en realidad no comparten nada, toda la secuencia de comandos se ejecuta desde el principio hasta el final, esa es la principal diferencia entre la horquilla C normal. El niño con horquilla en C tradicional continuaría ejecutándose desde la instrucción donde se dejó, no al principio como NodeJS. Entonces, si quiere compartir algo, necesita conectarse a un caché como MemCache o Redis.

Así que el siguiente código produce 6 6 6 (no mal significa) en la consola.

var cluster = require("cluster"); 
var a = 5; 
a++; 
console.log(a); 
if (cluster.isMaster){ 
    worker = cluster.fork(); 
    worker = cluster.fork(); 
} 
+1

Gracias por la información de todos contra todos, pero creo que has entendido mal mi pregunta sobre el paso de la conexión. Estoy hablando de las conexiones tcp que llegan al puerto compartido, no de cómo comunicarme entre los trabajadores. – Epeli

+0

@Epeli Esta discusión puede ser útil para su pregunta: https://groups.google.com/forum/#!topic/nodejs/svIXu5wUXCI/discussion – Mustafa

+2

Estoy descubriendo que en Windows no obedece a Round Robin. Puedo engendrar 10 trabajadores y si mi máquina es lo suficientemente rápida lanzará todas las conexiones entrantes al primer trabajador. ¿Alguna sugerencia? –

4

Aquí es una blog post que explica este

+3

Tenga en cuenta que las respuestas de solo enlace no se recomiendan, las respuestas SO deberían ser el punto final de una búsqueda de una solución (frente a otra escala de referencias, que tienden a quedarse obsoleta) a través del tiempo). Considere agregar una sinopsis independiente aquí, manteniendo el enlace como referencia. – kleopatra

0

Como una actualización de la respuesta de @ OpenUserX03, nodejs ya no usa balances de carga del sistema, pero usa uno incorporado. de this post:

Para corregir esto v0.12 nodo tiene una nueva aplicación usando un algoritmo de round-robin para distribuir la carga entre los trabajadores de una mejor manera. Este es el enfoque predeterminado que Node usa desde entonces, incluido el nodo v6.0.0

Cuestiones relacionadas