2017-04-07 77 views
0

我正在使用具有node.js的集羣模塊從多個cpu核心(我的情況是4)中受益。問題是,如果工作人員忙,下一個請求僅在大約10秒後被委派給另一個可用工作者,這是不可接受的。我使用無限循環來測試羣集如下:節點js - 請求委託之前的集羣延遲

var cluster = require ('cluster'); 

if (cluster.isMaster) { 
    var cpuCount = require('os').cpus().length; 
    for (var i = 0; i < cpuCount-1; ++i) { 
     cluster.fork(); 
    } 
} else { 
    var express = require('express'); 
    var app = express(); 

    app.get('/', function (req, res) { 
     console.log('Served by worker %d!', cluster.worker.id); 
     while(true) {} 
     console.log("done"); 
     res.status(200).send(); 
    }); 

    app.listen(8080, function() { 
     console.log('Worker %d running!', cluster.worker.id); 
    }); 
} 

cluster.on('exit', function (worker) { 
    console.log('Worker %d died :(', worker.id); 
    cluster.fork(); 
}); 

起初我打開本地主機:在瀏覽器8080和日誌信息「由工人1先得」瞬間打印。然後,我在新標籤中打開相同的頁面,並且僅在10秒後打印「由工作人員2提供」。爲什麼會這樣,我如何將請求立即委託給可用的工作人員?

+0

我的猜測是'cluster'依靠主進程和子進程能夠相互通信。如果您完全用無限循環阻止子進程,則該通信將被有效阻止。 – robertklep

回答

0

哪個核心運行load-balancer方法?也許平衡器太忙了,因爲無限循環將請求發送到其他應用程序。

事實上一個for..loop同步工作,並且如果load-balancer方法是在相同的應用程序和核心與loop然後負載平衡器從不工作,如果有一個inifinite循環。

我強烈建議使用PM2來創建羣集。一個已經開發了多年的圖書館提供的遠遠超出了你的期望。

祝你好運..

+0

感謝您的諮詢!但是,pm2根據AGPL獲得許可。這會對商業軟件造成一些限制嗎?我通常更喜歡MIT/BSD許可的圖書館。 – eko