集群模块如何在Node.js中运行?

时间:2012-03-22 21:21:22

标签: node.js tcp

有人可以详细解释核心cluster模块在​​Node.js中的工作原理吗?

工人如何听单个端口?

据我所知,主进程会进行监听,但是如何知道哪些端口可以监听,因为工作程序是在主进程之后启动的?他们是否通过child_process.fork通信渠道以某种方式将其传达给主人?如果是这样,端口的传入连接如何从主服务器传递给工作者?

此外,我想知道用什么逻辑来确定传入连接传递给哪个工作者?

4 个答案:

答案 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