Как работает модуль кластера в Node.js? - PullRequest
32 голосов
/ 23 марта 2012

Может кто-нибудь подробно объяснить, как работает базовый cluster модуль в Node.js?

Как работники могут прослушивать один порт?

КакНасколько я знаю, главный процесс выполняет прослушивание, но как узнать, какие порты прослушивать, поскольку рабочие запускаются после основного процесса?Они как-то сообщают это мастеру, используя канал связи child_process.fork?И если так, как входящее соединение с портом передается от мастера к работнику?

Также мне интересно, какая логика используется для определения, какому работнику передается входящее соединение?

Ответы [ 4 ]

13 голосов
/ 01 февраля 2015

Я знаю, что это старый вопрос, но теперь он объясняется на сайте nodejs.org здесь:

Рабочие процессы создаются методом child_process.fork, поэтомучто они могут общаться с родителем через IPC и передавать серверные дескрипторы туда и обратно.

Когда вы вызываете server.listen (...) в работнике, он сериализует аргументы и передает запрос главному процессу,Если главный процесс уже имеет прослушивающий сервер, соответствующий требованиям рабочего, он передает дескриптор работнику.Если у него еще нет прослушивающего сервера, соответствующего этому требованию, он создаст его и передаст дескриптор работнику.

Это может привести к неожиданному поведению в трех крайних случаях:

server.listen ({fd: 7}) - поскольку сообщение передается мастеру, дескриптор файла 7 в родительском файле будет прослушиваться, а дескриптор передается работнику, а не прослушивать представление работника о том, что число 7ссылки на дескриптор файла.

server.listen (handle) - явное прослушивание дескрипторов заставит работника использовать предоставленный дескриптор, а не общаться с главным процессом.Если рабочий уже имеет дескриптор, то предполагается, что вы знаете, что делаете.

server.listen (0) - Обычно это приводит к тому, что серверы прослушивают случайный порт.Однако в кластере каждый работник будет получать один и тот же «случайный» порт каждый раз, когда они слушают (0).По сути, порт является случайным в первый раз, но предсказуемым впоследствии.Если вы хотите прослушивать уникальный порт, сгенерируйте номер порта на основе идентификатора работника кластера.

Когда все процессы принимают () на одном и том же базовом ресурсе, балансировка нагрузки операционной системы между нимиочень эффективно.В Node.js или в вашей программе нет логики маршрутизации и нет общего состояния между работниками.Поэтому важно спроектировать вашу программу так, чтобы она не слишком сильно зависела от объектов данных в памяти для таких вещей, как сеансы и вход в систему.

Поскольку все рабочие процессы - это отдельные процессы, их можно уничтожить или повторнопорождается в зависимости от потребностей вашей программы, не затрагивая других работников.Пока некоторые работники еще живы, сервер будет продолжать принимать соединения.Однако Node не может автоматически управлять количеством работников для вас.Вы несете ответственность за управление рабочим пулом для нужд вашего приложения.

9 голосов
/ 23 марта 2012

NodeJS использует решение round-robin для балансировки нагрузки между дочерними процессами.Это даст входящие соединения пустому процессу на основе алгоритма RR.

Дочерние и родительские элементы на самом деле ничего не делят, весь сценарий выполняется от начала до конца, что является основным отличием обычного C-форка.Традиционный C-разветвленный ребенок продолжит выполнение из инструкции, в которой он был оставлен, а не из начала, как NodeJS.Поэтому, если вы хотите поделиться чем-либо, вам необходимо подключиться к кешу, например MemCache или Redis.

Таким образом, приведенный ниже код выдает на консоли 6 6 6 (без злых средств).

var cluster = require("cluster");
var a = 5;
a++;
console.log(a);
if ( cluster.isMaster){
    worker = cluster.fork();
    worker = cluster.fork();
}
4 голосов
/ 04 августа 2013

Вот сообщение в блоге , которое объясняет это

0 голосов
/ 26 января 2018

В качестве обновления ответа @ OpenUserX03, nodejs больше не использует системные балансировки нагрузки, а использует встроенный. с этот пост :

Чтобы исправить это, Node v0.12 получил новую реализацию, использующую алгоритм циклического перебора для лучшего распределения нагрузки между работниками. Это подход по умолчанию, который Node использует с тех пор, включая Node v6.0.0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...