我正在尝试使用 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']
});
..so socket.io 不会尝试使用轮询。
我还为 RedisToGo 配置了正确的 Heroku 环境变量(REDISTOGO_HOST、REDISTOGO_PASS、REDISTOGO_PORT)。
当我们缩放到 1 dyno 时,套接字行为是完美的。在 2 个 dyno 上,行为是偏离的 - 请求是随机向 1 个 dyno 或另一个发出的,并且发出的套接字事件仅发送到在发出请求的 dyno 上运行的客户端,而不是全部(哪个套接字.io-redis 和 RedisToGo 应该照顾)。
任何想法将不胜感激!