【问题标题】:Scaling Socket.IO and broadcast to all belonging clients扩展 Socket.IO 并广播到所有所属的客户端
【发布时间】:2012-02-22 21:38:14
【问题描述】:

我正在使用

使用“connect-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 也可以ok。 怎么样?

【问题讨论】:

  • 您能否说明您要广播的特定用户组?例如,这些用户是在同一个频道(socket.join())还是连接到同一个 url(即 /chat/1 或 /chat/2)的用户?
  • @mtsr 所有用户在同一命名空间或同一频道但在不同的服务器(缩放)
  • 命名空间可以通过简单地将这些用户路由到同一台服务器来完成。使用频道会更困难,因为频道是在建立连接后加入的。
  • @mstr 除了频道,我认为难点在于让 socket.io 服务器向所有位于不同服务器但在同一命名空间中的所属人员广播。我该怎么做?
  • @InspiredJW 奇怪的是我的 RedisStore 版本不适合你。您使用的是哪个版本的 Socket.io?我用 0.8.7 写了这个例子

标签: node.js redis scalability socket.io


【解决方案1】:

Socket.IO 有自己的授权。它为每个套接字授权。要自定义socket.IO Auth,使用我的代码,在io.configure函数里面写:

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

在我的示例 RedisStore 中,您可以扩展到所有可用的广播客户端。

【讨论】:

  • 授权成功后,我应该调用callback(null, true); 但是这个回调函数实际上导致了问题:(
  • 没有回调函数,RedisStore 可以正常工作。有人说它有内存泄漏问题。这是真的吗?另外我发现我必须使用 Redis.get() 和 Redis.set() 而不是使用 Socket.get() 和 Socket.set() 来存储价值观。我希望我可以动态加入和离开房间。无需断开连接即可立即离开所有房间。
  • @InspiredJW 当我调用回调(null,true)时,我没有收到错误。关于目前的泄漏,我没有。在我的代码中你会看到我使用了client.broadcast.to(Room).json.send,在Scoket.io内部对Redis进行了设置。我不知道你在问什么。但我几乎可以肯定你也可以调用断开连接。阅读维基:github.com/LearnBoost/socket.io
  • 谢谢人。房间加入和离开功能适用于 Socket.io。我查阅了 RedisStore 源文件,发现你已经实现了 RedisClient 订阅和取消订阅功能。
猜你喜欢
  • 2019-04-01
  • 2016-07-21
  • 2018-01-09
  • 2017-02-26
  • 2015-07-04
  • 1970-01-01
  • 2017-05-26
  • 1970-01-01
  • 2022-01-22
相关资源
最近更新 更多