RedisResponseException from BlockingDequeue

本文关键字:BlockingDequeue from RedisResponseException | 更新日期: 2023-09-27 18:20:49

在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分钟,就会抛出异常。

RedisResponseException from BlockingDequeue

我在Windows Azure上做过一次config set timeout 30,在redis上做过

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

现在由于某种原因,它可以在上运行

原来我们是通过一个指向F5 Big IP流量控制器的dns条目发送Redis请求的,该控制器设置为在300秒后丢弃空闲连接。一旦我们在大IP上增加了超时时间,错误就不再发生了。