2014-03-25 33 views
0

我有一個問題...我想運行一個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是解決方案的重要組成部分,並未納入上述代碼中,但這是下一步。

回答

0

您可以嘗試SocketCluster(http://socketcluster.io/) - 它專爲在多個CPU內核上運行而設計,它具有用於在工作人員之間共享數據的共享數據存儲。它建立在Engine.io之上 - 我是主要的contibutor。你應該檢查GitHub頁面的文檔,看它是否適合你:https://github.com/TopCloud/socketcluster

相關問題