私たちの redis 構成では、タイムアウトを設定しました: 7 秒
node_redisでは、redis 接続の準備完了と終了イベントを次のように処理します。
client.on("ready", function() {
logger.info("Connection Successfully Established to ", this.host, this.port);
}
client.on("end", function() {
logger.fatal("Connection Terminated to ", this.host, this.port);
}
サンプルログ
[2012-07-11 08:21:29.545] [致命的] 生産 - 'xxx9' '6399' への接続が終了しました
[2012-07-11 08:21:29.803] [情報] 生産 - ' への接続が正常に確立されましたxxx9''6399'
しかし、場合によっては (ほとんどの場合、redis はクライアントに通知せずに接続を閉じています)、コマンド キューが積み重なって、リクエストが応答を取得するのに時間がかかりすぎていることがわかります [node-redis クライアントが close イベントを感知できるようになるまで) ]。そのような場合はすべて、このエラーとともにコマンド コールバックが返されますRedis connection gone from close event
。いくら待っても。通常の終了イベントがトリガーされなかったため、タイムアウトのため、これは問題ではないようです。
問題はこれに似ているようです - http://code.google.com/p/redis/issues/detail?id=368
これはredisで起こっている既知のことですか?
クライアントを失速させる代わりに、コマンドの実行 [返信の送受信] がしきい値を超えないように指定し、その場合にエラーで返信する方法はありますか?
または、socket_timeout のような場合にクローズ イベントをトリガーする別の方法はありますか?
それとも、redis 側から何かを確認する必要がありますか? レベルでredis ログを監視しdebug
ましたが、この問題に関連する有用なものは何も見つかりませんでした
node-redis をデバッグ モードで実行すると、コマンド キューにリクエストが積み重なってクライアントが停止していることがはっきりとわかります。flush_on_error関数内の理由とキューの長さをログに記録しました。offline_queuingを無効のままにしています。
サンプルログ
close イベントから Redis 接続が失われました。オフライン キュー 0 コマンド キュー 8
失敗した要求の応答時間: 30388 ミリ秒 [これは、コマンド キューでの待機によって異なります。最初にキューに入れられた人の応答時間は最大であり、彼に続く人はそれよりも遅くなります]
通常の応答時間: 1 ms
PS: node_redis にも問題を提出しました