C# Wat是运行.NET Core 2.1 WebApi的最佳Azure REDIS Stackexchange配置和使用
我正在两个P3V2实例上运行Azure App Services上的.NET Core 2.1 web api。使用StackExchange REDIS客户端连接到Azure REDIS服务Premium P1 目前,我们的峰值负载约为每秒7000个web请求。导致REDIS负载达到2,5MB/秒,最大缓存命中值为每分钟400k(Azure Metrics) 最近我遇到了连接问题,因此我正在调查所有可用文档: 没有连接可用于服务此操作:获取语言; 无法连接到redis服务器;连接超时 发生了一个或多个错误。(无法连接到服务器。) redis服务器;连接超时)(无法连接到 无法连接到的redis服务器;连接超时 redis服务器;连接超时无法连接到 redis服务器;连接超时 StackExchange.Redis.RedisConnectionException:位于 StackExchange.Redis.ConnectionMultiplexer.ThrowFailed (StackExchange.Redis,版本=1.2.6.0,区域性=中性, PublicKeyToken=nullStackExchange.Redis,版本=1.2.6.0, 区域性=中性,PublicKeyToken=空: c:\code\StackExchange.Redis\StackExchange.Redis\StackExchange\Redis\ConnectionMultiplexer.csStackExchange.Redis, 版本=1.2.6.0,区域性=中立,PublicKeyToken=null:2000)位于 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib,版本=4.0.0.0,区域性=中性, PublicKeyToken=7cec85d7bea7798e)at System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess (System.Private.CoreLib,版本=4.0.0.0,区域性=中性, PublicKeyToken=7cec85d7bea7798e)at System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification (System.Private.CoreLib,版本=4.0.0.0,区域性=中性, PublicKeyToken=7cec85d7bea7798e)at Infrastructure.Caching.CacheService+d_u8`1.MoveNext 重新启动web应用程序后,问题就解决了。在Application Insights中并查看失败的请求,我无法清楚地看到它是仅一个api实例还是所有实例上的api实例。但看看客户端应用,我们认为这只是一个例子 我的执行情况如下:C# Wat是运行.NET Core 2.1 WebApi的最佳Azure REDIS Stackexchange配置和使用,c#,azure,asp.net-core,redis,stackexchange.redis,C#,Azure,Asp.net Core,Redis,Stackexchange.redis,我正在两个P3V2实例上运行Azure App Services上的.NET Core 2.1 web api。使用StackExchange REDIS客户端连接到Azure REDIS服务Premium P1 目前,我们的峰值负载约为每秒7000个web请求。导致REDIS负载达到2,5MB/秒,最大缓存命中值为每分钟400k(Azure Metrics) 最近我遇到了连接问题,因此我正在调查所有可用文档: 没有连接可用于服务此操作:获取语言; 无法连接到redis服务器;连接超时 发生了
public static ConnectionMultiplexer Connection => LazyConnection.Value;
protected override IDatabase Cache => Connection.GetDatabase();
private static readonly Lazy<ConnectionMultiplexer> LazyConnection =
new Lazy<ConnectionMultiplexer>(() =>
{
var configurationOptions = CreateConfigurationOptions();
return ConnectionMultiplexer.Connect(configurationOptions);
});
protected static ConfigurationOptions CreateConfigurationOptions()
{
var deltaBackOffInMilliseconds = TimeSpan.FromSeconds(5).Milliseconds;
var maxDeltaBackOffInMilliseconds = TimeSpan.FromSeconds(20).Milliseconds;
var config = new ConfigurationOptions();
//https://docs.microsoft.com/en-us/azure/architecture/best-practices/retry-service-specific#azure-redis-cache-retry-guidelines
config.AbortOnConnectFail = false;
config.ConnectRetry = 3;
config.ConnectTimeout = _redisConfiguration.ConnectionTimeoutInMs;
config.ReconnectRetryPolicy = new ExponentialRetry(deltaBackOffInMilliseconds, maxDeltaBackOffInMilliseconds);
config.EndPoints.Add(_redisConfiguration.HostName);
config.Password = _redisConfiguration.Password;
config.Ssl = _redisConfiguration.Ssl;
config.DefaultDatabase = _redisConfiguration.DatabaseId;
return config;
}
publicstaticconnectionmultiplexerconnection=>LazyConnection.Value;
受保护的覆盖IDatabase缓存=>Connection.GetDatabase();
私有静态只读懒连接=
新懒惰(()=>
{
var configurationOptions=CreateConfigurationOptions();
返回ConnectionMultiplexer.Connect(配置选项);
});
受保护的静态配置选项CreateConfigurationOptions()
{
var deltaBackOffInMilliseconds=TimeSpan.FromSeconds(5).ms;
var maxDeltaBackOffInMilliseconds=TimeSpan.FromSeconds(20).ms;
var config=新配置选项();
//https://docs.microsoft.com/en-us/azure/architecture/best-practices/retry-service-specific#azure-redis缓存重试指南
config.AbortOnConnectFail=false;
config.ConnectRetry=3;
config.ConnectTimeout=\u redisConfiguration.connectionTimeoutims;
config.ReconnectRetryPolicy=新的指数重试(deltaBackOffInMilliseconds,maxDeltaBackOffInMilliseconds);
config.EndPoints.Add(_redisConfiguration.HostName);
config.Password=\u redisConfiguration.Password;
config.Ssl=\u redisConfiguration.Ssl;
config.DefaultDatabase=\u redisConfiguration.DatabaseId;
返回配置;
}
问题1:异步连接
我的web api是完全异步的(从控制器到SQL和REDIS)。那么,是否也建议从ConnectionMultiplexer实现ConnectAsync方法
问题2:自定义强制重新连接(已回答)
由于在上报告了一些SE.Redis问题,降级到1.2.6会有所帮助,我也降级到了这个版本。但这并没有解决我的连接问题
我偶然发现了Jon Cole的代码示例:
我将结合当前的SE.Redis1.2.6版本来实现这一点。但是我有疑问,当更新(返回)到最新的SE.Redis版本时,这是否仍然是必要的
编辑:乔恩·科尔回答说。每当遇到连接问题时,您可能仍希望添加此ForceReconnect。独立于您正在使用的SE.Redis版本。资料来源:
因为使用相同的负载很难调试或复制(本地或在登台环境中),所以我不得不在生产环境中进行测试