2016-09-08 13 views
0

Redis Listを使用して、C#アプリケーションで処理されるアイテムのキューを維持しています。アプリケーションは、StackExchange.Redis 1.0.488(別名SER)を使用して、Redisに接続し、ListRightPushAsyncおよびListLeftPopAsync SER APIを呼び出すことによってListを操作します。StackExchange.Redis API:ListLeftPopAsyncが無限の時間またはタイムアウトしています

主に、redis serverが利用できなくなったときのアプリケーションの動作を検証しています。

アプリケーションがキューを処理している間にRedisサーバーが再起動された後、問題が発生しました。アプリケーションは、ListLeftPopAsyncが無限の時間を費やし、アプリケーションが何も例外なく停止する問題が発生した後で、一定量のアイテムの処理を再開します。ロードアプリケーションの量は処理が高かったことに注意してください.100000 items.Belowはコードスニペットです。

消費者層:

public async Task<byte[]> DiscardProcessedItem() 
    { 
     var result = await ListLeftPopAsync(2, "2:l:queue1"); 
     return result; 
    } 

SERのAPIラッパー:

public Task<byte[]> ListLeftPopAsync(int redisDb, string key) 
    { 
     var task = conn.GetDatabase(redisDb).ListLeftPopAsync(key); 
     return Task.FromResult<byte[]>(task.Result); 
    } 

注syncTimeoutは5000

次いで、我々は以下のようにラッパー関数を変更することにより、同期SER APIを使用しようとしたこと

public byte[] ListLeftPopAsync(int redisDb, string key) 
    { 
     return conn.GetDatabase(redisDb).ListLeftPop(key); 
    } 

この変更の後、アプリケーションはハングしておらず、キュー全体が処理されました。しかし、少数のアイテムに対してListLeftPopを実行している間、StackExchange.Redisはタイムアウト例外をスローしました。例外は以下に貼り付けられます。 L:QUEUE1、インスト:1、MGR:ProcessReadQueue、ERR:決して、キュー:6、QU:0、QS:6、QC:0、WR:0、WQ:0 LPOP 2を実行

タイムアウト(Busy = 0、Free = 2047、Min = 4、Max = 2047)、clientName(使用可能な値は0、Free = 2047、最小値は4、最大値は2047) :MYPC

すべての手がかりをいただければ幸いです。

答えて

0

シンクタイムアウトを長くするか、スタック交換ライブラリが提供する非同期メカニズムを使用します。あなたは、クライアントの古いバージョンを使っているよう

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

    seClient = ConnectionMultiplexer.Connect(co); 

これも起きている可能性があり

関連する問題