Diferencia de modo Cluster y Fork en PM2

89

He buscado mucho para resolver esta pregunta, pero no obtuve una explicación clara. ¿Existe una sola diferencia en la que la aplicación agrupada se puede escalar horizontalmente y la aplicación bifurcada no?

El sitio público de PM2 explica que el modo Cluster puede hacer estas funciones, pero nadie dice sobre las ventajas del modo Fork (tal vez, puede ser NODE_APP_INSTANCEvariable).

Siento que Cluster podría ser parte de Fork porque parece que Fork se usa en general. Entonces, supongo que Fork significa simplemente 'proceso bifurcado' desde el punto de PM2 y Cluster significa 'proceso bifurcado que se puede escalar'. Entonces, ¿por qué debería usar el modo Fork?

Jinyoung Kim
fuente

Respuestas:

121

La principal diferencia entre fork_modey cluster_modees que ordena a pm2 que use la api child_process.fork o la api del clúster .

¿Qué significa esto internamente?

Modo de horquilla

Tome el forkmodo como un proceso básico de generación. Esto permite cambiar el exec_interpreter, para que pueda ejecutar phpun pythonservidor con pm2. Sí, exec_interpreteres el "comando" que se utiliza para iniciar el proceso secundario. Por defecto, pm2 usará nodepara que pm2 start server.jshaga algo como:

require('child_process').spawn('node', ['server.js'])

Este modo es muy útil porque permite muchas posibilidades. Por ejemplo, puede iniciar varios servidores en puertos preestablecidos que luego serán equilibrados por HAProxy o Nginx.

Modo de grupo

El clustersolo funcionará nodecomo está exec_interpreterporque accederá al módulo de clúster de nodejs (por ejemplo isMaster, forkmétodos , etc.). Esto es excelente para la gestión de procesos de configuración cero porque el proceso se bifurcará automáticamente en varias instancias. Por ejemplo pm2 start -i 4 server.js, lanzará 4 instancias de server.jsy permitirá que el módulo de clúster maneje el equilibrio de carga.

soyuka
fuente
3
pregunta basada en su respuesta aquí: Tengo un caso de uso que necesito, digamos 30 instancias de mi aplicación node.js generadas con un número de puerto único y predefinido (: 3000 a: 3030) y cada una de las instancias maneja un grupo específico de usuarios que solo accederán en su puerto asignado. Por lo tanto, no quiero que el proceso maestro realice el equilibrio de carga, sino que solo inicie (y siga ejecutándose) los procesos secundarios. es posible? ¿O intentará distribuir la carga solo entre todos los procesos secundarios generados?
tamak
3
Usaría la API programática pm2 para lanzar 30 procesos en fork_mode y usaría algo más como balanceador de carga entre los 30 puertos. También puede usar pm2 start -i 30 app.jsy dejar que el clúster nodejs haga el trabajo.
soyuka
11
nota: en cluster modeel proceso maestro hay un solo punto de falla.
Karl Pokus
40

Node.js es de un solo hilo.

Eso significa que solo 1 núcleo de su CPU Intel de cuatro núcleos puede ejecutar la aplicación de nodo.

Se llama: fork_mode.

Lo usamos para el desarrollo local .

pm2 start server.js -i 0 le ayuda a ejecutar 1 hilo de nodo en cada núcleo de su CPU.

Y equilibre automáticamente la carga de las próximas solicitudes sin estado.

En el mismo puerto .

Lo llamamos: cluster_mode.

Que se utiliza en aras del rendimiento en la producción .

También puede optar por hacer esto en el desarrollador local si desea realizar una prueba de esfuerzo en su PC :)

haotang
fuente
2
gracias, aclara muchas cosas en mi mente sobre nodejs
Rishabh Agrawal
1
gran explicacion !!
Piqué
1
Node.js no es de un solo hilo, hay (actualmente) un hilo de usuario pero ciertamente está respaldado por un grupo de hilos libuv.
Benjamin Gruenbaum
1
@BenjaminGruenbaum De acuerdo contigo. Mi declaración debe entenderse asumiendo que no estoy mencionando demasiado profundamente al nivel de
libuv
16

La documentación y las fuentes son realmente engañosas aquí.

Al leer sobre esto en las fuentes, las únicas diferencias parecen ser que usan nodo clustero child_processAPI. Dado que clusterusa este último, en realidad está haciendo lo mismo. Hay muchas más costumbres stdiopasando alrededor de la posada fork_mode. Además cluster, solo se puede comunicar con cadenas, no objetos.

De forma predeterminada, está utilizando fork_mode. Si pasa la -i [number]opción-, ingresará cluster_mode, a lo que generalmente apunta con w / pm2.

Además, la fork_modeinstancia probablemente no pueda escuchar en el mismo puerto debido a EADDRINUSE. cluster_modelata. De esta manera, también puede estructurar su aplicación para que se ejecute en el mismo puerto y se equilibre automáticamente la carga. Tienes que crear aplicaciones sin estado, por ejemplo, sesiones, dbs.

eljefedelrodeodeljefe
fuente
1
Todavía estoy confundido. cluster¿El módulo incorporado utiliza child_processinternamente? y su sugerencia es si necesito flexibilidad stdio, ¿tengo que usar el modo Fork?
Jinyoung Kim
La stdiocosa es algo de pm2implementación. No se preocupe por esto. Desea usar cluster_modeen producción porque está fortaleciendo su instancia ya que está ejecutando -i [number]instancias en segundo plano. Úselo fork_modesi el endurecimiento no es necesario o si desea mejores troncos y cosas así.
eljefedelrodeodeljefe
1
También obviamente cluster_modeusa más recursos de su sistema porque está ejecutando -i [number]procesos.
eljefedelrodeodeljefe
Aunque aprecié mucho tu respuesta, no entendí el punto incluso ahora. La mayor parte de su explicación son cosas naturales (por ejemplo, el uso de CLI cluster_mode, el equilibrio de carga de cluster_mode, cluster_modeutiliza más recursos ...). Esa es la razón por la que no he votado. ¿Podría explicar ambos casos de uso simples? Cada caso tiene que ser razonable por qué tomó su modo.
Jinyoung Kim
@eljefedelrodeodeljefe ¿Puedes explicar más sobre "Tienes que crear aplicaciones sin estado, por ejemplo, sesiones, dbs."? ¿Por qué la aplicación debería estar sin estado?
STEN