我对在Heroku上使用多个dyno运行节点以及如何跨实例访问socket.io/redis感到困惑。我使用的是socket.io 0.9.16。
(1)首先,当我在Heroku中扩展为两个dynos
时,这只意味着两个节点实例?
(2)其次,当我像这样创建一个io
的实例时:
var io = require('socket.io').listen(server);
然后当第二个node
实例被创建,然后用它创建第二个io
实例 - 这是正确的吗?
(3)使用redis
的原因是创建一个可供所有实例访问的商店 - 这是正确的吗?
但是,当我为redisstore
创建一个新的io
时,就像这样:
var ioRedisStore = require('socket.io/lib/stores/redis');
io.set('store', new ioRedisStore({
redisPub : redis.createClient(),
redisSub : redis.createClient(),
redisClient : redis.createClient()
}));
(4)现在每个节点实例都创建了这个redis
实例,然后将其设置为每个io
实例的存储?这是如何交叉实例的?
答案 0 :(得分:2)
(1)首先,当我在Heroku中扩展为两个dynos时,这只意味着两个节点实例?
你可以这样想,是的。
(2)其次,当我像这样创建一个io实例时:...
是的,这是正确的。
(3)使用redis的原因是创建一个可供所有实例访问的商店 - 这是正确的吗?
是
(4)这个redis实例现在不是由每个节点实例创建的,然后设置为每个io实例的存储吗?这是如何交叉实例的?
Redis是一个键值服务器。调用redis.createClient()只是创建一个与redis服务器的连接,它实际上并不在任何地方创建一个redis服务器的实例。您将需要在某处运行redis实例(Heroku has a few options)。然后,您需要通过将端口和主机传递到redis.createClient
(docs)来设置代码以显式连接到该实例。
因此,如果您在端口6379(默认)上运行redis实例10.0.1.100(随机选择),则执行以下操作:
var ioRedisStore = require('socket.io/lib/stores/redis');
io.set('store', new ioRedisStore({
redisPub : redis.createClient(6379, '10.0.1.100'),
redisSub : redis.createClient(6379, '10.0.1.100'),
redisClient : redis.createClient(6379, '10.0.1.100')
}));
这样,所有节点实例共享相同的redis实例,并且可以通过它进行协调。