我正在尝试使用Node.js和Socket.io与Redis将应用程序部署到Heroku。我已经设置了Socket.io使用XHR长轮询,如Heroku所指定的,如果只有一个dyno,它可以完美地工作,但是当我扩展它以使用多个dyno时,它就无法正常工作。
最初我在Socket.io中使用MemoryStore,当我使用“heroku ps:scale web = 2”进行扩展时,它开始间歇性地工作,并在客户端中显示此错误:
未捕获的类型错误:对象#<Transport>的属性“open”不是函数
我在Socket.io文档中发现:“如果要扩展到多个进程和/或多个服务器,可以使用我们的RedisStore,它使用Redis NoSQL数据库作为中间人”。
因此,我创建了一个RedisStore:
一切在本地以及 Heroku 中一个 Web Dyno 上运行都完美无误。但是,一旦将其扩展到超过一个进程,它开始间歇性失效,尽管现在不再出现错误。因此,我不确定接下来该怎么做。
以下是我在使用两个进程的 Heroku 上得到的日志:
2012年6月16日15:36:12+00:00应用程序[web.2]:调试:设置轮询超时
2012年6月16日15:36:12+00:00应用程序[web.2]:调试:清除轮询超时
2012年6月16日15:36:12+00:00应用程序[web.2]:调试:xhr-polling写入
7:::1 + 0 2012年6月16日15:36:12+00:00应用程序[web.2]:警告:客户端未握手,客户端应重新连接
2012年6月16日15:36:12+00:00应用程序[web.2]:调试:为客户端15718037491002932534设置关闭超时
2012年6月16日15:36:12+00:00应用程序[web.2]:调试:清除客户端15718037491002932534的关闭超时
2012年6月16日15:36:12+00:00应用程序[web.2]:信息:传输结束(错误)
2012年6月16日15:36:12+00:00应用程序[web.2]:调试:丢弃传输
最初我在Socket.io中使用MemoryStore,当我使用“heroku ps:scale web = 2”进行扩展时,它开始间歇性地工作,并在客户端中显示此错误:
未捕获的类型错误:对象#<Transport>的属性“open”不是函数
我在Socket.io文档中发现:“如果要扩展到多个进程和/或多个服务器,可以使用我们的RedisStore,它使用Redis NoSQL数据库作为中间人”。
因此,我创建了一个RedisStore:
var newRedisStore = new RedisStore({
redisPub : pub,
redisSub : sub,
redisClient : client
});
并配置了 Socket.io 来使用它:
//set up Web Socket Server
io.configure(function () {
io.set("transports", ["xhr-polling"]);
io.set("polling duration", 10);
io.set('store', newRedisStore);
});
一切在本地以及 Heroku 中一个 Web Dyno 上运行都完美无误。但是,一旦将其扩展到超过一个进程,它开始间歇性失效,尽管现在不再出现错误。因此,我不确定接下来该怎么做。
以下是我在使用两个进程的 Heroku 上得到的日志:
2012年6月16日15:36:12+00:00应用程序[web.2]:调试:设置轮询超时
2012年6月16日15:36:12+00:00应用程序[web.2]:调试:清除轮询超时
2012年6月16日15:36:12+00:00应用程序[web.2]:调试:xhr-polling写入
7:::1 + 0 2012年6月16日15:36:12+00:00应用程序[web.2]:警告:客户端未握手,客户端应重新连接
2012年6月16日15:36:12+00:00应用程序[web.2]:调试:为客户端15718037491002932534设置关闭超时
2012年6月16日15:36:12+00:00应用程序[web.2]:调试:清除客户端15718037491002932534的关闭超时
2012年6月16日15:36:12+00:00应用程序[web.2]:信息:传输结束(错误)
2012年6月16日15:36:12+00:00应用程序[web.2]:调试:丢弃传输