【问题标题】:Node cluster have multiple processes listen to the same port节点集群有多个进程监听同一个端口
【发布时间】:2020-07-30 08:44:35
【问题描述】:

我在阅读 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");
}

test.js

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

【问题讨论】:

    标签: node.js node-cluster


    【解决方案1】:

    不久前我自己也想知道这一点,然后去挖掘。

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

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

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

    如果你想了解更多,这里有一些资源:

    Source code for server.listen() 在这里您可以看到它在某些情况下调用了listenInCluster()

    Net docserver.listen() 中,有提到集群时的特殊处理。

    listenInCluster()source code 本身就是在这里执行契约的地方:

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

    【讨论】:

      【解决方案2】:

      子进程共享父 fd,所以他们最终监听同一个端口。这个answer 可能会消除混乱

      【讨论】:

        猜你喜欢
        • 2013-06-17
        • 2020-04-09
        • 1970-01-01
        • 2023-03-09
        • 2013-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-27
        相关资源
        最近更新 更多