我希望让Socket.io在Node.js v.0.6.0及更高版本中使用native load balancing(“cluster”)进行多线程处理。
据我了解,Socket.io使用Redis存储其内部数据。我的理解是:我们不想为每个工作者生成一个新的Redis实例,而是强制工作者使用与主服务器相同的Redis实例。因此,连接数据将在所有工作人员之间共享。
大师这样的事情:
RedisInstance = new io.RedisStore;
我们必须以某种方式将RedisInstance
传递给工人并执行以下操作:
io.set('store', RedisInstance);
受到使用旧的第三方群集模块的this implementation的启发,我有以下非工作实现:
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);
})
});
}
思考?我可能会完全走错方向,任何人都可以指出一些想法吗?
答案 0 :(得分:10)
实际上你的代码应该是这样的:
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);
})
});
}
另一种选择是打开Socket.IO来监听多个端口并拥有类似HAProxy负载均衡的东西。 无论如何,你知道最重要的事情:使用RedisStore在流程外扩展!
资源:
http://nodejs.org/docs/latest/api/cluster.html
How can I scale socket.io?
How to reuse redis connection in socket.io?
Node: Scale socket.io / nowjs - scale across different instances
http://delicious.com/alessioaw/socket.io