Friday, May 17, 2024
 Popular · Latest · Hot · Upcoming
97
rated 0 times [  102] [ 5]  / answers: 1 / hits: 16377  / 13 Years ago, mon, december 19, 2011, 12:00:00

I'm looking to get Socket.io to work multi-threaded with native load balancing (cluster) in Node.js v.0.6.0 and later.



From what I understand, Socket.io uses Redis to store its internal data. My understanding is this: instead of spawning a new Redis instance for every worker, we want to force the workers to use the same Redis instance as the master. Thus, connection data would be shared across all workers.



Something like this in the master:



RedisInstance = new io.RedisStore;


The we must somehow pass RedisInstance to the workers and do the following:



io.set('store', RedisInstance);


Inspired by this implementation using the old, 3rd party cluster module, I have the following non-working 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);
})
});
}


Thoughts? I might be going completely in the wrong direction, anybody can point to some ideas?


More From » node.js

 Answers
12

Actually your code should look like this:



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);
})
});
}


Another option is to open Socket.IO to listen on multiple ports and have something like HAProxy load-balance stuff.
Anyway you know the most important thing: using RedisStore to scale outside a process!



Resources:



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


[#88482] Saturday, December 17, 2011, 13 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
jackie

Total Points: 442
Total Questions: 107
Total Answers: 94

Location: Honduras
Member since Sun, Dec 26, 2021
2 Years ago
jackie questions
Sat, Sep 18, 21, 00:00, 3 Years ago
Wed, Jul 14, 21, 00:00, 3 Years ago
;