Разница в кластере и вилке в PM2
Я много искал, чтобы выяснить этот вопрос, но я не получил ясного объяснения. Есть ли только одна разница в том, что кластерное приложение можно масштабировать, а разветвленное приложение не может быть?
Общественный сайт PM2 объясняет, что режим кластеров может выполнять эту функцию, но никто не говорит о преимуществах режима Fork (возможно, он может получить NODE_APP_INSTANCE
переменная).
Мне кажется, что Cluster может быть частью вилки, потому что Fork, похоже, используется в целом. Итак, я полагаю, что Fork означает просто "разветвленный процесс" с точки PM2, а Cluster означает "разветвленный процесс, который можно масштабировать". Тогда почему я должен использовать режим Fork?
Ответы
Ответ 1
Основное различие между fork_mode
и cluster_mode
заключается в том, что он заказывает pm2 для использования child_process.fork api или cluster 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
и пусть модуль кластера справится с балансировкой нагрузки.
Ответ 2
Node.js является однопоточным.
Это означает, что только 1 ядро вашего четырехъядерного процессора Intel может выполнить приложение node.
Он вызвал: fork_mode
.
Мы используем его для локального dev.
pm2 start server.js -i 0
помогает вам запускать 1 node поток на каждом ядре вашего процессора.
И автозагрузка-баланс запросы без апатрита.
На одном и том же порту.
Назовем это: cluster_mode
.
Используется для производительности при производстве.
Или событие на локальном dev.
Если вы хотите подчеркнуть тест ур ПК:)
Ответ 3
Документация и источники действительно вводят в заблуждение.
Чтение этого в источниках, по-видимому, единственные различия, что они используют либо API node cluster
, либо child_process
. Поскольку cluster
использует последнее, вы на самом деле делаете то же самое. Существует гораздо больше пользовательских stdio
, проходящих вокруг текущей гостиницы fork_mode
. Также cluster
можно передавать только с помощью строк, а не объектов.
По умолчанию используется fork_mode
. Если вы пройдете -i [number]
-option, вы перейдете в cluster_mode
, который вы обычно нацеливаете на w/pm2
.
Также экземпляр fork_mode
, возможно, не может прослушивать один и тот же порт из-за EADDRINUSE
. cluster_mode
может. Таким образом, вы также можете структурировать приложение для работы на том же порту, который автоматически загружается. Вы должны создавать приложения без состояния, тогда как, например, сеансов, dbs.