我是第一次使用 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 A 和 Server 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/