首页 > 解决方案 > 节点集群有多个进程监听同一个端口

问题描述

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

测试.js

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

标签: node.jsnode-cluster

解决方案


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

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

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

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

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

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

Net doc for 中server.listen(),引用了集群时的特殊处理。

在此处执行契约的listenInCluster() 源代码本身:

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

推荐阅读