Node.js,multithreading和Socket.io

我正在使用Node.js v.0.6.0及更高版本来使Socket.io与本地负载平衡 (“集群”)进行multithreading工作。

据我所知,Socket.io使用Redis来存储其内部数据。 我的理解是这样的:我们不是为每个工人产生一个新的Redis实例,而是强迫工作人员使用与Master相同的Redis实例。 因此,连接数据将在所有工作人员中共享。

主人这样的事情:

RedisInstance = new io.RedisStore; 

我们必须以某种方式将RedisInstance传递给工人,并执行以下操作:

 io.set('store', RedisInstance); 

受此旧版本的第三方群集模块的启发,我有以下非工作实现:

 var cluster = require('cluster'); var http = require('http'); var numCPUs = require('os').cpus().length; if (cluster.isMaster) { // Fork workers. for (var i = 0; i < numCPUs; i++) { cluster.fork(); } var sio = require('socket.io') , RedisStore = sio.RedisStore , io = sio.listen(8080, options); // Somehow pass this information to the workers io.set('store', new RedisStore); } else { // Do the work here io.sockets.on('connection', function (socket) { socket.on('chat', function (data) { socket.broadcast.emit('chat', data); }) }); } 

思考? 我可能完全走错了方向,有人可以指点一些想法吗?

其实你的代码应该是这样的:

 var cluster = require('cluster'); var http = require('http'); var numCPUs = require('os').cpus().length; if (cluster.isMaster) { // Fork workers. for (var i = 0; i < numCPUs; i++) { cluster.fork(); } } else { var sio = require('socket.io') , RedisStore = sio.RedisStore , io = sio.listen(8080, options); // Somehow pass this information to the workers io.set('store', new RedisStore); // Do the work here io.sockets.on('connection', function (socket) { socket.on('chat', function (data) { socket.broadcast.emit('chat', data); }) }); } 

另一个select是打开Socket.IO来监听多个端口,并且有类似HAProxy负载平衡的东西。 无论如何,你知道最重要的事情:使用RedisStore在一个进程外扩展!

资源:

http://nodejs.org/docs/latest/api/cluster.html
我怎样才能缩放socket.io?
如何在socket.io中重用redis连接?
节点:缩放socket.io / nowjs – 在不同实例之间进行缩放
http://delicious.com/alessioaw/socket.io