redis与node.js在heroku上崩溃

时间:2012-04-21 06:18:39

标签: node.js heroku redis

我在heroku上使用nodejs和redis运行了一个非常简单的应用程序。它通过ajax帖子定期发布数据,并将数据存储在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 个答案:

答案 0 :(得分:4)

嗯,这是一个明确的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文件,然后将其作为参数传递给我的路由处理程序。现在,只需一个活动连接即可​​正常运行...

希望这将有助于未来犯下类似错误的人......