我正在尝试使用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负责处理)。
如有疑问,请欢迎提出!