使用socket.io-redis和RedisToGo在Heroku上扩展到2+ dynos

时间:2015-03-03 21:29:23

标签: node.js sockets heroku redistogo socket.io-redis

我尝试使用socket.io-redis将我在Heroku上的应用扩展到2个dynos(或更多)。这是我的代码(其中config.redis只是一个包含RedisToGo端口,主机和传递值的对象):

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

在客户端,我有:

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

..所以socket.io并没有尝试使用轮询。

我还为RedisToGo配置了正确的Heroku env vars(REDISTOGO_HOST, REDISTOGO_PASS,REDISTOGO_PORT)。

当我们缩放到1 dyno时,套接字行为是完美的。在2个dynos中,行为是关闭的 - 请求被随机地发送到1 dyno或另一个,并且发出的套接字事件仅发送到在请求所针对的dyno上运行的客户端而不是全部(套接字) .io-redis& RedisToGo应该照顾好。)

任何想法都将不胜感激!

1 个答案:

答案 0 :(得分:1)

不确定这是否对你有所帮助,但我正在以这种方式使用redis和socketio,它运作良好。

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