Skip to content

Instantly share code, notes, and snippets.

@mkuklis
Created October 31, 2012 07:27
Show Gist options
  • Save mkuklis/3985606 to your computer and use it in GitHub Desktop.
Save mkuklis/3985606 to your computer and use it in GitHub Desktop.
scalable socket.io with redis and node-http-proxy
// balancer node
var httpProxy = require('http-proxy');
var uuid = require('node-uuid');
var Cookies = require('cookies');
var redis = require('redis');
var connect = require('connect');
var express = require('express');
var RedisStore = require('connect-redis')(express);
var redisClient = redis.createClient();
var port = 8000;
// available servers
var targets = [
{ host: '127.0.0.1', port: 8090 },
{ host: '127.0.0.1', port: 8091 },
{ host: '127.0.0.1', port: 8092 },
{ host: '127.0.0.1', port: 8093 }];
// redis session store
var session = {
secret: 'secret',
key: 'express.sid',
store: new RedisStore({ client: redisClient })
};
// build proxies
var proxies = targets.map(function(target) {
return new httpProxy.HttpProxy({ target: target });
});
var proxiesHash = {};
var app = express.createServer(express.logger());
app.get('/socket.io/:ver', function (req, res) {
var cookies = new Cookies( req, res);
var cookie = cookies.get('ws');
if (!cookie) {
cookie = uuid.v1();
cookies.set('ws', cookie);
}
if (!proxiesHash[cookie]) {
var proxy = proxies.shift();
proxiesHash[cookie] = proxy;
proxies.push(proxy);
}
proxiesHash[cookie].proxyRequest(req, res);
});
// configure express
app.configure(function () {
app.use(express.cookieParser());
app.use(express.logger('dev'));
app.use(express.methodOverride());
app.use(express.session(session));
app.use(connect.compress());
app.use('view engine', 'html');
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
app.use(express.static(__dirname + '/public'));
});
app.on('upgrade', function (req, socket, head) {
var cookies = new Cookies(req);
var cookie = cookies.get('ws');
if (!proxiesHash[cookie]) return;
proxiesHash[cookie].proxyWebSocketRequest(req, socket, head);
});
app.listen(port);
// ----------------------------------------------------------------
// server node
var redis = require('redis');
var sio = require('socket.io');
var RedisStore = sio.RedisStore;
var port = parseInt(process.argv[2]) || 8090;
var io = sio.listen(port);
io.set('store', new RedisStore({
redisPub: redis.createClient(),
redisSub: redis.createClient(),
redisClient: redis.createClient()
}));
io.sockets.on('connection', function (socket) {
socket.on('ping', function (data) {
socket.broadcast.emit('pong', data);
});
});
// --------------------------------------------------------------
// client node
var port = 8000;
var io = require('socket.io-client');
var socket = io.connect('http://localhost:' + port);
socket.on('connect', function () {
socket.emit('ping', 'hi from client: ' + port);
});
socket.on('pong', function (data) {
console.log(data);
});
// start balancer
node balancer.js
// start 2 servers on port 8090 and 8091
node server.js 8090
node server.js 8091
// access http://127.0.0.1:8080
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment