Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Wat是运行.NET Core 2.1 WebApi的最佳Azure REDIS Stackexchange配置和使用_C#_Azure_Asp.net Core_Redis_Stackexchange.redis - Fatal编程技术网

C# Wat是运行.NET Core 2.1 WebApi的最佳Azure REDIS Stackexchange配置和使用

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服务器;连接超时 发生了

我正在两个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实例。但看看客户端应用,我们认为这只是一个例子

我的执行情况如下:

    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版本。资料来源:

因为使用相同的负载很难调试或复制(本地或在登台环境中),所以我不得不在生产环境中进行测试