2

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 分待ってから例外がスローされます。

4

2 に答える 2

3

私はこれをWindows Azureとredisで一度行いconfig set timeout 30、ServiceStack.Redisで行いました

            var redisFactory = new PooledRedisClientManager(redisConn);
            redisFactory.ConnectTimeout = 5;
            redisFactory.IdleTimeOutSecs = 30;

そして今、何らかの理由でそれが機能します

于 2014-03-18T12:34:28.733 に答える
2

300 秒後にアイドル状態の接続をドロップするように設定された F5 Big IP トラフィック コントローラーを指している dns エントリを介して Redis リクエストを送信していたことが判明しました。Big IP のタイムアウトを増やすと、エラーは発生しなくなりました。

于 2013-08-09T14:18:19.297 に答える