有人可以详细解释核心cluster模块在Node.js中的工作原理吗?
工人如何听单个端口?
据我所知,主进程会进行监听,但是如何知道哪些端口可以监听,因为工作程序是在主进程之后启动的?他们是否通过child_process.fork
通信渠道以某种方式将其传达给主人?如果是这样,端口的传入连接如何从主服务器传递给工作者?
此外,我想知道用什么逻辑来确定传入连接传递给哪个工作者?
答案 0 :(得分:13)
我知道这是一个老问题,但现在在nodejs.org上解释here:
使用child_process.fork方法生成工作进程, 这样他们就可以通过IPC和父服务器与父母进行通信 来回处理。
当你在一个worker中调用server.listen(...)时,它将序列化 参数并将请求传递给主进程。如果是主人 进程已经有一个与工作者匹配的侦听服务器 要求,然后它将句柄传递给工人。如果没有 已经有一个匹配该要求的监听服务器,然后它 将创建一个,并将句柄传递给worker。
这会在三种边缘情况下引起潜在的惊人行为:
server.listen({fd:7}) - 因为消息传递给master, 将监听父级中的文件描述符7和句柄 传递给工人,而不是听工人的想法 7号文件描述符引用的内容。
server.listen(句柄) - 明确地侦听句柄会导致 工人使用提供的手柄,而不是与主人交谈 处理。如果工人已经掌握了手柄,那么就可以认为 你知道你在做什么。
server.listen(0) - 通常,这会导致服务器监听 随机端口。但是,在群集中,每个工作人员都会收到相同的内容 每次他们听的时候都是“随机”端口(0)。从本质上讲,港口是 第一次随机,但此后可以预测。如果你想 侦听唯一端口,根据集群生成端口号 工人ID。
当多个进程都接受()在同一个底层上时 资源,操作系统非常负载均衡 有效率的。 Node.js或程序中没有路由逻辑, 并且工人之间没有共享状态。因此,重要的是 设计你的程序,使其不太依赖 用于会话和登录等事物的内存数据对象。
因为工人都是独立的过程,所以他们可能会被杀死 根据您的计划需求重新生成,而不会影响其他人 工作人员。只要有一些工人还活着,服务器 将继续接受连接。节点不会自动进行 但是,管理你的工人数量。这是你的 负责根据您的应用需求管理工作池。
答案 1 :(得分:9)
NodeJS使用round-robin决策在子进程之间进行负载平衡。它将基于RR算法将传入连接提供给空进程。
孩子和父母实际上并没有共享任何东西,整个脚本从头到尾执行,这是正常C fork之间的主要区别。传统的C分叉子将继续执行它离开的指令,而不是像NodeJS那样的开头。因此,如果要共享任何内容,则需要连接到MemCache或Redis等缓存。
所以下面的代码在控制台上产生6 6 6
(没有恶意)。
var cluster = require("cluster");
var a = 5;
a++;
console.log(a);
if ( cluster.isMaster){
worker = cluster.fork();
worker = cluster.fork();
}
答案 2 :(得分:4)
这是解释此
的blog post答案 3 :(得分:0)
作为对@ OpenUserX03的回答的更新,nodejs不再使用系统负载平衡,而是使用内置的。来自this post:
要修复Node v0.12使用循环算法获得一个新实现,以更好的方式在工作者之间分配负载。这是Node从那时起使用的默认方法,包括Node v6.0.0