gpt4 book ai didi

node.js - Node 集群有多个进程监听同一个端口

转载 作者:行者123 更新时间:2023-12-01 21:41:47 24 4
gpt4 key购买 nike

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

最佳答案

我自己刚才也想知道这个问题,然后开始挖掘。

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

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

如果我正在设计它,我可能不会将此功能隐藏在 .listen() 中并导致这种困惑。在这种情况下,我会提供一种不同的方法来使用这种特殊行为。

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

Source code对于 server.listen(),您可以看到它在某些情况下会调用 listenInCluster()

Net doc对于server.listen(),有引用集群时的特殊处理。

listenInCluster() source code本身就是在这里进行行为的地方:

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

关于node.js - Node 集群有多个进程监听同一个端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61261621/

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