【问题标题】:Scaling Socket.IO across multiple servers跨多个服务器扩展 Socket.IO
【发布时间】:2015-08-29 13:48:13
【问题描述】:

我一直在寻找有关为 Node.js Socket.IO 安装设置多服务器集群的帮助。这就是我想要做的:

  • 在 F5 负载均衡器中有 1 个 VIP,指向 n 运行 Express 和 Socket.IO 的节点服务器数量
  • 让客户端通过 io.connect 连接到该 1 个 VIP,然后让它过滤到负载均衡器后面的服务器之一。
  • 当消息在其中任何一个服务器上发出时,它会发送给正在侦听该事件并通过其他服务器连接的所有用户。

例如 - 如果我们在 LB1 (F5) 后面有服务器 A、服务器 B 和服务器 C,并且用户 A 连接到服务器 A,用户 B 连接到服务器 B,用户 C 连接到服务器 C。

在“聊天”场景中 - 基本上,如果从服务器 A 向message 事件发出消息 - 服务器 B 和 C 也应该将消息发送到它们连接的客户端。我读到使用socket-io.redis 可以做到这一点,但它需要一个Redis 盒子——应该安装在哪个服务器上?如果所有服务器都连接到同一个 Redis 盒子 - 这会自动工作吗?

var io = require('socket.io')(server);
var redis = require('socket.io-redis');
io.adapter(redis({ host: 'localhost', port: 6379 }));

任何帮助将不胜感激!

【问题讨论】:

  • 似乎一个很好的解决方案是在 express 服务器上的不同 socket.io 实例之间启用对等通信,这样它们就可以彼此保持同步。您可以使用类似scuttlebutt 及其event emitter
  • 使用socket.io-redis 适配器确实会自动(通过一些配置)实现您正在寻找的东西。只要所有 Socket.IO 实例都订阅了它,Redis 服务器将侦听哪个节点并不重要。
  • 是的 - 我之前应该尝试过这个,但@hexacyanide 是正确的 - 只要每个人都连接到同一个 redis 盒子,它就可以完全开箱即用。对于以后来这篇文章的任何人 - 它只是工作。很抱歉浪费大家的时间:-(
  • 如果您的问题已解决,您可以自己回答或删除它,而不是将其留在此处。
  • @gregavola 我正面临这个确切的问题。你最终在哪台服务器上运行了 redis 盒子?在我看来,redis 盒子可以在 VIP 或任何节点上运行。但是,如果带有 redis 的节点以任何方式停止运行,整个集群都会停止运行。在 VIP 上运行 redis 的想法对我来说不是很有吸引力。

标签: node.js express socket.io


【解决方案1】:

这个问题的答案是,您必须在您的 SocketIO 集群之外设置一个单一的 Redis 服务器 - 并让所有节点都连接到它。

然后您只需将其添加到代码的顶部,它就会神奇地运行而没有任何问题。

var io = require('socket.io')(server);
var redis = require('socket.io-redis');
io.adapter(redis({ host: 'localhost', port: 6379 }));

【讨论】:

    猜你喜欢
    • 2015-07-28
    • 2011-07-20
    • 1970-01-01
    • 2012-04-11
    • 2017-02-03
    • 2010-10-08
    • 2013-06-30
    • 1970-01-01
    • 2014-06-09
    相关资源
    最近更新 更多