首页 文章

Node.js集群:管理员工

提问于
浏览
1

我们正在深入研究Node.js架构,以实现完全理解,如何扩展我们的应用程序 . 清除解决方案是群集使用情况https://nodejs.org/api/cluster.html . 一切似乎都很好,除了 Worker 管理描述:

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

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

开始这么多 Worker ,因为你有核心 .

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

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

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

问候,

拉德克

2 回答

  • 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;
      }
    }
    
  • 0

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

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

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

    要实现一个健壮的服务器,请阅读此链接,它可能会提供一些见解 . Link

相关问题