2013-07-03 21 views
2

在RedisTypedClient上使用BlockingDequeue時,我看到的是超時異常。來自BlockingDequeue的RedisResponseException

調用代碼看起來像

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分鐘,並拋出異常。

回答

2

事實證明,我們通過一個dns條目發送我們的Redis請求,該條目指向一個F5 Big IP流量控制器,該控制器設置爲在300秒後斷開空閒連接。一旦我們增加了Big IP的超時時間,錯誤就會停止。

3

我這個曾經在Windows Azure上和Redis的我做了config set timeout 30和ServiceStack.Redis我做

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

而現在由於某種原因,它的工作原理