node.js + socket.io + redis体系结构 – 水平serverscaling套接字连接?

我第一次使用node.js并希望得到一个build议:

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

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

首先,我创build了一个快速应用程序:

express testApplication 

在创build的“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服务器必须从接收者中find套接字来发送消息给这个用户。 对我来说,解决scheme是,我为数组中的每个用户存储所有创build的套接字id,并在发送消息时,我selectarrays中相关的套接字id,通过id获取套接字,并将消息发送到套接字)。

这对于仅在一台服务器上运行的socket.io应用程序来说工作得很好。 现在,我想configuration相同的程序,模块和包的另一台服务器。 负载平衡可能会被HAProxy处理。 因此,socket.io连接(套接字)将在服务器A服务器B上存储和pipe理。

示例场景:

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

应用程序知道它怎么可能在服务器B上查找用户B的套接字来发送消息? 在服务器A上它不会find套接字,因为它是在服务器B上创build的。

多谢!

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

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