在Heroku上使用Node.js时,Redis崩溃了。

4
我有一个使用Node.js和Redis在Heroku上运行的非常简单的应用程序。它通过Ajax POST定期接收数据,并将数据存储到Redis列表中。
我在本地运行该应用程序时没有问题,在不抱怨的情况下将发送的数据记录到Redis中。但是,当我在Heroku上运行它时,大约在5-10个请求后它就会崩溃,并显示一个相当不明确的Redis错误。
依赖项:
"redis": "~0.7.1",
"hiredis": "~0.1.14",
"redis-url": "~0.1.0"

将代码写入Redis(Coffeescript):

app.post '/track', (req, res) -> 
  redis = require('redis-url').connect(app.settings.redis_url)

  if(req.body.userid)
    key = "locations:#{req.body.userid}"
    redis.rpush key, JSON.stringify({time: (new Date()).toString(), lat: req.body.latitude, lon: req.body.longitude})

我收到的错误如下所示:
Error: Uncaught, unspecified 'error' event.
2012-04-21T06:12:00+00:00 app[web.1]:     at Command.callback (/app/node_modules/redis/index.js:159:29)
2012-04-21T06:12:00+00:00 app[web.1]:     at HiredisReplyParser.<anonymous> (/app/node_modules/redis/index.js:256:14)
2012-04-21T06:12:00+00:00 app[web.1]:     at RedisClient.return_error (/app/node_modules/redis/index.js:446:25)
2012-04-21T06:12:00+00:00 app[web.1]:     at HiredisReplyParser.execute (/app/node_modules/redis/lib/parser/hiredis.js:41:18)
2012-04-21T06:12:00+00:00 app[web.1]:     at HiredisReplyParser.emit (events.js:67:17)
2012-04-21T06:12:00+00:00 app[web.1]:     at RedisClient.on_data (/app/node_modules/redis/index.js:422:27)
2012-04-21T06:12:00+00:00 app[web.1]:     at Socket.emit (events.js:67:17)
2012-04-21T06:12:00+00:00 app[web.1]:     at Socket.<anonymous> (/app/node_modules/redis/index.js:66:14)
2012-04-21T06:12:00+00:00 app[web.1]:     at TCP.onread (net.js:367:14)

这会导致应用程序崩溃,Heroku最终会再次启动它,但在几个请求之内很快又会崩溃。

有人以前遇到过这种情况吗?我对node/redis相当新,所以这可能是显而易见的问题。奇怪的是,它在本地可以愉快地运行相当长时间,但在Heroku上却像这样死亡...

谢谢!


1
难道不是因为每个POST事件都建立了与Redis的连接吗?应用程序不应该这样做。Heroku Redis实例允许多少个连接? - Didier Spezia
你说得对,Didier。我刚刚发现我的客户端不够用了。我将把连接移动到server.js中,这样它就是整个应用程序的全局连接,而不是在post请求期间打开。我暂时通过每次关闭连接来修复它,但显然最好的方法是为整个应用程序重复使用一个连接。谢谢! - stockli
1个回答

5

好的,这是一个明显的RTFM案例,发布前没有好好琢磨。

我在另一个SO帖子上看到可以通过以下方式将错误处理程序附加到redis客户端:

redis.on "error", (err) ->
   console.log("Redis error: #{err}")

这产生了。
Redis error: Auth error: Error: Error: ERR max number of clients reached

在日志中,发现每个请求都会打开一个新的连接但不关闭,导致问题出现。我将连接实例化移动到了server.js文件中,并将它作为参数传递给路由处理程序。现在应用只有一个活动连接,运行良好...希望这能帮助未来遇到类似问题的人...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接