【问题标题】:How does node.js cluster module allow multiple child process to listen on the same port?node.js集群模块如何允许多个子进程监听同一个端口?
【发布时间】:2020-04-09 04:24:12
【问题描述】:

使用 Node.JS 和 cluster 模块。

我试图了解多个分叉子进程如何在同一个端口上侦听。

例如,使用cluster 模块我们可以这样做:

const port = 443;
...
if (cluster.isMaster) {
    for(let i = 0; i < numCPUs; i++)
    {
        cluster.fork();
    }
...
}
else // Forked child processes:
{
... 
    https.createServer({
        key: fs.readFileSync('server.key'),
        cert: fs.readFileSync('server.cert')
    }, app)
    .listen(port, () => {
        console.log(`HTTPS Listening on port ${port}`);
    });

}

这段代码分叉了多个进程,所有进程都在同一个端口上调用listen。我不清楚所有进程如何绑定同一个端口并且仍然能够确定哪个进程获得端口流量。这实际上是一种错觉吗?相反,主进程实际上是唯一一个绑定端口并将请求随机传递给分叉子进程的进程? (如果是这种情况,是否会影响性能?)

感谢您帮助我了解所有子进程如何同时侦听同一端口。

请注意,此示例在 Windows 机器上运行,但如果我理解正确,它同时兼容 Windows 和 Linux。

【问题讨论】:

    标签: node.js fork port node-cluster


    【解决方案1】:

    来自文档Cluster: How It Works

    cluster 模块支持两种分发传入的方法 连接。

    第一个(以及除 Windows 之外的所有平台上的默认值), 是循环方法,主进程监听一个 端口,接受新连接并将它们分发给工作人员 以循环方式,有一些内置的智能可以避免 重载工作进程。

    第二种方法是主进程创建监听 套接字并将其发送给感兴趣的工人。然后工人们接受 直接传入连接。

    “顶级”进程是绑定端口的进程。 IPC 通道自动分发给子进程。 "Workers 可以共享 TCP 连接"。

    另一个重要的部分是server.listen()exclusive 属性。

    如果exclusivefalse(默认),那么集群工作人员将使用 相同的底层句柄,允许连接处理职责 共享。当exclusivetrue 时,句柄不共享,并且 尝试共享端口会导致错误。一个听的例子 在一个专用端口上如下所示。

    所以如果你告诉它们是exclusive,那么你可以让它们都尝试(但失败)绑定到同一个端口,但默认情况下(这就是你的示例中的内容),它们共享句柄,允许连接被分发。

    【讨论】:

    • 我仍在试图弄清楚集群工作人员如何共享同一个句柄。我知道他们这样做,我只是看不到它在代码中的位置。如 OP 的问题所示,集群的初始化代码仅显示了调用 .listen() 的工作人员,这与主监听和分发相反。这是怎么回事?
    • @jfriend00 我也想弄清楚这一点。我正在研究node/lib/internal/cluster/master.js 如何在queryServer 中创建RoundRobinHandle。似乎有特殊的internalMessage 触发了特殊处理并导致集群使用共享连接。
    • server.listen() 是否知道集群子状态,所以它并没有真正从头开始监听,而只是与父级通信?我能想到的就这些了。
    • @RyanGriggs - 嗯,这只是现代操作系统的限制。一个端口上确实只有一个真正的侦听器。幸运的是,master 通常所做的只是调度,这在 TCP 堆栈中已经有点瓶颈,所以它不应该以任何有害的方式增加瓶颈。请记住,在这里完成所有实际工作的是子进程。主人应该有足够的空闲时间。
    • @RyanGriggs - 大规模执行此操作的硬件辅助方法是使用专门的负载均衡器或代理(如 nginx)在一组侦听服务器之间分配请求。然后,您不仅可以在同一台服务器上的不同进程之间进行负载均衡,还可以在不同服务器之间进行负载均衡。所以,有规模的层次。单个服务器上的集群是从单个 node.js 进程扩展的下一层。通过涉及更多硬件,甚至最终涉及边缘服务器和多个数据中心,当然还有更高的层次。
    猜你喜欢
    • 2020-07-30
    • 2013-06-17
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多