集群模块如何在Node.js中工作?

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

工作人员如何能够听一个单一的港口?

据我所知,主进程进行监听,但是由于在主进程之后启动了工作进程,因此如何知道要监听哪个端口? 他们是否通过使用child_process.fork沟通渠道以某种方式与主人沟通? 如果是这样,到端口的传入连接是如何从主机传递给工作人员的?

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

谢谢。

我知道这是一个古老的问题,但是现在在nodejs.org 这里解释:

工作进程使用child_process.fork方法产生,以便它们可以通过IPC与父进程进行通信并来回传递服务器句柄。

当您在worker中调用server.listen(…)时,它将序列化参数并将请求传递给主进程。 如果主进程已经有一个监听服务器匹配工作人员的要求,那么它将句柄传递给工作人员。 如果它没有一个符合这个要求的监听服务器,那么它将创build一个,并把句柄传递给worker。

这在三个边缘情况下导致潜在的令人惊讶的行为:

server.listen({fd:7}) – 因为消息被传递给master,所以parent中的文件描述符7将被监听,并且把句柄传递给worker,而不是听取worker的想法7个文件描述符引用。

server.listen(句柄) – 显式地监听句柄会导致工作人员使用提供的句柄,而不是与主进程交谈。 如果工作人员已经有了手柄,那么推测你知道你在做什么。

server.listen(0) – 通常,这将导致服务器侦听随机端口。 但是,在群集中,每个工作人员每次听(0)时都会收到相同的“随机”端口。 从本质上说,港口是第一次随机的,但在此后可以预见。 如果要在独特端口上侦听,请根据群集工作器ID生成端口号。

当多个进程都接受相同的底层资源时,操作系统将非常有效地在它们之间进行负载均衡。 Node.js中或程序中没有路由逻辑,工作者之间没有共享状态。 因此,devise你的程序是非常重要的,因为它不会太依赖于内存中的数据对象,例如会话和login。

因为员工都是独立的stream程,所以他们可以根据自己的计划需求而被杀死或重新产生,而不会影响到其他员工。 只要还有一些工人还活着,服务器就会继续接受连接。 但是,节点不会自动pipe理您的工作人员数量。 您有责任根据应用程序的需要pipe理工作人员池。

NodeJS使用循环决策来在subprocess之间进行负载平衡。 它将根据RRalgorithm将传入连接提供给一个空进程。

孩子和父母实际上并没有分享任何东西,整个脚本是从头到尾执行的,这是正常C叉的主要区别。 传统的C分叉的孩子会继续执行从它离开的指令,而不是像NodeJS开始。 所以,如果你想共享任何东西,你需要连接到像MemCache或Redis的caching。

所以下面的代码在控制台上产生6 6 6 (没有邪恶手段)。

 var cluster = require("cluster"); var a = 5; a++; console.log(a); if ( cluster.isMaster){ worker = cluster.fork(); worker = cluster.fork(); } 

这里是一个博客文章 ,解释这一点