node.js - 节点集群有多个进程监听同一个端口
问题描述
我在阅读 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");
});
解决方案
不久前我自己想知道这一点,然后去挖掘。
子进程没有监听相同的端口。主进程的传入套接字连接被委派给子进程。
实际发生的事情在这里具有欺骗性,因为您肯定会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);
推荐阅读
- angular - 角度动画停留在 0 高度。并重复 HTML 标签
- linux - 在 crontab 中执行 ping 命令但没有输出
- c# - 如何遍历包含多个错误的字符串?
- flutter - Flutter web socket,事件之间的异步方法
- dataframe - 为什么我只通过选择元组的第一个元素来将元组转换为 DataFrame?
- flutter - 在两个模型之间共享数据颤动
- python - 单击使用 Selenium Python 的复选框?
- flutter - Flutter TextFormField:当我使用控制器时,TextInputType.number 无法正常工作
- python - 如何将 3 轴加速度计数据列表集成到 python 中的速度和位置?
- android - ARCore/SceneForm 显示模型线框模式