Skip to content

Instantly share code, notes, and snippets.

@objectiveSee
Created September 24, 2013 23:02
Show Gist options
  • Save objectiveSee/6692522 to your computer and use it in GitHub Desktop.
Save objectiveSee/6692522 to your computer and use it in GitHub Desktop.
var cluster = require('cluster'),
redis = require("socket.io/node_modules/redis"),
numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
//master process - fork children
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
// child handlers
cluster.on('exit', function(worker, code, signal) {
console.log('worker ' + worker.process.pid + ' died');
});
cluster.on('disconnect', function(worker, code, signal) {
console.log('worker ' + worker.process.pid + ' disconnected'); // exit soon to follow
});
cluster.on('online', function(worker) {
console.log('worker ' + worker.process.pid + ' is online.');
});
// configure socket server
var RedisStore = require('socket.io/lib/stores/redis')
, pub = redis.createClient()
, sub = redis.createClient()
, client = redis.createClient();
//start socket.io
var io = require('socket.io').listen(5000, {
'store' :new RedisStore({
redisPub : pub
, redisSub : sub
, redisClient : client
}),
});
// socket event routing
io.sockets.on('connection', function (socket) {
console.log('Socket connected on master. Socket='+socket);
socket.on('disconnect', function () {
console.log('Socket disconnected');
});
socket.on('event', function (data) {
console.log('Socket event on master. Data='+JSON.stringify(data));
});
socket.on('hello', function (data) {
console.log('Socket HELLO event on master. Data='+JSON.stringify(data));
var randomIndex = Math.floor(Math.random()*numCPUs)+1;
var someWorker = cluster.workers[randomIndex];
if ( someWorker === undefined ){
console.log('Random index ='+randomIndex);
return;
}
someWorker.send(data);
});
});
io.sockets.on('disconnect', function () {
console.log('Something disconnected on master'); // wtf is this? Not when a socket closes
});
io.sockets.on('error', function () {
console.log('Socket error on master');
});
} else {
var worker = cluster.worker;
var pid = worker.process.pid;
console.log('Worker '+pid+' is alive!. Worker ID is '+worker.id);
worker.on('message', function(data) {
console.log('message received on '+pid+'. Data= '+JSON.stringify(data));
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment