簡體   English   中英

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

[英]Scaling to 2+ dynos on Heroku with socket.io-redis and RedisToGo

我正在嘗試使用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 env變量(REDISTOGO_HOST,REDISTOGO_PASS,REDISTOGO_PORT)。

當我們將比例縮放為1 dyno時,套接字行為是完美的。 在2個dyno上,行為很不正常-向1個dyno或另一個dyno隨機發出請求,並且發出的套接字事件僅發送給在向其發出請求的dyno上運行的客戶端,而不是所有客戶端(哪個socket) .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
}));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM