Різниця між кластером та форком у РМ2


89

Я багато шукав, щоб зрозуміти це питання, але ясного пояснення не отримав. Чи є лише одна відмінність у тому, що кластерну програму можна масштабувати, а розгалужену програму не можна?

На загальнодоступному сайті PM2 пояснюється, що режим кластера може виконувати ці функції, але ніхто не говорить про плюси режиму Fork (можливо, він може отримати NODE_APP_INSTANCEзмінну).

Я відчуваю, що кластер може бути частиною Fork, тому що Fork, схоже, використовується загалом. Отже, я вважаю, що Fork означає просто "роздвоєний процес" з точки зору PM2, а Cluster означає "роздвоєний процес, який можна масштабувати". Тоді, чому я повинен використовувати режим Fork?

Відповіді:


121

Основна відмінність між fork_modeі cluster_modeполягає в тому, що він наказує pm2 використовувати api child_process.fork або api кластера .

Що це означає внутрішньо?

Режим вилки

Візьміть forkрежим як основний процес нересту. Це дозволяє змінити exec_interpreter, так що ви можете запустити сервер phpабо pythonсервер з pm2. Так, exec_interpreterце "команда", яка використовується для запуску дочірнього процесу. За замовчуванням pm2 буде використовувати nodeтак, що pm2 start server.jsбуде робити щось на зразок:

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

Цей режим дуже корисний, оскільки надає безліч можливостей. Наприклад, ви можете запустити кілька серверів на заздалегідь встановлених портах, які потім збалансують навантаження за допомогою HAProxy або Nginx.

Кластерний режим

clusterПрацюватиме тільки з , nodeяк це exec_interpreterтому , що вона буде мати доступ до nodejs кластера модуля (наприклад: isMaster, forkметоди і т.д.). Це чудово підходить для управління процесом з нульовою конфігурацією, оскільки процес автоматично розгалужується в декількох екземплярах. Наприклад pm2 start -i 4 server.js, запустить 4 екземпляри server.jsі дозволить модулю кластера обробляти балансування навантаження.


3
питання, засноване на вашій відповіді тут: у мене є варіант використання, який мені потрібно мати, скажімо, 30 екземплярів мого додатка node.js породили унікальним, заздалегідь визначеним номером порту (: 3000 до: 3030), і кожен з екземплярів повинен обробляти певна група користувачів, яка матиме доступ лише через призначений порт. Тому я не хочу, щоб головний процес виконував балансування навантаження, а лише запускав (і продовжував працювати) дочірні процеси. Чи можливо це? Або він намагатиметься розподілити навантаження по всіх породжених дочірніх процесах?
tamak

3
Я б використовував програмний API pm2 для запуску 30 процесів у fork_mode і використовував щось інше як балансування навантаження між 30 портами. Ви також можете використовувати pm2 start -i 30 app.jsкластер nodejs і дозволити виконувати цю роботу.
soyuka

11
Примітка: у cluster modeголовному процесі є одна точка відмови.
Карл Покус,

40

Node.js є однопоточним.

Це означає, що лише 1 ядро ​​чотириядерного процесора Intel може виконувати програму вузла.

Це називається: fork_mode.

Ми використовуємо його для локальних розробників .

pm2 start server.js -i 0 допомагає запустити по 1 вузлу на кожному ядрі вашого процесора.

І автоматично врівноважувати надходження запитів без громадянства.

На тому самому порту .

Ми називаємо це: cluster_mode.

Який використовується заради ефективності виробництва .

Ви також можете зробити це на локальному розробнику, якщо хочете стрес-тест свого ПК :)


2
отже, це багато чого зрозуміло в моїй думці про nodejs
Rishabh Agrawal

1
чудове пояснення !!
Піке

1
Node.js не є однопотоковим, існує (в даний час) один потік користувача, але він, безумовно, підтримується пулом потоків libuv.
Бенджамін Груенбаум,

1
@BenjaminGruenbaum Погодься з вами. Моє твердження слід розуміти з припущення, що я не згадую занадто глибоко до рівня
libuv

16

Документація та джерела тут справді вводять в оману.

Читаючи про це у джерелах, єдиною різницею є те, що вони використовують або вузол, clusterабо child_processAPI. Оскільки clusterвикористовує останнє, ви насправді робите те саме. Є просто набагато більше нестандартних stdioпереїздів, що відбуваються в трактирі fork_mode. Також з ними clusterможна спілкуватися лише за допомогою рядків, а не об'єктів.

За замовчуванням ви використовуєте fork_mode. Якщо ви пройдете -i [number]опцію -option, ви перейдете до cluster_mode, для чого ви, як правило, прагнете w / pm2.

Також fork_modeекземпляр, ймовірно, не може слухати на тому самому порту через EADDRINUSE. cluster_modeможе. Таким чином, ви також можете структурувати додаток для запуску на тому самому порту з автоматичним збалансованим завантаженням. Ви повинні будувати програми без стану, тоді як, наприклад, сеанси, dbs.


1
Я все ще розгублений. clusterвбудований модуль використовує child_processвнутрішньо? і ваша пропозиція полягає в тому, що якщо мені потрібна гнучкість stdio, я повинен використовувати режим Fork?
Jinyoung Kim

THe stdioріч є чим - то pm2реалізації «S. Не хвилюйтеся з цього приводу. Ви хочете використовувати cluster_modeу виробництві, оскільки це зміцнює ваш екземпляр, оскільки він працює -i [number]у фоновому режимі. Використовуйте, fork_modeякщо затвердіння не потрібне або ви хочете покращити колоди та інше.
eljefedelrodeodeljefe

1
Також очевидно cluster_modeвикористовує більше ресурсів вашої системи, оскільки ви запускаєте -i [number]процеси.
eljefedelrodeodeljefe

Хоча я тепло оцінив вашу відповідь, я навіть зараз не зрозумів суті справи. Більшість ваших пояснень - це природні речі (наприклад, використання CLI cluster_mode, баланс навантаження cluster_mode, cluster_modeвикористання більше ресурсів ..). Ось чому я не проголосував. Не могли б ви пояснити обидва прості випадки використання? Кожен випадок повинен бути обґрунтованим, чому він взяв свій режим.
Jinyoung Kim

@eljefedelrodeodeljefe Чи можете ви пояснити більше про "Вам потрібно будувати програми без стану, хоча, наприклад, сеанси, dbs."? Чому програма повинна бути без стану?
STEN
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.