Node,Socket.io和Redis - 多个实例

时间:2014-08-01 21:52:16

标签: node.js redis socket.io

我对在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实例的存储?这是如何交叉实例的?

1 个答案:

答案 0 :(得分:2)

  

(1)首先,当我在Heroku中扩展为两个dynos时,这只意味着两个节点实例?

你可以这样想,是的。

  

(2)其次,当我像这样创建一个io实例时:...

是的,这是正确的。

  

(3)使用redis的原因是创建一个可供所有实例访问的商店 - 这是正确的吗?

  

(4)这个redis实例现在不是由每个节点实例创建的,然后设置为每个io实例的存储吗?这是如何交叉实例的?

Redis是一个键值服务器。调用redis.createClient()只是创建一个与redis服务器的连接,它实际上并不在任何地方创建一个redis服务器的实例。您将需要在某处运行redis实例(Heroku has a few options)。然后,您需要通过将端口和主机传递到redis.createClientdocs)来设置代码以显式连接到该实例。

因此,如果您在端口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实例,并且可以通过它进行协调。