Node.js集群:管理员工

时间:2017-03-07 12:47:07

标签: node.js multithreading cluster-computing worker

我们深入了解Node.js架构,以实现完全理解,如何扩展我们的应用程序。 清晰的解决方案是群集使用https://nodejs.org/api/cluster.html。除了工人管理层描述之外,一切似乎都很好:

  

然而,Node.js不会自动管理您的工作人员数量。您有责任根据应用程序的需要管理工作池。

我在寻找,如何真正管理工人,但大多数解决方案都说:

  

启动这么多工作人员,因为你有核心。

但我想根据服务器上的当前负载动态扩大或缩小我的工作人员数量。因此,如果服务器上有负载并且队列越来越长,我想开始下一个工作。换句话说,当没有那么多负载时,我想关闭工人(并留下f.e.至少2个)。

理想的地方,将是我的主进程队列,以及新请求进入主进程时的事件。在这个地方,我们可以决定是否需要下一个工人。

您是否有从群集中的主线程管理工作人员的任何解决方案或经验?动态启动和杀死它们?

此致

拉​​狄克

2 个答案:

答案 0 :(得分:0)

以下代码将帮助您了解根据请求创建群集。

该程序将在每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;
  }
}

答案 1 :(得分:0)

要手动管理您的员工,您需要一个消息传递层来促进进程间通信。通过IPC主服务器和工作服务器可以有效地进行通信,默认情况下和架构立场这一行为已经在流程模块本机中实现。但是我发现本机实现不够灵活或不够健壮,无法处理由于网络请求引起的水平扩展。

一个明显的解决方案Redis作为消息代理来促进这种主从通信方法。然而,这个解决方案也是因为它的故障,即上下文延迟,直接与命令和回复相关联。

进一步的研究使我成为了RabbitMQ,非常适合在多个工作人员之间分配耗时的任务。工作队列(又称:任务队列)背后的主要思想是避免立即执行资源密集型任务而不得不等待它去完成。相反,我们安排任务稍后完成。我们将任务封装为消息并将其发送到队列。在后台运行的工作进程将弹出任务并最终执行作业。当您运行许多工作人员时,他们之间将共享任务。

要实现强大的服务器,请阅读此链接,它可能会提供一些见解。 Link