首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Node.js集群:管理员工

Node.js集群:管理员工
EN

Stack Overflow用户
提问于 2017-03-07 12:47:07
回答 2查看 1.4K关注 0票数 1

我们正在深入研究Node.js体系结构,以充分理解如何扩展我们的应用程序。清晰的解决方案是集群使用https://nodejs.org/api/cluster.html。除了工人管理描述外,一切似乎都很好:

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

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

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

但是,我希望根据服务器上当前的负载动态地增加或减少我的员工数量。因此,如果服务器上有负载,队列越来越长,我想启动下一个工作者。另一方面,当没有那么多的负荷时,我想关闭工人(并离开f.e。(其中至少有2项)。

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

您有管理集群中的主线程的解决方案或经验吗?动动地杀了他们?

致以敬意,

拉德克

EN

回答 2

Stack Overflow用户

发布于 2017-03-07 13:05:13

下面的代码将帮助您理解如何根据请求创建集群。

这个程序将在每10个请求中生成一个新的集群。

注意:您需要打开http://localhost:8000/并刷新页面以增加请求。

代码语言:javascript
复制
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;
  }
}
票数 0
EN

Stack Overflow用户

发布于 2017-06-13 23:40:23

要手动管理员工,您需要一个消息传递层来促进进程间的通信。与IPC主机和工作人员可以有效地通信,默认情况下和体系结构站点这种行为已经在本机流程模块中实现。但是,我发现本机实现不够灵活或健壮,不足以处理由于网络请求而导致的水平扩展。

一个显而易见的解决方案是Redis作为消息代理来促进主从通信的这种方法。然而,这个解决方案也是它的错误,这是上下文延迟,直接链接到命令和回复。

进一步的研究让我想到了RabbitMQ,它非常适合在工作队列后面的多个workers.The主要思想(也就是任务队列)中分配耗时的任务,目的是避免立即执行资源密集型的任务,并且必须等待它完成。相反,我们会安排稍后完成的任务。我们将任务封装为一条消息,并将其发送到队列。在后台运行的工作进程将弹出任务并最终执行作业。当您运行许多员工时,任务将在他们之间共享。

若要实现健壮的服务器,请阅读此链接,它可能会给出一些见解。链接

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42648732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档