我有一個問題...我想運行一個NodeJS socket-server(我的決定是使用EngineIO,從性能/跨瀏覽器等等讀取),並能夠擴展(增加內核)。因此,我想用戶集羣模塊(即使在實驗階段,似乎每個人都說它可靠)。我研究了在nginx中使用負載均衡器,但是對於這個項目來說這似乎有點複雜(在所有地方都提到這是高級選項)。Node.JS可擴展(使用Node.JS集羣)套接字服務器與Engine.IO,配對/同步(也稱爲第二個屏幕)兩個設備,在同一個工作人員...
所以我需要解決的大問題是:我需要在同一個線程上有兩個不同的設備,以便他們可以「交談」(第二個屏幕解決方案>例如:https://www.google.com/intl/en/chrome/browser/promo/supersync/)。無論如何,EngineIO似乎不支持共享存儲(例如共享的RedisStore),並且我認爲它有點太高級以至於無法實現我自己...
所以我在考慮將每個進程工作者放在不同端口上的設置,然後,當其中一個設備連接到該特定工作者上的EngineIO實例(由nodejs集羣負載平衡)時,它可以顯示唯一的代碼(應在第二個設備上輸入),最後一位數字將讓第二個設備知道要連接的端口。我發現我需要每個設備連接到同一線程(或至少第一個設備,因爲當我連接EngineIO時,我不知道該工作者的端口)的每個設備的連接需要sticky-session。
我管理在不同的端口上啓動多個工作人員...但是有些東西感覺不對,我沒有發現任何實現這種結構的開發人員的例子,也許這並不是錯誤的,但我覺得我應該得到某些人的意見。我的問題是:這是一個好主意,有不同端口上不同的工作進程,才能夠知道與第二裝置連接到哪個端口事情是這樣的:?
var cluster = require('cluster'),
http = require('http');
var numCPUs = require('os').cpus().length; // or just hardcode to 2, when not more than one cpu is available...
if (cluster.isMaster) {
// Fork workers.
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('listening', function(worker, address) {
console.log("worker.id: " + worker.id);
});
} else {
console.log("cluster.worker.id: " + cluster.worker.id);
http.createServer(function(req, res) {
res.writeHead(200);
res.end("hello world " + cluster.worker.id + "\n");
}).listen(8000 + parseInt(cluster.worker.id));
}
,當然,引擎IO是解決方案的重要組成部分,並未納入上述代碼中,但這是下一步。