RedisTypedClient で BlockingDequeue を使用すると、タイムアウト例外のように見えます。
呼び出しコードは次のようになります
using (var client = ClientPool.GetClient())
return client.As<TMessage>().Lists[_channel].BlockingDequeue(timeout);
タイムアウトは 0 に設定され、ClientPool は PooledRedisClientManager です。
スタックトレースは次のようになります
ServiceStack.Redis.RedisResponseException: No more data, sPort: 51100, LastCommand:
at ServiceStack.Redis.RedisNativeClient.CreateResponseError(String error)
at ServiceStack.Redis.RedisNativeClient.ReadMultiData()
at ServiceStack.Redis.RedisNativeClient.SendExpectMultiData(Byte[][] cmdWithBinaryArgs)
at ServiceStack.Redis.RedisNativeClient.BRPop(String listId, Int32 timeOutSecs)
at ServiceStack.Redis.Generic.RedisTypedClient`1.BlockingDequeueItemFromList(IRedisList`1 fromList, Nullable`1 timeOut)
at ServiceStack.Redis.Generic.RedisClientList`1.BlockingDequeue(Nullable`1 timeOut)
私が見つけた限りでは、これはオープン接続を保持しているクライアントの問題です。これは PooledRedisClientManager を使用して修正されるはずだと思っていましたが、まだ発生しているようです。この問題は簡単に再現できます。BlockingDequeue メソッドを呼び出すだけで、約 2 ~ 3 分待ってから例外がスローされます。