节点集群有多个进程监听同一个端口

Geo*_*ris 3 node.js node-cluster

我在阅读有关 Node js 中的集群的内容时遇到了一个简单的示例,而主文件创建了四个子进程,每个进程都监听 8080 端口。

代码运行良好,但我不明白:

如何让多个子进程监听同一个端口?

我期待收到这样的消息

错误:监听 EADDRINUSE:地址已在使用中 :::8080

const cluster = require("cluster");

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

测试.js

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

jfr*_*d00 14

不久前我自己也想知道这个问题并开始挖掘。

子进程没有监听同一端口。与主进程的传入套接字连接被委托给子进程。

这里实际发生的事情是欺骗性的,因为您肯定会server.listen()在每个子进程中看到 。但是,内部.listen()有一些魔法知道这个进程是一个集群进程,因此它们不是在传统意义上实际监听(这确实会导致您引用的错误),而是监听来自其的委托套接字。父母。

如果我设计这个,我可能不会隐藏这个功能.listen()并导致这种混乱。我会提供一种在这种情况下使用的不同方法来实现这种特殊行为。

如果您想了解更多相关信息,这里有一些资源:

server.listen() 您可以看到它在某些情况下调用的源代码listenInCluster()

Net 文档server.listen(),引用了集群时的特殊处理。

此处执行行为的listenInCluster() 源代码本身:

  // Get the master's server handle, and listen on it
  cluster._getServer(server, serverQuery, listenOnMasterHandle);
Run Code Online (Sandbox Code Playgroud)