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

4

我正在尝试使用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不会尝试使用轮询。

我还正确配置了Heroku环境变量,用于RedisToGo(REDISTOGO_HOST、 REDISTOGO_PASS、 REDISTOGO_PORT)。

当我们扩展到1个dyno时,socket的行为是完美的。但是在2个dynos时,行为就失常了--请求随机地发送给其中一个dyno,而发出的socket事件仅发送给在该请求被发送的dyno上运行的客户端,而不是所有客户端(这应该由socket.io-redis和RedisToGo负责处理)。

如有疑问,请欢迎提出!

1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接