2017-03-07 140 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