UnableToResolvePhysicalConnection 异常后 Redis 超时

Redis timeout after UnableToResolvePhysicalConnection exception

我们正在调查 Azure 上 api 连接到 Azure Redis 缓存(C2 层标准)的问题,从昨天晚上到今天清晨(将近 12 小时),我们已经看到数百次超时像这样使用 redis

Timeout performing GET ????????:FV:Providers:Weather, inst: 1, mgr: Inactive, err: never, queue: 318, qu: 2, qs: 316, qc: 0, wr: 1, wq: 1, in: 65536, ar: 0, clientName: Items, serverEndpoint: ?????????:6380, keyHashSlot: 1586, IOCP: (Busy=1,Free=999,Min=8,Max=1000), WORKER: (Busy=66,Free=32701,Min=300,Max=32767

晚上我们的访问量不多,但直到今天 9 点左右错误仍然存​​在,redis 队列中的项目高达 7000,但我们 api 的流量非常低在晚上。

白天一切正常,除了今天下午的一个小时内,当我们遇到访客高峰时,问题再次出现。我们一直在寻找很多指标,缓存 read/writes 操作像往常一样,缓存命中,cpu,内存,......一切都很好。

甚至其他 API 使用相同的 redis 缓存实例,他们也不会遇到这个问题。出于这个原因,我们认为 Azure Redis 的大小是正确的,如果不是其他 API 也会遇到同样的问题。

查看日志,我们发现就在超时错误开始前两分钟,我们收到了 200 多个这样的异常

StackExchange.Redis.RedisConnectionException: UnableToResolvePhysicalConnection on GET at StackExchange.Redis.ConnectionMultiplexer.ExecuteSyncImpl[T](Message message, ResultProcessor1 processor, ServerEndPoint server) at StackExchange.Redis.RedisBase.ExecuteSync[T](Message message, ResultProcessor1 processor, ServerEndPoint server) at StackExchange.Redis.RedisDatabase.StringGet(RedisKey key, CommandFlags flags)

我们猜测这两个错误是相关的。但我们不知道是我们做错了什么还是天蓝色的问题。可能是 StackExchange.Redis 连接在 UnableToResolvePhysicalConnection 异常后损坏,我们必须重新启动 API 才能解决问题?

其他想法?

感谢您的帮助!

StackExchange.Redis 有一个已知问题,即使服务器 运行 正常,在某些情况下它也无法重新连接。示例:https://github.com/StackExchange/StackExchange.Redis/issues/559

我怀疑您 运行 遇到了这类问题。您可以通过尝试从其他机器连接到 Redis 来验证这一点。如果连接正常,那么您很可能遇到了这个问题。重新创建 ConnectionMultiplexer 应该可以解决问题。如果您没有办法重新创建多路复用器,重启您的客户端应该可以解决这个问题。

我有很多最佳实践可以帮助您构建代码以处理此类情况,包括一般最佳实践以及 StackExchange.Redis 具体建议。 https://aka.ms/redis/bestpractices