Created
October 31, 2012 07:27
-
-
Save mkuklis/3985606 to your computer and use it in GitHub Desktop.
scalable socket.io with redis and node-http-proxy
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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