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
すべての手がかりをいただければ幸いです。