node.js + socket.io + redis 架构 - 水平服务器缩放套接字连接?

标签 node.js express redis socket.io scalability

我是第一次使用 node.js,希望得到建议:

我在我的服务器上安装了以下程序:

  • node.js v0.11.3-pre
  • express v3.3.4
  • socket.io v0.9.14
  • connect-redis v1.4.5
  • Redis 服务器 v=2.6.14
  • redis-cli 2.6.14

首先,我创建了一个 express 应用:

express testApplication

在创建的“package.json”中,我定义了所有必要的依赖项。

从一开始我就在名为“cluster.js”的文件中定义了一个用于垂直扩展(多进程)的集群:

var cluster = require('cluster');

if( cluster.isMaster ) {
        var noOfWorkers = process.env.NODE_WORKERS || require('os').cpus().length;

        console.log("Workers found: " + noOfWorkers);

        for (var i = 0; i < noOfWorkers; i += 1) {
                cluster.fork();
        }
} else {
        require('./app.js');
}

cluster.on('exit', function(worker, code, signal) {
        var exitCode = worker.process.exitCode;

        console.log('worker' + worker.process.pid + ' died (' + exitCode + '). restarting...');

        if( typeof cluster.workers[worker.id] != "undefined" )
                cluster.workers[worker.id].delete();

        cluster.fork();
});

在我的“app.js”文件中,我为 socket.io 存储定义了 REDIS:

  io.set('store', new RedisStore({
            redisPub: pub,
            redisSub: sub,
            redisClient: client
          }));

到目前为止,一切都很好,所有这些都很好。

当客户端连接到 socket.io 服务器时,集群会处理与不同工作人员的连接。

我的意图是,客户端可以向特定的另一个客户端发送消息,因此 socket.io 服务器必须从接收者那里找到套接字,以便只将消息发送给该用户。我的解决方案是,我将所有为每个用户创建的套接字 ID 存储在一个数组中,并且在发送消息时,我在数组中选择相关的套接字 ID,通过 ID 获取套接字,并将消息发送到套接字(s ).

这对于仅在一台服务器上运行的 socket.io 应用程序非常有效。 现在,我想用相同的程序、模块和包配置另一台服务器。 负载平衡可能会由 HAProxy 处理。因此 socket.io 连接(套接字)将在 Server AServer B 上存储和管理。

示例场景:

用户 A 连接到服务器 A用户 B 连接到服务器 B。这意味着,用户 A 在服务器 A 上有一个套接字,而用户 B 在服务器 B 上有一个套接字。

应用程序怎么可能知道它必须在服务器 B 上寻找用户 B 的套接字才能发送消息?在服务器 A 上它找不到套接字,因为它是在服务器 B 上创建的。

非常感谢!

最佳答案

当您进行横向扩展时,您需要在服务器之间共享一个数据存储。方便的是,你已经有了一个理想的,那就是 Redis。无需将套接字映射保存在数组中,您需要将其推送到 Redis,并从那里进行查找。

然后,您可以决定让服务器相互发送消息,或者更灵活地通过 Redis 发送消息。因此,每个服务器都会查看它在 Redis 上的队列,以查看它应该将哪些消息发送到哪些套接字。当服务器收到一条消息时,它将把它推送到 Redis 中,发送给应该传递它的服务器。如果消息的顺序对您很重要,我建议您查看 https://github.com/learnboost/kue作为 Redis 之上的层。

关于node.js + socket.io + redis 架构 - 水平服务器缩放套接字连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17853719/

相关文章:

windows - 在 Windows 上启动 Redis 服务器。 window 自己关闭

redis - AppFabric 缓存到 Redis - 等效于 GetAndLock 方法?

angularjs - 我试图运行 sb-admin-bs4-angular2-master 这是一个 nodejs 应用程序,当我运行 npm install 时出现以下错误

node.js - 我可以阻止 ejs 评估包含连字符的日期吗?

node.js - Multer 文件上传错误

express - IIS Express Worker崩溃MVC asp.net

windows - 在 Windows 上启动 Redis 失败

Node.js 错误 : %1 is not a valid Win32 application

javascript - ExpressJS 改变路由而不刷新

javascript - 响应不返回数据