2012-04-21 55 views
3

我有一個非常簡單的應用程序,運行在heroku上,並且使用了nodejs和redis。它通過ajax帖子定期發佈數據,並將數據存儲在Redis的列表中。redis在heroku上發生故障,使用node.js

我已經沒有問題,它記錄發送給它無怨無悔的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

是不是因爲Redis的一個連接在每個POST事件成立?該應用程序不應該這樣做。 Heroku Redis實例允許多少個連接? – 2012-04-21 06:38:58

+0

你是對的,迪迪埃。我剛剛發現我已經沒有客戶了。我將把連接移動到server.js中,以便在應用程序範圍內而不是在發佈請求期間打開。我現在通過每次關閉連接來修復它,但顯然要重新使用整個應用程序的一個連接好得多。謝謝! – stockli 2012-04-21 06:43:19

回答

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文件,然後作爲參數傳遞給我的路由處理程序。現在,應用程序運行正常只用一個活動連接...

希望這將有助於誰作出類似的錯誤將來的人......