4

C#アプリケーションを実行しているWindowsAzureServerがあります。これは4つのメディアインスタンスで配布され、L2キャッシングにRedisを使用しています。このアプリケーションは、かなりの量のトラフィック(1日あたり約300,000ページビュー)を処理しています。私はRedis接続にBookSleeveを使用していますが、アプリケーションが起動して実行されると、BookSleeveから1分間に約4回SocketExceptionsがスローされ始めます。正確な例外は次のとおりです。

Exception type: System.Net.Sockets.SocketException
Exception message: A connection attempt failed because the connected party did not     properly respond after a period of time, or established connection failed because connected host has failed to respond

サーバーから何かを読んでいるときにのみ発生しているようです。

using (var connection = ConnectionGateway.GetReadConnection())
{
    var task = connection.Hashes.GetString(App.RedisDatabase, CacheKeys.My_KEY);
    var result = connection.Wait(task);
}

私のGetReadConnectionは次のように設定されています。

    public static RedisConnection GetReadConnection()
    {
        RedisConnection conn = getNewConnection();

        try
        {
            var openAsync = conn.Open();
            conn.Wait(openAsync);

            return conn;
        }
        catch (SocketException ex)
        {
            throw new Exception(RedisConnectionFailed, ex);
        }
    }

これで、作成者が説明するように、すべての書き込みが単一の接続を共有するため、これは、connection.Wait()の使用を必要とする読み取りでのみ発生します。それはすべてうまくいくようです。書き込みには、BookSleeveを使用して開いているRedis接続を維持するのと同様のコードを使用します

Azureロードバランサーを考慮してRedisサーバーのタイムアウトを変更しようとしましたが、成功しませんでした。ここで説明するように、タイムアウト30の設定とタイムアウト0の設定の両方を試しました:AzureVMでBooksleeveRedisクライアントを使用する場合のRedis接続エラー

どんな助けでも本当にありがたいです。

4

1 に答える 1

3

コードを見ると、最初に発生するのは、読み取り操作ごとに接続を作成しているように見えることです。これは必須ではなく、.netとredisの両方に悪影響を与える可能性があります。BookSleeveはマルチプレクサです。単一の接続で多数のリクエストを同時に処理するように設計されています。Waitを呼び出すと、ブロックするのは待機中のスレッドだけです。BookSleeveの内部は、他のスレッドなどの処理を続行します。

さらに、接続の作成にはかなりのオーバーヘッドがあります。新しいTCP接続を確立するコストに加えて、BookSleeveはredisサーバーと通信して、正しい操作に必要ないくつかの重要な構成情報を見つける必要があるため、常に推奨されます。単一の共有接続または少数の共有接続を再利用します。

于 2012-10-06T06:26:25.773 に答える