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

Epe*_*eli 34 tcp node.js

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

工人如何听单个港口?

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

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

Ope*_*X03 13

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

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

当您在worker中调用server.listen(...)时,它会序列化参数并将请求传递给主进程.如果主进程已经具有与工作者要求匹配的侦听服务器,则它将句柄传递给工作者.如果它还没有匹配该要求的侦听服务器,那么它将创建一个,并将句柄传递给worker.

这会在三种边缘情况下导致潜在的惊人行为:

server.listen({fd:7}) - 因为消息被传递给主服务器,所以父服务器中的文件描述符7将被监听,并且句柄传递给工作者,而不是监听工作者对数字的想法7个文件描述符引用.

server.listen(handle) - 显式地监听句柄会导致worker使用提供的句柄,而不是与master进程通信.如果工人已有手柄,则假定您知道自己在做什么.

server.listen(0) - 通常,这将导致服务器侦听随机端口.但是,在群集中,每个工作人员每次收听时都会收到相同的"随机"端口(0).本质上,端口第一次是随机的,但此后可以预测.如果要侦听唯一端口,请根据群集工作程序ID生成端口号.

当多个进程都在相同的底层资源上接受()时,操作系统可以非常有效地对它们进行负载均衡.Node.js或程序中没有路由逻辑,工作者之间也没有共享状态.因此,设计程序非常重要,因为它不会过多地依赖内存数据对象来处理会话和登录等事情.

由于工人都是独立的流程,因此可以根据您的计划需求杀死或重新生成工作,而不会影响其他工作人员.只要有一些工作人员还活着,服务器就会继续接受连接.但是,节点不会自动管理您的工作人员数量.您有责任根据应用程序的需要管理工作池.


Mus*_*afa 9

NodeJS使用循环决策在子进程之间进行负载平衡.它将基于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();
}
Run Code Online (Sandbox Code Playgroud)

  • 我发现在Windows上它不服从Round Robin.我可以产生10个工人,如果我的机器足够快,它会将所有传入的连接抛给第一个工人.有什么建议? (2认同)
  • 直到v0.11才进行循环访问http://strongloop.com/strongblog/whats-new-in-node-js-v0-12-cluster-round-robin-load-balancing/ (2认同)

az7*_*7ar 5

这是一篇 解释这一点的博客文章

  • 请注意,不鼓励仅使用链接答案,因此答案应该是搜索解决方案的终点(而不是参考文献的另一个中途停留点,随着时间的推移,参考文献往往会变得陈旧)。请考虑在此处添加独立的概要,并保留链接作为参考。 (5认同)