我们正在深入研究Node.js体系结构,以充分理解如何扩展我们的应用程序。清晰的解决方案是集群使用https://nodejs.org/api/cluster.html。除了工人管理描述外,一切似乎都很好:
但是,Node.js不会自动管理您的员工数量。根据应用程序的需要管理员工池是您的责任。
我在寻找如何真正管理员工,但大多数解决方案都说:
启动这么多的工人,因为你有核心。
但是,我希望根据服务器上当前的负载动态地增加或减少我的员工数量。因此,如果服务器上有负载,队列越来越长,我想启动下一个工作者。另一方面,当没有那么多的负荷时,我想关闭工人(并离开f.e。(其中至少有2项)。
理想的地方,将是我的主进程队列,和事件时,新的请求是来主进程。在这个地方,我们可以决定是否需要下一个工人。
您有管理集群中的主线程的解决方案或经验吗?动动地杀了他们?
致以敬意,
拉德克
发布于 2017-03-07 13:05:13
下面的代码将帮助您理解如何根据请求创建集群。
这个程序将在每10个请求中生成一个新的集群。
注意:您需要打开http://localhost:8000/并刷新页面以增加请求。
var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;
var numReqs = 0;
var initialRequest = 10;
var maxcluster = 10;
var totalcluster = 2;
if (cluster.isMaster) {
// Fork workers.
for (var i = 0; i < 2; i++) {
var worker = cluster.fork();
console.log('cluster master');
worker.on('message', function(msg) {
if (msg.cmd && msg.cmd == 'notifyRequest') {
numReqs++;
}
});
}
setInterval(function() {
console.log("numReqs =", numReqs);
isNeedWorker(numReqs) && cluster.fork();
}, 1000);
} else {
console.log('cluster one initilize');
// Worker processes have a http server.
http.Server(function(req, res) {
res.writeHead(200);
res.end("hello world\n");
// Send message to master process
process.send({ cmd: 'notifyRequest' });
}).listen(8000);
}
function isNeedWorker(numReqs) {
if( numReqs >= initialRequest && totalcluster < numCPUs ) {
initialRequest = initialRequest + 10;
totalcluster = totalcluster + 1;
return true;
} else {
return false;
}
}发布于 2017-06-13 23:40:23
要手动管理员工,您需要一个消息传递层来促进进程间的通信。与IPC主机和工作人员可以有效地通信,默认情况下和体系结构站点这种行为已经在本机流程模块中实现。但是,我发现本机实现不够灵活或健壮,不足以处理由于网络请求而导致的水平扩展。
一个显而易见的解决方案是Redis作为消息代理来促进主从通信的这种方法。然而,这个解决方案也是它的错误,这是上下文延迟,直接链接到命令和回复。
进一步的研究让我想到了RabbitMQ,它非常适合在工作队列后面的多个workers.The主要思想(也就是任务队列)中分配耗时的任务,目的是避免立即执行资源密集型的任务,并且必须等待它完成。相反,我们会安排稍后完成的任务。我们将任务封装为一条消息,并将其发送到队列。在后台运行的工作进程将弹出任务并最终执行作业。当您运行许多员工时,任务将在他们之间共享。
若要实现健壮的服务器,请阅读此链接,它可能会给出一些见解。链接
https://stackoverflow.com/questions/42648732
复制相似问题