2016-05-22 41 views
0

我有socket.io應用程序必須處理大量的命名空間。我想知道什麼是socket.io實例可以處理的命名空間的數量的限制,如果我創建像10k命名空間,是否有任何問題。我如何進行擴展,以便像在多個socket.io實例中一樣進行堆棧(例如,每個實例處理1k個namespance)。實際上,我可以擴展以支持多個用戶,但是我的所有實例都必須處理所有的名稱空間。Socket.io命名空間的限制和如何擴展它

UPDATE1:

我試圖解決的問題是下面,我有一個多人卡片遊戲(如撲克牌),每間客房,其中4名玩家在玩遊戲時,被socketio命名空間建模。由於我期待成千上萬的併發玩家,因此我的socketio實例應該處理這個數量的命名空間。 我已經實現了在Socket.io website中解釋的可伸縮性解決方案。當我擴展時,這個節點片段在新實例中運行,因此它可以處理之前創建的所有命名空間。

rooms.forEach(function(room){ 
    var socketRoom = io.of('/room/' + room.id) 
    .on('connection', function(mySocket){ 
     return handleTableSocket(mySocket, socketRoom, room); 
    }); 
}); 

那麼用socketio命名空間模擬每個遊戲房間是個好主意嗎?如果命名空間的數量增長了呢?

乾杯

回答

1

在socket.io名字空間只是一個Javascript對象,並有維持所有現有的命名空間對象的索引控對象。除了在ndoe.js過程中Javascript對象及其實例數據消耗的內存量之外,您可以擁有的內存數量沒有內在限制。看起來,快速測試你創建你需要的命名空間的數量並測量它們的內存消耗將是一個好的第一步。

您可以通過部署多個node.js進程來縮放node.js中的socket.io。這裏的一般概念在socket.io站點上討論(Using multiple nodes)。該通用方案通過使用redis來管理想要在多個實例之間共享的數據。此方案不會爲特定實例上的特定用戶創建首選項。如果你想這樣做,爲了在每個實例中只有一些命名空間,那麼這可能是用自定義編碼完成的,但是你必須解釋更多關於你試圖解決的問題我們對如何解決這個問題有很多想法。同樣,如果您分享了您試圖解決的實際問題(而不是您剛纔嘗試的解決方案),那麼我們可能會想出一個比10k實際名稱空間更高效的解決方案,方法是使用您自己的數據結構比通用名稱空間更針對您的特定問題。

+1

@ hamou92 - 你有沒有任何理由將每個遊戲都建模爲一個「房間」而不是命名空間。我相信socket.io中的房間是一個比命名空間更輕的對象,我認爲一個房間仍然會爲您提供您想要的通信功能。 – jfriend00

+0

我在做出選擇之前做了一些研究。它似乎像名稱空間給更多的分離http://stackoverflow.com/questions/10930286/socket-io-rooms-or-namespacing – hamou92

+0

@ hamou92 - 這是否回答你的問題? – jfriend00

相關問題