无法连接到 redis 服务器;连接超时
It was not possible to connect to the redis server(s); ConnectTimeout
我在 StackExchange.Redis 1.2.6
中使用 Azure Function V1。函数每分钟接收 1000 条消息,对于每条消息,对于每台设备,我正在检查 Redis。我注意到当我们当时收到更多消息时,我们会遇到错误。
Exception while executing function: TSFEventRoutingFunction No connection is available to service this operation: HGET GEO_DYNAMIC_hash; It was not possible to connect to the redis server(s); ConnectTimeout; IOCP: (Busy=1,Free=999,Min=24,Max=1000), WORKER: (Busy=47,Free=32720,Min=24,Max=32767), Local-CPU: n/a It was not possible to connect to the redis server(s); ConnectTimeout
CacheService 由 MS
推荐
public class CacheService : ICacheService
{
private readonly IDatabase cache;
private static readonly string connectionString = ConfigurationManager.AppSettings["RedisConnection"];
public CacheService()
{
this.cache = Connection.GetDatabase();
}
private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() =>
{
return ConnectionMultiplexer.Connect(connectionString);
});
public static ConnectionMultiplexer Connection
{
get
{
return lazyConnection.Value;
}
}
public async Task<string> GetAsync(string hashKey, string ruleKey)
{
return await this.cache.HashGetAsync(hashKey, ruleKey);
}
}
我在 Azure 函数中注入 ICacheService
并在每次请求时调用 GetAsync
方法。
使用 Azure Redis 实例 C3
目前,您可以看到我有一个连接,创建多个连接将有助于解决这个问题?或对 solve/understand 这个问题的任何其他建议。
您遇到的错误有多种不同的原因。以下是我能想到的一些(没有特定顺序):
您的连接超时时间太小。我经常看到客户经常设置一个小的连接超时,因为他们认为这将确保在该时间跨度内建立连接。这种方法的问题在于,当出现问题时(高客户端 CPU、高服务器 CPU 等),连接尝试将失败。这通常会使糟糕的情况变得更糟 - 它不会帮助,而是通过强制系统重新启动尝试重新连接的过程来加剧问题,通常会导致 connect -> fail -> retry环形。我通常建议您将 connectionTimeout 设置为 15 秒或更长。最好让您的连接尝试在 15 或 20 秒后成功,而不是让它在 5 秒后反复失败,导致中断持续几分钟直到系统最终恢复。
发生 server-side 故障转移。 由于某种类型的从主服务器到副本的故障转移,连接被服务器切断。如果 server-side 软件在 Redis 层、OS 层或托管层更新,就会发生这种情况。
某种类型的网络基础设施故障(位于客户端和服务器之间的硬件出现某种类型的问题)。
您更改了 Redis 实例的访问密码。更改密码将重置与所有客户端的连接以强制它们 re-authenticate.
需要调整线程池设置。如果您的线程池设置没有针对您的工作负载进行正确调整,那么您可以 运行 延迟启动新线程 explained here。
我写了一堆 best practices for Redis 也可以帮助您避免其他问题。
我们通过将 StackExchange.Redis
升级到 2.1.30
解决了这个问题。
我在 StackExchange.Redis 1.2.6
中使用 Azure Function V1。函数每分钟接收 1000 条消息,对于每条消息,对于每台设备,我正在检查 Redis。我注意到当我们当时收到更多消息时,我们会遇到错误。
Exception while executing function: TSFEventRoutingFunction No connection is available to service this operation: HGET GEO_DYNAMIC_hash; It was not possible to connect to the redis server(s); ConnectTimeout; IOCP: (Busy=1,Free=999,Min=24,Max=1000), WORKER: (Busy=47,Free=32720,Min=24,Max=32767), Local-CPU: n/a It was not possible to connect to the redis server(s); ConnectTimeout
CacheService 由 MS
推荐public class CacheService : ICacheService
{
private readonly IDatabase cache;
private static readonly string connectionString = ConfigurationManager.AppSettings["RedisConnection"];
public CacheService()
{
this.cache = Connection.GetDatabase();
}
private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() =>
{
return ConnectionMultiplexer.Connect(connectionString);
});
public static ConnectionMultiplexer Connection
{
get
{
return lazyConnection.Value;
}
}
public async Task<string> GetAsync(string hashKey, string ruleKey)
{
return await this.cache.HashGetAsync(hashKey, ruleKey);
}
}
我在 Azure 函数中注入 ICacheService
并在每次请求时调用 GetAsync
方法。
使用 Azure Redis 实例 C3
目前,您可以看到我有一个连接,创建多个连接将有助于解决这个问题?或对 solve/understand 这个问题的任何其他建议。
您遇到的错误有多种不同的原因。以下是我能想到的一些(没有特定顺序):
您的连接超时时间太小。我经常看到客户经常设置一个小的连接超时,因为他们认为这将确保在该时间跨度内建立连接。这种方法的问题在于,当出现问题时(高客户端 CPU、高服务器 CPU 等),连接尝试将失败。这通常会使糟糕的情况变得更糟 - 它不会帮助,而是通过强制系统重新启动尝试重新连接的过程来加剧问题,通常会导致 connect -> fail -> retry环形。我通常建议您将 connectionTimeout 设置为 15 秒或更长。最好让您的连接尝试在 15 或 20 秒后成功,而不是让它在 5 秒后反复失败,导致中断持续几分钟直到系统最终恢复。
发生 server-side 故障转移。 由于某种类型的从主服务器到副本的故障转移,连接被服务器切断。如果 server-side 软件在 Redis 层、OS 层或托管层更新,就会发生这种情况。
某种类型的网络基础设施故障(位于客户端和服务器之间的硬件出现某种类型的问题)。
您更改了 Redis 实例的访问密码。更改密码将重置与所有客户端的连接以强制它们 re-authenticate.
需要调整线程池设置。如果您的线程池设置没有针对您的工作负载进行正确调整,那么您可以 运行 延迟启动新线程 explained here。
我写了一堆 best practices for Redis 也可以帮助您避免其他问题。
我们通过将 StackExchange.Redis
升级到 2.1.30
解决了这个问题。