2015-03-03 4 views
3

Я пытаюсь использовать socket.io-redis для масштабирования моего приложения на Heroku до 2 динамиков (или более). Вот мой код (где config.redis это просто RedisToGo порт объекта жилищного строительства, хозяин, и передавать значения):Масштабирование до 2+ динамиков на Heroku с socket.io-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 гнездо. io не пытается использовать опрос.

У меня также есть правильный Heroku env vars, настроенный для RedisToGo (REDISTOGO_HOST, REDISTOGO_PASS, REDISTOGO_PORT).

Когда мы масштабируемся до 1 дино, поведение гнезда является идеальным. На 2-х динамиках поведение отключено - запросы произвольно выполняются либо на 1 динамо, либо на другом, а события сокета, которые испускаются, отправляются только клиентам, работающим на dyno, на который был сделан запрос, а не на всех (какой сокет .io-redis & RedisToGo должен заботиться).

Любые мысли были бы очень благодарны!

ответ

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