Узел кластера имеет несколько процессов, слушающих один и тот же порт - PullRequest
0 голосов
/ 17 апреля 2020

Я читал о кластерах в Node js Я натолкнулся на простой пример, тогда как основной файл создает четыре дочерних процесса, и каждый из них слушает порт 8080.

Код работает хорошо, но я не get:

Как можно иметь несколько дочерних процессов для прослушивания одного и того же порта?

Я ожидал получить сообщение типа

Ошибка: прослушать EADDRINUSE : адрес уже используется ::: 8080

const cluster = require("cluster");

if (cluster.isMaster) {
  for (let i = 0; i <= 4; i++) cluster.fork();
} else {
  require("./test.js");
}

тест. js

const http1 = require("http");
http1
  .createServer((req, res) => {
    console.log("request1");
    res.write("hello1");
    res.end();
  })
  .listen(8080, () => {
    console.log("begin");
  });

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Я некоторое время задавался вопросом об этом go и продолжал копать.

Дочерние процессы не прослушивают один и тот же порт. Входящие сокетные соединения с главным процессом делегируются дочерним процессам.

То, что на самом деле происходит, обманчиво, потому что вы наверняка видите server.listen() в каждом дочернем процессе. Но внутри .listen() есть некие маги c, которые знают о том факте, что этот процесс предназначен для кластерного процесса, поэтому вместо фактического прослушивания в традиционном смысле (который действительно может вызвать ошибку, которую вы цитируете), они прослушивание делегированных сокетов от их родителя.

Если бы я проектировал это, я, вероятно, не спрятал бы эту функциональность внутри .listen() и вызвал бы эту путаницу. Я бы предоставил другой метод, который будет использоваться в этих обстоятельствах, который несет в себе это особое поведение.

Если вы хотите узнать больше об этом, вот несколько ресурсов:

Исходный код для server.listen(), где вы можете видеть, что в некоторых случаях он вызывает listenInCluster().

В Net do c для server.listen() имеются ссылки на специальная обработка при кластеризации.

Исходный код listenInCluster() * * * * * * * * * * * * *, где здесь выполняется документ:

  // Get the master's server handle, and listen on it
  cluster._getServer(server, serverQuery, listenOnMasterHandle);
0 голосов
/ 17 апреля 2020

дочерний процесс совместно использует родителей fd, поэтому они прослушивают один и тот же порт. этот ответ может устранить путаницу

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