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

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

于 2013-08-09T14:18:19.297 回答