gpt4 book ai didi

node.js - Node.js集群模块如何允许多个子进程监听同一个端口?

转载 作者:太空宇宙 更新时间:2023-11-03 22:04:03 24 4
gpt4 key购买 nike

使用 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)端口并将请求随机传递给 fork 子进程的进程? (如果是这样的话,性能不会受到影响吗?)

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

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

最佳答案

来自文档 Cluster: How It Works :

The cluster module supports two methods of distributing incoming connections.

The first one (and the default one on all platforms except Windows), is the round-robin approach, where the master process listens on a port, accepts new connections and distributes them across the workers in a round-robin fashion, with some built-in smarts to avoid overloading a worker process.

The second approach is where the master process creates the listen socket and sends it to interested workers. The workers then accept incoming connections directly.

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

另一个重要部分是server.listen()独占属性.

If exclusive is false (default), then cluster workers will use the same underlying handle, allowing connection handling duties to be shared. When exclusive is true, the handle is not shared, and attempted port sharing results in an error. An example which listens on an exclusive port is shown below.

因此,如果您告诉它们是独占,那么您可以让它们全部尝试(并失败)绑定(bind)到同一个端口,但默认情况下(这就是在您的示例中),它们共享句柄,从而允许分发连接。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com