使用 socket.io-redis 和 RedisToGo 在 Heroku 上扩展到 2+ dynos
Posted
技术标签:
【中文标题】使用 socket.io-redis 和 RedisToGo 在 Heroku 上扩展到 2+ dynos【英文标题】:Scaling to 2+ dynos on Heroku with socket.io-redis and RedisToGo 【发布时间】:2015-05-04 17:19:24 【问题描述】:我正在尝试使用 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 (REDISTOGO_HOST, REDISTOGO_PASS,REDISTOGO_PORT)。
当我们缩放到 1 dyno 时,套接字行为是完美的。在 2 个 dyno 处,行为偏离了 - 请求被随机发送到 1 个 dyno 或另一个,并且发出的套接字事件仅发送到在发出请求的 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
));
【讨论】:
以上是关于使用 socket.io-redis 和 RedisToGo 在 Heroku 上扩展到 2+ dynos的主要内容,如果未能解决你的问题,请参考以下文章
在 Heroku 上使用集群和 socket.io-redis 扩展 node.js socket.io@1.*.*
如何从 socket.io-redis 发送私人消息(发射)