【发布时间】:2012-06-19 08:37:00
【问题描述】:
我正在尝试使用 Node.js 和带有 Redis 的 Socket.io 将应用程序部署到 Heroku。我已经将 Socket.io 设置为使用 XHR 长轮询作为specified by Heroku,如果我只有一个测功机,它可以完美地工作,但是当我将它扩展到使用多个测功机时它就不起作用了。
最初我在 Socket.io 中使用 MemoryStore,当我使用“heroku ps:scale web=2”对其进行扩展时,它开始间歇性地工作,并在客户端出现此错误:
未捕获的类型错误:对象#
的属性“打开”不是函数
我在Socket.io documentation 中发现“如果你想扩展到多个进程和/或多个服务器,你可以使用我们的 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 获得的带有 2 个进程的日志:
2012-06-16T15:36:12+00:00 app[web.2]:调试:设置轮询超时
2012-06-16T15:36:12+00:00 应用 [web.2]:调试:清除轮询超时
2012-06-16T15:36:12+00:00 app[web.2]: 调试: xhr-polling 写作
7:::1+0 2012-06-16T15:36:12+00:00 应用程序[web.2]:警告:客户端不
握手客户端应重新连接 2012-06-16T15:36:12+00:00
app[web.2]:调试:为客户端 15718037491002932534 设置关闭超时
2012-06-16T15:36:12+00:00 app[web.2]: 调试: 清除关闭超时
客户端 15718037491002932534 2012-06-16T15:36:12+00:00 app[web.2]:
信息:传输端(错误)2012-06-16T15:36:12+00:00 app[web.2]:
调试:丢弃传输
【问题讨论】:
标签: node.js heroku redis socket.io