c# - 无法连接到 redis 服务器;连接超时
问题描述
我将 Azure Function V1 与StackExchange.Redis 1.2.6
. 每分钟接收 1000 条消息的功能,对于每条消息,对于每台设备,我正在检查 Redis。我注意到当我们当时有更多消息时,我们会遇到错误。
执行函数时出现异常:TSFEventRoutingFunction 没有可用于服务此操作的连接:HGET GEO_DYNAMIC_hash;无法连接到 redis 服务器;连接超时;IOCP: (Busy=1,Free=999,Min=24,Max=1000), WORKER: (Busy=47,Free=32720,Min=24,Max=32767), Local-CPU: n/a 不是可以连接到 redis 服务器;连接超时
MS 推荐的CacheService
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);
}
}
我正在注入ICacheService
Azure 函数并GetAsync
在每个请求上调用 Method。
使用 Azure Redis 实例 C3
目前,您可以看到我只有一个连接,创建多个连接将有助于解决这个问题吗?或任何其他解决/理解此问题的建议。
解决方案
您遇到的错误有很多不同的原因。以下是我能想到的一些(不按任何特定顺序):
您的 connectTimeout 太小。我经常看到客户经常设置一个小的连接超时,因为他们认为这将确保在该时间跨度内建立连接。这种方法的问题在于,当出现问题(高客户端 CPU、高服务器 CPU 等)时,连接尝试将失败。这通常会使糟糕的情况变得更糟 - 它没有帮助,而是通过强制系统重新启动尝试重新连接的过程来加剧问题,通常导致连接 -> 失败 -> 重试环形。我通常建议您将 connectionTimeout 设置为 15 秒或更高。最好让你的连接尝试在 15 或 20 秒后成功,而不是让它在 5 秒后反复失败,从而导致持续几分钟的中断,直到系统最终恢复。
发生服务器端故障转移。由于某种类型的从主服务器到副本的故障转移,服务器断开了连接。如果在 Redis 层、操作系统层或托管层更新服务器端软件,就会发生这种情况。
某种类型的网络基础设施故障(位于客户端和服务器之间的硬件出现某种类型的问题)。
您更改 Redis 实例的访问密码。更改密码将重置与所有客户端的连接,以强制它们重新进行身份验证。
线程池设置需要调整。如果您的线程池设置未针对您的工作负载正确调整,那么您可能会在启动新线程时遇到延迟,如此处所述。
我已经为 Redis 编写了一堆最佳实践,它们也可以帮助您避免其他问题。
推荐阅读
- r - 如何过滤以前大于特定值的时间序列中的值
- python - 查找数组的numpy数组的特征值
- java - 尝试在 java 中读取文本文件 - 错误:目录文件不存在 - LINUX
- mysql - 登录 PhpMyAdmin 时出现错误代码 200
- php - PHP / SQL:成功更新数据行但出现PHP致命错误
- javascript - 如何在chrome中缓存大文件?
- java - 为什么我不能使用这种运算符组合来使 NOR 适应 Java
- node.js - 这些 npm 错误是什么意思,我该如何解决?
- oauth - Spartacus 扩展 AuthService
- javascript - JavaScript,今天的错误 yyyy-mm-dd