使用Node.JS和cluster模块。

我试图了解如何多个 fork 的子进程可以在同一端口上监听。

例如,使用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}`);
    });

}

此代码 fork 多个进程,所有这些进程均在同一端口上调用listen。我不清楚所有进程如何绑定(bind)同一端口,仍然能够确定哪个进程获取端口流量。这实际上是一种错觉,而是主进程实际上是绑定(bind)端口并将请求随机传递给派生子进程的唯一进程吗? (如果是这种情况,会不会影响性能?)

感谢您帮助我了解所有子进程如何可以在同一时间在同一端口上进行监听。

请注意,此示例在Windows计算机上运行,​​但是如果我理解正确,则它与Windows和Linux兼容。

最佳答案

从文档Cluster: How It Works:



“顶层”过程是绑定(bind)端口的过程。 IPC channel 自动分配给子进程。 “工作人员可以共享TCP连接”。

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



因此,如果您告诉exclusive,则您可以使它们全部尝试(但失败)绑定(bind)到同一端口,但是默认情况下(这是您的示例中的示例),它们共享句柄,使连接得以分布。

关于node.js - node.js集群模块如何允许多个子进程在同一端口上监听?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59361146/

10-16 20:15