4

私たちの 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 にも問題を提出しました

4

2 に答える 2

3

Redis との接続にも問題がありました。クライアントに通知せずに接続を閉じるようです。サーバーのタイムアウトの問題である可能性があることに気付きました。これが私たちが使用する解決策であり、7 月以降、問題は発生していません。

var RETRY_EVERY = 1000 * 60 * 3;
var startTimer = function(){
    console.log('Begin the hot tub!')
    setInterval(function(){
        try{
            client.set('hot',new Date());
            console.log(client.get('hot'))
        }
        catch(e){
            console.log(e);
        }

    },RETRY_EVERY)
}();

3 分ごとに 1 回の呼び出しであることを考えると、パフォーマンスの問題にはなりません ;)

于 2013-12-20T06:37:09.270 に答える
3

oconnecp の回答に関しては、次のことはできません。

setInterval(client.ping(), 1000 * 60 * 30);
于 2014-01-04T15:34:45.393 に答える