【问题标题】:Node, Socket.io, and Redis - multiple instancesNode、Socket.io 和 Redis - 多个实例
【发布时间】:2014-09-25 04:30:09
【问题描述】:

我对在 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 的原因是创建一个可供所有实例访问的单一商店——对吗?

但是,当我像这样为io 创建一个新的redisstore 时:

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 实例的存储吗?这如何跨实例?

【问题讨论】:

    标签: node.js redis socket.io


    【解决方案1】:

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

    你可以这么想,是的。

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

    是的,没错。

    (3) 而使用 redis 的原因是创建一个可供所有实例访问的单一存储 - 对吗?

    是的。

    (4) 这个redis实例现在不是每个node实例创建,然后设置为每个io实例的store吗?这如何跨实例?

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

    因此,如果您有一个在 10.0.1.100(随机选择)的端口 6379(默认)上运行的 redis 实例,您会这样做:

    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 实例,并且可以通过它进行协调。

    【讨论】:

    • 对 (4) 的解释正是我所需要的。
    猜你喜欢
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    • 2014-06-06
    • 1970-01-01
    • 2014-06-06
    • 2014-07-04
    相关资源
    最近更新 更多