我正在将Azure Function V1与StackExchange.Redis 1.2.6
一起使用。每分钟接收1000条消息的功能,对于每条消息,对于每台设备,我正在检查Redis。我注意到当时我们收到更多邮件时,就会遇到错误。
MS建议的执行功能时发生异常:TSFEventRoutingFunction没有连接可用于服务此操作:HGET GEO_DYNAMIC_hash;无法连接到Redis服务器。 ConnectTimeout; IOCP:(忙= 1,空闲= 999,最小值= 24,最大值= 1000),工作人员:(忙= 47,空闲= 32720,最小值= 24,最大值= 32767),本地CPU:不适用可以连接到Redis服务器; ConnectTimeout
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);
}
}
我要在Azure函数中注入ICacheService
,并在每个请求上调用GetAsync
方法。
使用Azure Redis实例C3
当前,您可以看到我有一个连接,创建多个连接将有助于解决此问题?或解决或理解此问题的其他建议。
答案 0 :(得分:1)
您遇到的错误有许多不同的原因。我可以想到以下一些方法(不是按特定顺序排列):
您的connectTimeout太小。我经常看到客户经常设置较小的连接超时,因为他们认为这将确保在该时间段内建立连接。这种方法的问题是,当出现问题(高客户端CPU,高服务器CPU等)时,连接尝试将失败。这通常会使糟糕的情况变得更糟-迫使系统重新启动尝试重新连接的过程,而不是助长了问题,常常导致 connect-> fail-> retry 循环。我通常建议您将connectionTimeout设置为15秒或更长时间。最好让连接尝试在15或20秒后成功,而不是让连接尝试重复5秒后失败,这样会导致故障持续数分钟,直到系统最终恢复为止。
发生服务器端故障转移。由于某种类型的从主节点到副本的故障转移,服务器断开了连接。如果在Redis层,OS层或托管层更新服务器端软件,则会发生这种情况。
某种类型的网络基础结构故障(位于客户端和服务器之间的硬件会遇到某种类型的问题)。
您更改Redis实例的访问密码。更改密码将重置与所有客户端的连接,以强制它们重新进行身份验证。
线程池设置需要调整。如果未针对您的工作负载正确调整线程池设置,则在将新线程旋转为explained here时会遇到延迟。
我写了一堆best practices for Redis,可以帮助您避免其他问题。
答案 1 :(得分:0)
我们通过将StackExchange.Redis
升级到2.1.30
解决了这个问题。