我对在Heroku上运行具有多个dyno的节点以及如何使socket.io/redis跨实例可访问感到困惑。我正在使用socket.io 0.9.16。
(1)首先,当我dynos
在Heroku中缩放到两个时,这仅意味着两个节点实例?
(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)首先,当我在Heroku中扩展到两个dyno时,这仅意味着两个节点实例?
您可以这样想,是的。
(2)其次,当我像这样创建io的实例时:...
对,那是正确的。
(3)使用redis的原因是创建一个可以供所有实例访问的单一存储-正确吗?
是。
(4)现在不是每个节点实例都创建了这个redis实例,然后将其设置为每个io实例的存储吗?如何跨实例?
Redis是一个键值服务器。调用redis.createClient()只会创建与Redis服务器的连接,实际上并不会在任何地方创建Redis服务器的实例。您将需要在某个地方运行redis实例(Heroku有一些选择)。然后,您将需要通过将端口和主机传递给redis.createClient
(docs)来设置代码以显式连接到该实例。
因此,如果您有一个Redis实例在端口6379(默认)上运行于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实例,并且它们可以通过它进行协调。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句