I have a very simple app running on heroku with nodejs and redis. It takes data posted to it periodically via an ajax post, and stores the data in a list in Redis.
I've run the app locally without issue, where it logs the data sent to it to redis without complaint. However, when I run it on heroku I get about 5-10 requests into it before it crashes, with a pretty non-specific redis error.
Dependencies:
"redis": "~0.7.1",
"hiredis": "~0.1.14",
"redis-url": "~0.1.0"
Code writing to 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})
The error I am getting is as follows:
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)
This crashes the app, which heroku brings back eventually, but it then crashes again pretty quickly, within a few requests.
Anyone run into this before? I'm pretty new to node/redis, so this is probably something obvious. It's just odd that it runs happily pretty much forever locally, but is dying like this on heroku...
Thanks!
Well, this was a clear case of RTFM and not sleeping on it before posting.
I saw on another SO post that I could attach an error handler to the redis client via:
redis.on "error", (err) ->
console.log("Redis error: #{err}")
This yielded
Redis error: Auth error: Error: Error: ERR max number of clients reached
in the logs, which was happening because was opening a new connection on each request and not closing it. I then moved my connection instantiation to the server.js file and then passed it into my route handlers as a parameter. Now the app runs fine with just one active connection...
Hopefully this will help future people who have made a similar mistake...