2012-01-31 33 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