Różnica w trybie klastra i widelca w PM2

89

Szukałem dużo, aby rozwiązać to pytanie, ale nie otrzymałem jasnego wyjaśnienia. Czy jest tylko jedna różnica między aplikacją klastrowaną a aplikacją rozwidloną nie?

Witryna publiczna PM2 wyjaśnia, że ​​tryb klastrowy może wykonywać te funkcje, ale nikt nie mówi o zaletach trybu wideł (być może może uzyskać NODE_APP_INSTANCEzmienną).

Czuję, że Cluster może być częścią Fork, ponieważ Fork wydaje się być używany w ogóle. Wydaje mi się, że Fork oznacza po prostu „rozwidlony proces” z punktu PM2, a Cluster oznacza „rozwidlony proces, który można wyskalować”. W takim razie dlaczego powinienem używać trybu wideł?

Jinyoung Kim
źródło

Odpowiedzi:

121

Główna różnica między fork_modei cluster_modepolega na tym, że polecenie pm2 używa albo interfejsu API child_process.fork, albo interfejsu API klastra .

Co to oznacza wewnętrznie?

Tryb wideł

Traktuj forktryb jako podstawowy proces odradzania. Pozwala to zmienić exec_interpreter, tak że można uruchomić serwer phplub pythonserwer z pm2. Tak, exec_interpreterjest to „polecenie” używane do uruchamiania procesu potomnego. Domyślnie pm2 użyje, nodewięc pm2 start server.jszrobi coś takiego:

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

Ten tryb jest bardzo przydatny, ponieważ daje wiele możliwości. Na przykład możesz uruchomić wiele serwerów na wcześniej ustalonych portach, które zostaną następnie zrównoważone przez HAProxy lub Nginx.

Tryb klastra

clusterZadziała tylko nodejak to jest exec_interpreter, ponieważ będzie to dostęp do nodejs klaster moduł (np isMaster, forkmetody itd.). Jest to świetne rozwiązanie do zarządzania procesami bez konfiguracji, ponieważ proces zostanie automatycznie rozwidlony w wielu wystąpieniach. Na przykład pm2 start -i 4 server.jsuruchomi 4 instancje server.jsi pozwoli modułowi klastra na obsługę równoważenia obciążenia.

soja
źródło
3
pytanie oparte na twojej odpowiedzi tutaj: Mam przypadek użycia, który muszę mieć, powiedzmy 30 instancji mojej aplikacji node.js z unikalnym, predefiniowanym numerem portu (od 3000 do 3030) i każda z instancji obsługuje określona grupa użytkowników, którzy będą uzyskiwać dostęp tylko przez przypisany port. Dlatego nie chcę, aby proces główny wykonywał równoważenie obciążenia, ale raczej uruchamiał (i kontynuował) procesy potomne. czy to możliwe? A może spróbuje rozłożyć obciążenie tylko na wszystkie uruchomione procesy potomne?
tamak
3
Użyłbym programowego API pm2, aby uruchomić 30 procesów w trybie fork_mode i użyć czegoś innego jako modułu równoważenia obciążenia między 30 portami. Możesz także użyć pm2 start -i 30 app.jsi pozwolić klastrze nodejs wykonać pracę.
soyuka
11
Uwaga: w cluster modeprocesie głównym występuje pojedynczy punkt awarii.
Karl Pokus,
40

Node.js jest jednowątkowy.

Oznacza to, że tylko 1 rdzeń czterordzeniowego procesora Intel może wykonać aplikację węzła.

To nazywa się: fork_mode.

Używamy go do lokalnego dewelopera .

pm2 start server.js -i 0 pomaga uruchomić 1 wątek węzła na każdym rdzeniu procesora.

I auto-load-zrównoważyć te bezpaństwowców pochodzących żądań.

W tym samym porcie .

Nazywamy to: cluster_mode.

Który jest używany ze względu na wydajność w produkcji .

Możesz także zrobić to na lokalnym deweloperze, jeśli chcesz przetestować swój komputer :)

haotang
źródło
2
Dzięki, to wyjaśnia mi wiele rzeczy na temat nodejs
Rishabh Agrawal
1
świetne wyjaśnienie !!
Piqué,
1
Node.js nie jest jednowątkowy, istnieje (obecnie) jeden wątek przestrzeni użytkownika, ale z pewnością jest obsługiwany przez pulę wątków libuv.
Benjamin Gruenbaum
1
@BenjaminGruenbaum Zgadzam się z tobą. Moje oświadczenie należy rozumieć przy założeniu, że nie wspominam zbyt głęboko do poziomu
libuv
16

Dokumentacja i źródła są tutaj naprawdę mylące.

Czytając o tym w źródłach, jedyną różnicą wydaje się być to, że używają one węzła clusterlub child_processAPI. Ponieważ clusterużywa tego drugiego, faktycznie robisz to samo. W stdiokarczmie dzieje się o wiele więcej zwyczajów fork_mode. Również clustermogą być przekazywane wyłącznie za pomocą sznurków, nie sprzeciwia.

Domyślnie używasz fork_mode. Jeśli przejdziesz tę -i [number]opcję, wejdziesz w cluster_mode, do której zazwyczaj dążysz w / pm2.

Również fork_modeinstancja prawdopodobnie nie może nasłuchiwać na tym samym porcie z powodu EADDRINUSE. cluster_modemogą. W ten sposób możesz również tak zorganizować aplikację, aby działała na tym samym porcie, który jest automatycznie równoważony pod względem obciążenia. Musisz wtedy budować aplikacje bez stanu, np. Sesje, dbs.

eljefedelrodeodeljefe
źródło
1
Wciąż jestem zdezorientowany. clusterwbudowany moduł wykorzystuje child_processwewnętrznie? a twoja sugestia jest taka, że ​​jeśli potrzebuję elastyczności stdio, muszę użyć trybu wideł?
Jinyoung Kim
THe stdiorzeczą jest coś z pm2realizacji „s. Nie martw się tym. Chcesz używać cluster_modew środowisku produkcyjnym, ponieważ wzmacnia twoją instancję, ponieważ działa ona -i [number]w tle. Użyj, fork_modejeśli hartowanie nie jest konieczne lub potrzebujesz lepszych kłód i innych rzeczy.
eljefedelrodeodeljefe
1
Oczywiście również cluster_modezużywa więcej zasobów twojego systemu, ponieważ uruchamiasz -i [number]procesy.
eljefedelrodeodeljefe
Chociaż bardzo doceniłem twoją odpowiedź, nawet teraz nie rozumiem. Większość twoich wyjaśnień to naturalne rzeczy (np. Użycie CLI cluster_mode, równoważenie obciążenia cluster_mode, cluster_modezużywa więcej zasobów ...). To jest powód, dla którego nie głosowałem. Czy mógłbyś wyjaśnić oba proste przypadki użycia? Każdy przypadek musi być rozsądny, dlaczego przyjął swój tryb.
Jinyoung Kim
@eljefedelrodeodeljefe Czy możesz wyjaśnić więcej na temat „Musisz tworzyć aplikacje bez stanu, a potem np. sesje, dbs.”? Dlaczego aplikacja powinna być bez stanu?
STEN