2012-01-31 65 views
2

我使用縮放Socket.IO和廣播到所有屬於客戶

快遞與「連接,Redis的」會話存儲

而且I tied it with Socket.IO through configuring "authorization"

所以我就不說了必須實際使用

socket.get 

socket.set 

存儲和檢索客戶端的所有變量。

但我不確定如果我將消息廣播給特定的人羣,連接到不同的服務器,則可以成功地獲取消息。

所以它是真正的縮放!

但它似乎不是真正縮放但只能使用Redis作爲單獨的存儲值。

而且I tried to use

RedisStore

這是由Socket.IO

給出不起作用。

跟它

DEBUG: TypeError: Converting circular structure to JSON 
    at Redis.stringify [as pack] (native) 
    at Redis.publish (/var/www/node_modules/socket.io/lib/stores/redis.js:106:31) 
    at Manager.handleClient (/var/www/node_modules/socket.io/lib/manager.js:646:18) 
    at Manager.handleHTTPRequest (/var/www/node_modules/socket.io/lib/manager.js:595:8) 
    at Manager.handleRequest (/var/www/node_modules/socket.io/lib/manager.js:557:12) 
    at HTTPServer.<anonymous> (/var/www/node_modules/socket.io/lib/manager.js:112:10) 
    at HTTPServer.emit (events.js:70:17) 
    at HTTPParser.onIncoming (http.js:1507:12) 
    at HTTPParser.onHeadersComplete (http.js:102:31) 
    at Socket.ondata (http.js:1403:22) 

我如何可以擴展Socket.IO與廣播到所有的客戶比例可用?

編輯:我跟着the Express-Session-Socket.IO tutorial,我發現, io.authorization實際上使問題,但它是沒有io.authorization。 那是怎麼回事?

+0

您能否澄清您想要廣播的特定用戶羣?例如,這些用戶是同一個頻道的用戶(socket.join())還是連接到同一個網址(即/ chat/1或/ chat/2)的用戶? – mtsr 2012-01-31 08:22:02

+0

@mtsr所有用戶使用相同的命名空間或相同的頻道,但使用不同的服務器(縮放) – InspiredJW 2012-01-31 09:27:47

+0

命名空間可以通過簡單地將這些用戶路由到同一臺服務器來完成。由於頻道在建立連接後連接起來會更加困難。 – mtsr 2012-02-01 09:31:32

回答

2

Socket.IO有他自己的授權。它授權每個套接字。 RedisStore你擴展到所有可用bradcasting客戶

io.set('authorization', function (handshakeData, callback) { 
     //your auth logic 
}); 

隨着我的例子:要自定義socket.IO驗證,使用我的代碼,寫io.configure函數內。

+0

當授權成功時,我應該調用** callback(null,true); **但是,此回調函數實際上導致問題:( – InspiredJW 2012-02-04 02:55:28

+0

沒有回調函數,RedisStore運行良好。有人說它有內存泄漏問題,是真的嗎?另外我發現我必須使用** Redis.get()和Redis.set()**而不是使用** Socket.get()和Socket .set()**用於存儲值。我希望我可以動態加入並離開房間。不斷開我的連接立即離開所有房間。 – InspiredJW 2012-02-04 02:58:16

+0

@InspiredJW當我調用callback(null,true)時,我沒有在我的代碼中,你會看到我使用client.broadcast.to(Room).json.send,在內部Scoket.io設置爲Redis。 我不知道你在問什麼,但我幾乎可以肯定你也可以打電話給斷開連接。閱讀wiki:https:// gith ux.com/LearnBoost/socket.io – elranu 2012-02-06 14:14:38