3

nodejsとredisを使用してherokuで実行している非常にシンプルなアプリがあります。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ではこのように死にかけています...

ありがとう!

4

1 に答える 1

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ファイルに移動し、それをパラメーターとしてルートハンドラーに渡しました。これで、アクティブな接続が1つだけでアプリが正常に実行されます...

うまくいけば、これは同様の間違いを犯した将来の人々を助けるでしょう...

于 2012-04-23T03:00:24.763 に答える