Differenza di modalità Cluster e Fork in PM2


92

Ho cercato molto per capire questa domanda, ma non ho ottenuto una spiegazione chiara. C'è solo una differenza che l'app in cluster può essere scalata e l'app fork non può essere?

Il sito pubblico di PM2 spiega che la modalità Cluster può fare queste funzionalità, ma nessuno dice dei pro della modalità Fork (forse, può diventare NODE_APP_INSTANCEvariabile).

Sento che Cluster potrebbe far parte di Fork perché Fork sembra essere usato in generale. Quindi, immagino che Fork significhi solo "processo biforcuto" dal punto di PM2 e Cluster significhi "processo biforcuto che può essere scalato fuori". Allora, perché dovrei usare la modalità Fork?

Risposte:


124

La differenza principale tra fork_modee cluster_modeè che ordina a pm2 di utilizzare l' API child_process.fork o il cluster API .

Cosa significa internamente?

Modalità forcella

Prendi la forkmodalità come un processo di base per la deposizione delle uova. Ciò consente di modificare il exec_interpreter, in modo da poter eseguire a phpo un pythonserver con pm2. Sì, exec_interpreterè il "comando" utilizzato per avviare il processo figlio. Per impostazione predefinita, pm2 userà nodecosì che pm2 start server.jsfarà qualcosa come:

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

Questa modalità è molto utile perché consente molte possibilità. Ad esempio, è possibile avviare più server su porte prestabilite che verranno quindi bilanciate dal carico da HAProxy o Nginx.

Modalità cluster

L' clusterfunziona solo con nodecome è exec_interpreterperché accederà al nodejs cluster di modulo (es: isMaster, forkmetodi ecc). Questo è ottimo per la gestione del processo di configurazione zero perché il processo verrà automaticamente biforcato in più istanze. Ad esempio pm2 start -i 4 server.js, lancerà 4 istanze di server.jse consentirà al modulo cluster di gestire il bilanciamento del carico.


3
domanda basata sulla tua risposta qui: Ho un caso d'uso che devo avere, ad esempio 30 istanze della mia app node.js generate con un numero di porta univoco e predefinito (da: 3000 a: 3030) e ognuna delle istanze gestisce un gruppo specifico di utenti che accedono solo sulla porta assegnata. Quindi non voglio che il processo Master esegua il bilanciamento del carico, ma piuttosto avvii (e continui a eseguire) i processi figlio. È possibile? O tenterà di distribuire il carico solo su tutti i processi figli generati?
Tamak

3
Userei l'API programmatica pm2 per avviare 30 processi in fork_mode e userei qualcos'altro come bilanciatore del carico tra le 30 porte. Puoi anche usare pm2 start -i 30 app.jse lasciare che il cluster nodejs faccia il lavoro.
soyuka

11
nota: nel cluster modeprocesso master è un singolo punto di errore.
Karl Pokus

42

Node.js è single-thread.

Ciò significa che solo 1 core della CPU Intel quad-core può eseguire l'applicazione del nodo.

Ha chiamato: fork_mode .

Lo usiamo per lo sviluppo locale .

pm2 start server.js -i 0 ti aiuta a eseguire 1 thread di nodi su ogni core della tua CPU.

E bilanciamento automatico del carico delle richieste in arrivo senza stato.

Sulla stessa porta .

Noi lo chiamiamo: cluster_mode .

Che viene utilizzato per il bene delle prestazioni in produzione .

Puoi anche scegliere di farlo su un dev locale se vuoi stressare il tuo PC :)


2
grazie, chiarisce molte cose nella mia mente su nodejs
Rishabh Agrawal

1
ottima spiegazione !!
Piqué

1
Node.js non è single threaded, c'è (attualmente) un thread userland ma è certamente supportato da un threadpool libuv.
Benjamin Gruenbaum

1
@BenjaminGruenbaum D'accordo con te. La mia affermazione dovrebbe essere compresa nel presupposto che non sto menzionando troppo profondamente fino al livello di
libuv

16

La documentazione e le fonti qui sono davvero fuorvianti.

Leggendo questo nei sorgenti, le uniche differenze sembrano essere che usano sia il nodo clusterche l' child_processAPI. Poiché clusterutilizza quest'ultimo, in realtà stai facendo lo stesso. C'è solo molta più abitudine che stdiopassa intorno alla locanda fork_mode. Anchecluster può essere comunicato solo tramite stringhe, non oggetti.

Per impostazione predefinita stai usando fork_mode. Se passi l' -i [number]opzione-, stai entrando cluster_mode, a cui generalmente miri w / pm2.

Anche l' fork_modeistanza probabilmente non può ascoltare sulla stessa porta a causa di EADDRINUSE. cluster_modepuò. In questo modo puoi anche strutturare la tua app in modo che funzioni sulla stessa porta con il bilanciamento automatico del carico. Quindi devi creare app senza stato, ad esempio sessioni, dbs.


1
Sono ancora confuso. clusteril modulo integrato utilizza child_processinternamente? e il tuo suggerimento è se ho bisogno di flessibilità stdio, devo usare la modalità Fork?
Jinyoung Kim

La stdiocosa è qualcosa pm2dell'implementazione di. Non preoccuparti di questo. Si desidera utilizzare cluster_modein produzione perché sta rafforzando l'istanza poiché esegue -i [number]istanze in background. Da utilizzare fork_modese la protezione avanzata non è necessaria o se desideri registri e cose migliori.
eljefedelrodeodeljefe

1
Inoltre ovviamente cluster_modeutilizza più risorse del tuo sistema perché stai eseguendo -i [number]processi.
eljefedelrodeodeljefe

Anche se ho apprezzato molto la tua risposta, non ho colto il punto nemmeno ora. La maggior parte delle tue spiegazioni sono cose naturali (ad esempio, l'utilizzo della CLI cluster_mode, il bilanciamento del carico cluster_mode, l' cluster_modeutilizzo di più risorse ..). Questo è il motivo per cui non ho votato. Potresti spiegare entrambi i semplici casi d'uso? Ogni caso deve essere ragionevole perché ha preso la sua modalità.
Jinyoung Kim

@eljefedelrodeodeljefe Puoi spiegare di più su "Devi creare app senza stato, ad esempio sessioni, dbs."? Perché l'app dovrebbe essere senza stato?
STEN
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.