有人可以详细解释核心集群模块在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或程序中没有路由逻辑,工作者之间也没有共享状态.因此,设计程序非常重要,因为它不会过多地依赖内存数据对象来处理会话和登录等事情.
由于工人都是独立的流程,因此可以根据您的计划需求杀死或重新生成工作,而不会影响其他工作人员.只要有一些工作人员还活着,服务器就会继续接受连接.但是,节点不会自动管理您的工作人员数量.您有责任根据应用程序的需要管理工作池.
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)
归档时间: |
|
查看次数: |
7439 次 |
最近记录: |