2017-03-07 95 views
1

我们潜水的Node.js架构更深,以达到充分的了解,如何扩大我们的应用程序。 清除溶液是集群使用https://nodejs.org/api/cluster.html。一切似乎都很好,除了工人管理描述:Node.js的集群:管理工作者

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

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

启动这么多工人,你已经有了核心。

但我想动态地放大或缩小我的工人数,这取决于服务器上的当前负载。所以如果服务器上有负载,队列变长,我想开始下一个工作。以另一种方式,当没有那么多负担,我想关闭工人(离开F.E.其中最小2)。

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

你有任何解决方案或经验,从管理的主线程工人集群?动态启动并杀死它们?

问候,

拉狄克

回答

0

下面的代码将帮助您了解,以请求的基础上创建集群。

这一计划将genrate在每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 master和worker可以有效地进行通信,默认情况下和架构立场上,这种行为已经在本地处理模块中实现。不过,我发现本地实现不够灵活或足够强大,以处理由于网络请求而导致的水平缩放。

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

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

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