Lindsay Levine
Lindsay Levine

Reputation: 41

Scaling to 2+ dynos on Heroku with socket.io-redis and RedisToGo

I'm trying to use socket.io-redis to scale my app on Heroku to 2 dynos (or more). Here is my code (where config.redis is just an object housing RedisToGo port, host, and pass values):

var redisApp = require('redis');
var redis = require('socket.io-redis');    
if(process.env.NODE_ENV === 'production') {
   var socketpub = redisApp.createClient(config.redis.port, config.redis.host, {auth_pass: config.redis.pass, return_buffers: true});
   var socketsub = redisApp.createClient(config.redis.port, config.redis.host, {auth_pass: config.redis.pass, detect_buffers: true});
   var client = redisApp.createClient(config.redis.port, config.redis.host, {auth_pass: config.redis.pass, return_buffers: true});
   socketio.adapter(redis({
      pubClient: socketpub,
      subClient: socketsub,
      redisClient: client
   }));
}

On the client side I have:

var ioSocket = io('', {
  path: '/socket.io-client',
  'force new connection': true,
  transports: ['websocket']
});

..so socket.io doesn't try to use polling.

I also have the right Heroku env vars configured for RedisToGo (REDISTOGO_HOST, REDISTOGO_PASS, REDISTOGO_PORT).

When we're scaled to 1 dyno, the socket behavior is perfect. At 2 dynos, the behavior is way off - requests are being randomly made to either 1 dyno or the other, and the socket events being emitted are sent only to clients running on the dyno to which the request was made and not all (which socket.io-redis & RedisToGo should be taking care of).

Any thoughts would be greatly appreciated!

Upvotes: 4

Views: 655

Answers (1)

Wilson
Wilson

Reputation: 9136

not sure if this helps you but I am using in this way redis and socketio and it is working good.

var redis = require('redis').createClient;
var adapter = require('socket.io-redis');
var port = config.redistogo.port;
var host = config.redistogo.host;

var pub = redis(port, host, {
  auth_pass: auth_pass
});

var sub = redis(port, host, {
  detect_buffers: true,
  auth_pass: auth_pass
});

io.adapter(adapter({
  pubClient: pub,
  subClient: sub
}));

Upvotes: 1

Related Questions