PM2'de Küme ve Çatal modu farkı


93

Bu soruyu çözmek için çok araştırdım, ancak net bir açıklama alamadım. Kümelenmiş uygulamanın ölçeklendirilebileceği ve çatallı uygulamanın olamayacağı tek bir şey var mı?

PM2'nin genel sitesi, Küme modunun bu özelliği yapabileceğini açıklıyor, ancak kimse Çatal modunun artılarını söylemiyor (belki, NODE_APP_INSTANCEdeğişken alabilir ).

Cluster'ın Fork'un bir parçası olabileceğini düşünüyorum çünkü Fork genel olarak kullanılacak gibi görünüyor. Sanırım, Fork, PM2 açısından sadece 'çatallı süreç' anlamına geliyor ve Küme, 'ölçeklendirilebilen çatallı süreç' anlamına geliyor. O halde neden Çatal modunu kullanmalıyım?

Yanıtlar:


125

Arasındaki temel fark fork_modeve cluster_modebu emir ya kullanmak PM2 olmasıdır child_process.fork api veya küme api.

Bu dahili olarak ne anlama geliyor?

Çatal modu

forkModu temel bir süreç yumurtlama olarak alın . Bu, pm2 ile exec_interpreterbir phpveya bir pythonsunucuyu çalıştırabilmeniz için değiştirmenize izin verir . Evet, exec_interpreterçocuk süreci başlatmak için kullanılan "komut" dur. Varsayılan olarak, um2'den kullanacak nodeşekilde pm2 start server.jsböyle bir şey yapar:

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

Bu mod çok kullanışlıdır çünkü birçok olasılık sağlar. Örneğin, daha sonra HAProxy veya Nginx tarafından yük dengelenecek önceden kurulmuş bağlantı noktalarında birden çok sunucu başlatabilirsiniz.

Küme modu

clusterSadece birlikte çalışacaktır nodebu kadar olduğu gibi exec_interpreter(: örn o nodejs küme modül erişim çünkü isMaster, forkyöntemler vb.) Bu, sıfır konfigürasyonlu süreç yönetimi için harikadır çünkü süreç otomatik olarak birden çok örnekte çatallanacaktır. Örneğin pm2 start -i 4 server.js, 4 örneğini başlatacak server.jsve küme modülünün yük dengelemeyi yapmasına izin verecektir .


3
Buradaki cevabınıza dayalı olarak soru: Sahip olmam gereken bir kullanım senaryosu var, örneğin benzersiz, önceden tanımlanmış bir bağlantı noktası numarasıyla (: 3000'den: 3030'a kadar) ortaya çıkan node.js uygulamamın 30 örneğini ve yalnızca kendilerine atanmış bağlantı noktalarından erişecek belirli bir kullanıcı grubu. Bu nedenle, Ana işlemin yük dengeleme yapmasını istemiyorum, bunun yerine yalnızca alt işlemleri başlatmasını (ve çalıştırmaya devam etmesini) istemiyorum. Mümkün mü? Yoksa yükü yalnızca ortaya çıkan tüm alt süreçlere yaymaya mı çalışacak?
tamak

3
Fork_mode'da 30 işlem başlatmak ve 30 bağlantı noktası arasında yük dengeleyici olarak başka bir şey kullanmak için pm2 programatik API'yi kullanırdım. Ayrıca pm2 start -i 30 app.jsnodejs kümesini kullanabilir ve işi yapmasına izin verebilirsiniz .
soyuka

11
not: cluster modeana süreçte tek bir başarısızlık noktasıdır.
Karl Pokus

42

Node.js tek iş parçacıklıdır.

Bu, Intel dört çekirdekli CPU'nuzun yalnızca 1 çekirdeğinin düğüm uygulamasını çalıştırabileceği anlamına gelir.

Bu seslendi: fork_mode.

Yerel geliştirme için kullanıyoruz .

pm2 start server.js -i 0 CPU'nuzun her çekirdeğinde 1 düğüm iş parçacığı çalıştırmanıza yardımcı olur.

Ve durum bilgisi olmayan gelen istekleri otomatik olarak dengeleyin .

On aynı port .

Biz diyoruz: cluster_mode.

Üretimde performans uğruna kullanılır .

Bilgisayarınızı stres testi yapmak istiyorsanız, bunu yerel geliştiricide de yapmayı seçebilirsiniz :)


2
thaks, nodejs hakkında aklımdaki birçok şeyi temizliyor
Rishabh Agrawal

1
harika bir açıklama !!
Piqué

1
Node.js tek iş parçacıklı değil, (şu anda) bir kullanıcı alanı iş parçacığı var, ancak kesinlikle bir libuv iş parçacığı tarafından destekleniyor.
Benjamin Gruenbaum

1
@BenjaminGruenbaum Sizinle katılıyorum. İfadem, libuv seviyesine kadar çok derinden bahsetmediğim varsayımıyla anlaşılmalıdır
haotang

16

Belgeler ve kaynaklar burada gerçekten yanıltıcıdır.

Kaynaklardan bunun üzerine okumak, tek fark, ya düğüm clusterya da child_processAPI kullanmalarıdır. Yana clusterikincisi kullanımlar, aslında aynı yapıyoruz. stdioHanda dolaşan çok daha fazla gelenek var fork_mode. Ayrıca clusternesnelerle değil, yalnızca dizelerle iletişim kurulabilir.

Varsayılan olarak kullanıyorsunuz fork_mode. Eğer başarılı olursa -i [number]-Seçeneği, sen Gireceğimiz cluster_modegenellikle w / hedefleyin, hangi pm2.

Ayrıca fork_modeörnek muhtemelen aynı bağlantı noktasında dinleyemiyor EADDRINUSE. cluster_modeYapabilmek. Bu şekilde, uygulamanızı aynı bağlantı noktasında çalışacak şekilde otomatik olarak dengelenecek şekilde yapılandırabilirsiniz. Durumsuz uygulamalar oluşturmanız gerekir, örneğin oturumlar, dbs.


1
Hala kafam karışık. clusteryerleşik modül child_processdahili olarak kullanıyor mu? ve öneriniz, esnekliğe ihtiyacım olursa stdio, Çatal modunu kullanmam gerektiği.
Jinyoung Kim

Bu stdioşey, pm2uygulamasının bir parçası. Bunun için endişelenme. Arka planda örnekleri cluster_modeçalıştırdığı için örneğinizi sertleştirdiği için üretimde kullanmak istiyorsunuz -i [number]. fork_modeSertleştirme gerekli değilse veya daha iyi kütükler ve şeyler istiyorsanız kullanın .
eljefedelrodeodeljefe

1
Ayrıca cluster_mode, -i [number]süreçleri çalıştırdığınız için sisteminizin daha fazla kaynağını kullanır .
eljefedelrodeodeljefe

Cevabınızı içtenlikle takdir etsem de, şimdi bile noktayı yakalayamadım. Açıklamanızın çoğu doğal şeylerdir (örneğin CLI kullanımı cluster_mode, yük dengesi cluster_mode, cluster_modedaha fazla kaynak kullanır ..). Oy vermememin nedeni bu. Her iki basit kullanım durumunu da açıklayabilir misiniz? Her vakanın neden kendi tarzını aldığının makul olması gerekir.
Jinyoung Kim

@eljefedelrodeodeljefe "Durumsuz uygulamalar oluşturmak zorundasınız, örneğin oturumlar, dbs." hakkında daha fazla bilgi verebilir misiniz? Uygulama neden devletsiz olmalı?
STEN
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.