【问题标题】:How to scale socket.io without redis如何在没有 redis 的情况下扩展 socket.io
【发布时间】:2014-03-03 11:10:17
【问题描述】:

我目前正在寻找使用 socket.io 扩展我的 express 应用程序的替代方法。问题是我不想使用 redis 作为 socket.io 存储。除了Clusterhub 之外,还有其他集群 socket.io 的可能性吗?

编辑:我尝试使用fakeredis 作为redis 的替代品,但它似乎不适用于socket.io。来自ActionHero.js,我知道faye-websocket 可以与 fakeredis 一起使用。

【问题讨论】:

  • redis 有什么问题?
  • redis 没有问题。我只是不想为我的节点应用程序提供任何专有软件,因为我想将其用作节点 Webkit 应用程序。
  • Redis 是开源的,其他任何东西都是专有的。如果你说你想把它作为一个 node-webkit 应用程序提供,我会假设它会被部署到台式电脑上。 Node 和 socket.io 能够处理 10.000 甚至更多的套接字连接。你确定你需要更多吗?
  • 我需要通过 websocket 进行 200-300 个并发连接。你认为一个线程就足够了吗?
  • 当然。应该没有任何麻烦。已经有节点应用程序能够在一个线程上处理 25 万个连接。

标签: node.js express socket.io


【解决方案1】:

这很可能取决于您的 socket.io 使用情况和您想要实现的扩展类型(集群与扩展到多台机器)。

所以,这就是我将 socket.io 的使用扩展到多个服务器的方法。

我们在负载均衡器后面有 3 个服务器,当一个套接字连接时,它连接到 3 个服务器中的任何一个,这三个服务器有一个内存中的套接字列表,这三个服务器有一个内部服务器地址的顺序列表,例如[服务器 1,服务器 2,服务器 3]。

我所做的基本上是一个环(内部我们称之为“套接字环”):

  • 如果我需要从 server1 向套接字发送事件,我首先查看套接字是否连接到该 server1,如果没有,我会向下一个服务器 (server2) 发送 http 请求,该服务器将检查套接字是否存在,如果不存在,它将向 server3 发送相同的请求,依此类推,直到到达源点,在这种情况下您可能会抛出错误。
  • 如果我需要广播消息,这几乎是一样的,我从一个服务器开始,然后在其他服务器上调用 http 端点。

我用来确定下一个节点(next_node.js)的算法是:

var nodes = process.env.NODES.split(',');
//this is usually:  http://server1/,http://server2/,http://server3/

var url = require('url');
var current = require("os").hostname();

//origin is the node that started the lookup
exports.get = function (origin) {
  var next_node_i = nodes.map(function (uri) {
    return url.parse(uri).hostname;
  }).reduce(function (prev, curr, i, arr){
    return curr === current && i < arr.length - 1 ? i + 1 : prev;
  }, 0);

  var next_node = nodes[next_node_i];

  if (origin && url.parse(next_node).hostname === origin) {
    // if the next node is equal to the first node initiating the lookup
    // it means the socket we are looking for is not connect to any node.
    return null;
  }

  return next_node;
};

注意事项:

  • 这些服务器和网络分区之间的延迟很低,不太可能,它们在物理上位于同一个数据中心。但如果是网络分区,对我们来说就没那么重要了。
  • 我们总是在同一个方向运行环。一个改进的版本将是双向运行(?)
  • 服务器共享一个秘密来调用这些端点。

在我看来,这是在许多 socket.io 用例中实现扩展的一种非常简单的方法,可能还有很多其他场景无法选择,但我希望这能提供一些想法。

【讨论】:

  • 您不使用 Redis 而是实现自己的算法的原因是什么?
【解决方案2】:

如果您对 Azure 服务感到满意,Azure 团队中的一些人已经冒昧地写了一封 service bus store for socket.io

Glenn Block Explains Socket.IO Scale-Out on Service Bus

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    • 2022-06-15
    • 2014-05-05
    • 2017-07-19
    • 1970-01-01
    • 2014-12-07
    相关资源
    最近更新 更多