Diferença de modo cluster e bifurcação em PM2

89

Procurei muito para descobrir essa questão, mas não obtive uma explicação clara. Existe apenas uma diferença que um aplicativo em cluster pode ser dimensionado e um aplicativo bifurcado não?

O site público do PM2 explica que o modo Cluster pode fazer esses recursos, mas ninguém fala sobre os prós do modo Fork (talvez, ele possa ser NODE_APP_INSTANCEvariável).

Eu sinto que o Cluster pode fazer parte do Fork porque o Fork parece ser usado em geral. Então, eu acho que Fork significa apenas 'processo bifurcado' do ponto de PM2 e Cluster significa 'processo bifurcado que pode ser escalonado'. Então, por que devo usar o modo Fork?

Jinyoung Kim
fonte

Respostas:

121

A principal diferença entre fork_modee cluster_modeé que ele ordena que o pm2 use a API child_process.fork ou a API do cluster .

O que isso significa internamente?

Modo Fork

Considere o forkmodo como um processo básico de desova. Isso permite alterar o exec_interpreter, para que você possa executar um phpou um pythonservidor com pm2. Sim, exec_interpreteré o "comando" usado para iniciar o processo filho. Por padrão, pm2 será usado nodepara pm2 start server.jsfazer algo como:

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

Este modo é muito útil porque permite muitas possibilidades. Por exemplo, você pode iniciar vários servidores em portas pré-estabelecidas que terão a carga balanceada pelo HAProxy ou Nginx.

Modo de cluster

O clustersó funcionará com nodecomo é exec_interpreterporque vai aceder ao nodejs aglomerado módulo (por exemplo: isMaster, forkmétodos, etc.). Isso é ótimo para gerenciamento de processo de configuração zero, porque o processo será bifurcado automaticamente em várias instâncias. Por exemplo pm2 start -i 4 server.js, iniciará 4 instâncias de server.jse permitirá que o módulo de cluster controle o balanceamento de carga.

soyuka
fonte
3
pergunta com base em sua resposta aqui: Eu tenho um caso de uso que preciso ter, digamos, 30 instâncias do meu aplicativo node.js gerado com um número de porta predefinido exclusivo (: 3000 a: 3030) e cada uma das instâncias lidar com um grupo específico de usuários que acessarão apenas em sua porta atribuída. Portanto, não quero que o processo Master faça o balanceamento de carga, mas apenas inicie (e continue executando) os processos filho. Isso é possível? Ou tentará distribuir a carga apenas por todos os processos filho gerados?
tamak de
3
Eu usaria a API programática pm2 para lançar 30 processos em fork_mode e usar outra coisa como um balanceador de carga entre as 30 portas. Você também pode usar pm2 start -i 30 app.jse deixar o cluster nodejs fazer o trabalho.
soyuka de
11
nota: no cluster modeprocesso mestre existe um único ponto de falha.
Karl Pokus
40

Node.js é de thread único.

Isso significa que apenas 1 núcleo de sua CPU Intel quad-core pode executar o aplicativo de nó.

É chamado: fork_mode.

Nós o usamos para desenvolvimento local .

pm2 start server.js -i 0 ajuda a executar 1 thread de nó em cada núcleo de sua CPU.

E balancear automaticamente a carga das próximas solicitações sem estado.

Na mesma porta .

Chamamos-lhe: cluster_mode.

Que é usado por uma questão de desempenho na produção .

Você também pode optar por fazer isso no desenvolvedor local se quiser testar a resistência do seu PC :)

Haotang
fonte
2
Isso, clareou muitas coisas em minha mente sobre nodejs
Rishabh Agrawal
1
ótima explicação !!
Piqué
1
O Node.js não é um thread único, há (atualmente) um thread de área de usuário, mas certamente é apoiado por um threadpool libuv.
Benjamin Gruenbaum
1
@BenjaminGruenbaum Concordo com você. Minha declaração deve ser entendida na suposição de que não estou mencionando muito profundamente até o nível de
libuv
16

A documentação e as fontes são realmente enganosas aqui.

Lendo sobre isso nas fontes, as únicas diferenças parecem ser que eles usam o nó clusterou child_processAPI. Uma vez que clusterusa o último, você está realmente fazendo o mesmo. Há muito mais costume stdiopassando por aí fork_mode. Além disso, clustersó pode ser comunicado por meio de strings, não de objetos.

Por padrão, você está usando fork_mode. Se você passar na -i [number]opção-, você entrará cluster_mode, que geralmente visa w / pm2.

Além disso, a fork_modeinstância provavelmente não pode escutar na mesma porta devido a EADDRINUSE. cluster_modepode. Dessa forma, você também pode estruturar seu aplicativo para ser executado na mesma porta com balanceamento de carga automático. Você tem que construir aplicativos sem estado, então embora, por exemplo, sessões, dbs.

eljefedelrodeodeljefe
fonte
1
Ainda estou confuso. clustermódulo embutido usa child_processinternamente? e sua sugestão é se eu precisar de flexibilidade stdio, tenho que usar o modo Fork?
Jinyoung Kim
A stdiocoisa é algo sobre pm2a implementação de. Não se preocupe com isso. Você deseja usar cluster_modena produção porque está fortalecendo sua instância, pois está executando -i [number]instâncias em segundo plano. Use fork_modese o endurecimento não for necessário ou se você quiser registros e outras coisas melhores.
eljefedelrodeodeljefe
1
Obviamente, também cluster_modeusa mais recursos do seu sistema porque você está executando -i [number]processos.
eljefedelrodeodeljefe
Embora eu tenha gostado muito de sua resposta, não entendi o ponto até agora. A maior parte de sua explicação são coisas naturais (por exemplo, uso de CLI cluster_mode, equilíbrio de carga de cluster_mode, cluster_modeusa mais recursos ...). É por isso que não votei. Você poderia explicar os dois casos de uso simples? Cada caso deve ser razoável por que assumiu seu modo.
Jinyoung Kim
@eljefedelrodeodeljefe Você pode explicar mais sobre "Você tem que construir aplicativos sem estado, então, por exemplo, sessões, dbs."? Por que o aplicativo deve estar sem estado?
STEN