web-dev-qa-db-ja.com

StackExchange.Redis ConnectionMultiplexer.Connect()が断続的に機能する

使っています StackExchange.Redis 3つの異なるRedisインスタンスと通信します。1つは同じサブネット上で、2つはリモートで通信します。これが私の設定コードです:

var configurationOptions = new ConfigurationOptions
{
    EndPoints =
    {
        { Host, port }
    },
    KeepAlive = 180,
    Password = password,
    DefaultVersion = new Version("2.8.5"),
    // Needed for cache clear
    AllowAdmin = true
};

var connectionMultiplexer = ConnectionMultiplexer.Connect(configurationOptions );

最後の行は、約70%の時間、接続例外をスローします。

Redisサーバーに接続できませんでした。切断されたマルチプレクサを作成するには、AbortOnConnectFailを無効にします

なぜこれが断続的であるのか、および/または何が間違っているのですか?コマンドプロンプトでRedisサーバーにpingを実行すると、0%のパケット損失と1ミリ秒未満の応答があります。ネットワークは安定しています。

ありがとう!

[〜#〜]編集[〜#〜]

失敗したときにログが出力する内容は次のとおりです。

10.48.68.28:6379,keepAlive=180,version=2.8.5

1 unique nodes specified
Requesting tie-break from 10.48.68.28:6379 > __Booksleeve_TieBreak...
Allowing endpoints 00:00:01 to respond...
10.48.68.28:6379 did not respond
10.48.68.28:6379 failed to nominate (WaitingForActivation)
No masters detected
10.48.68.28:6379: Standalone v2.8.5, master; keep-alive: 00:03:00; int: Connecting; sub: ConnectedEstablished, 1 active; not in use: DidNotRespond
10.48.68.28:6379: int ops=0, qu=4, qs=0, qc=0, wr=0, socks=1; sub ops=2, qu=0, qs=0, qc=0, wr=0, subs=1, sync=2, socks=1
Circular op-count snapshot; int: 0 (0.00 ops/s; spans 10s); sub: 0+2=2 (0.20 ops/s; spans 10s)
Sync timeouts: 0; fire and forget: 0; last heartbeat: -1s ago
Starting heartbeat...
13
Haney

Redisに接続するときに、クライアントにConnectTimeoutを設定することで回避できました。ここに私のコードがありました

 ConnectionMultiplexer connection = 
        ConnectionMultiplexer.Connect("endpoint,password=password,ConnectTimeout=10000");
7
pranav rastogi

これはやや一般的な問題のようです: https://github.com/StackExchange/StackExchange.Redis/issues/42

新しいビルドをダウンロードしましたが、問題は発生していません。まだ。

5
shawn.r.stevens

これを行うことで上記を解決できます:

発生しているエラーは、通常、接続文字列にabortConnect = falseを設定していないことを示しています。 abortConnectのデフォルト値はtrueで、StackExchange.Redisが特定の条件下でサーバーに自動的に再接続しないようにします。接続文字列にabortConnect = falseを設定して、ネットワークブリップが発生した場合にSE.Redisがバックグラウンドで自動再接続するようにすることを強くお勧めします。

ソース: https://stackoverflow.com/a/30918632/2236811

だから私のinit()はこのように見えました

 ConfigurationOptions co = new ConfigurationOptions()
        {
            SyncTimeout = 500000,
            EndPoints =
            {
                {url,portNumber }
            },
            AbortOnConnectFail = false // this prevents that error
        };

        seClient = ConnectionMultiplexer.Connect(co);

ありがとう

4
ankur

私にとってこのエラーは、接続の総数がその最大制限、つまり10Kに達したためでした。クライアントを再起動してそれらのいくつかを強制終了すると、問題が解決しました。 Azureポータルを確認して、リソースの上限に達しているかどうかを確認できます。

3
Rocks