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

我正在尝试使用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(REDISTOGO_HOST,REDISTOGO_PASS,REDISTOGO_PORT)configuration了正确的Heroku环境variables。

当我们缩放到1个dynamic时,套接字行为是完美的。 在2个dynos中,行为是closures的 – 请求被随机发送到1个dyno或者其他的,并且发送的套接字事件只被发送到运行在请求发起的testing器上的客户端,而不是全部(哪个套接字.io-redis&RedisToGo应该照顾)。

任何想法将不胜感激!

不知道这是否有助于你,但我用这种方式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 }));