【发布时间】:2012-07-09 02:21:16
【问题描述】:
我希望其他人以前遇到过这个问题:
问题描述
我已将 Socket.IO 配置为使用 redis-store 模块,该模块非常适合在向房间广播/发出事件时保持我们的节点实例同步。但是我一直在测试故障点,似乎当 redis 实例重新启动时,节点服务器停止接收来自其他节点的消息。
这是我如何设置 socket.io 客户端(在这段代码之前创建 redis 连接)
// Setup the socket server for web clients
self.ioServer = socketIo.listen(9000);
self.ioServer.enable('browser client minification'); // send minified client
self.ioServer.set('log level', 3);
self.ioServer.set( 'store', new socketIo.RedisStore ({
redisPub: self.redisPub,
redisSub: self.redisSub,
redisClient: self.redisStore
})
);
本质上,当 redis 崩溃/重启时,socket.io redis-store 无法继续通过 redis 向其他节点服务器发送事件。
我需要采取什么特殊步骤来重新连接到 redis 服务器吗?我花了很多时间四处寻找,希望能找到解决这个问题的方法,但没有任何运气。
问候,
-瑞恩
【问题讨论】:
-
注意:如果你最终在你的 redis 存储上使用了密码,你需要将 redis 模块本身作为你的 RedisStore 构造函数的一部分传递到 'redis' 键下。欲了解更多信息,请参阅:stackoverflow.com/questions/13438613/…
-
你有机会解决这个问题吗?我很好奇,因为我在一组工作人员上运行 Socketio,并且存在许多相关问题。今天刚碰到他们……
-
@mvblfst - 遗憾的是,由于我们在这个项目中遇到的问题,我们离开了 Socket.io,转而使用 Sock.js (github.com/sockjs/sockjs-node),并且还没有回头。我还没有看到 Socket.io 的最新更改,但我听说 1.0 版将包含许多修复,包括 redis 存储的问题。如果您考虑 Sockjs,要记住的一件事是,它是一个比 Socket.io 低得多的库,所以如果您需要频道和组,您将不得不自己构建它。希望这会有所帮助。
-
嘿瑞恩。实际上,我只是在负载平衡故事下查看github.com/sockjs/sockjs-client/wiki/…。而且我没有看到他们关于共享套接字连接池的建议——这是我们在多个 Nodejs 线程上运行 socketio 时面临的问题。
-
您可以采取几个方向,您可以在同一台机器上使用不同的端口运行多个“线程”,并让负载均衡器处理选择服务器;但我建议启用粘性会话以防止请求访问没有该用户会话记录的不同线程。另一种方法是:不要使用具有多个线程和运行在其上的服务器的大型机器,而是使用多台小型机器,每台机器运行一个进程,这有助于减轻节点故障造成的损害。希望对您有所帮助!
标签: node.js redis socket.io node-redis