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.
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 ... –