Если для параметра AbortOnConnectFail установлено значение false, мы все равно получаем ConnectTimeout в Azure REDIS - PullRequest
0 голосов
/ 14 февраля 2019

Мы случайно получаем следующие журналы ошибок в нашей службе приложений .NET Core 2.0 Azure:

StackExchange.Redis.RedisConnectionException: No connection is available to service this operation: GET post:307948:media;
It was not possible to connect to the redis server(s). 
To create a disconnected multiplexer, disable AbortOnConnectFail. 
ConnectTimeout; IOCP: (Busy=0,Free=1000,Min=4,Max=1000), 
WORKER: (Busy=20,Free=662,Min=4,Max=682), 
Local-CPU: n/a ---> System.AggregateException: One or more errors occurred. 
(It was not possible to connect to the redis server(s). 
To create a disconnected multiplexer, disable AbortOnConnectFail. ConnectTimeout) 
(UnableToConnect on api-prod.redis.cache.windows.net:6380/Interactive, 
Initializing, last: NONE, 
origin: BeginConnectAsync, outstanding: 0, last-read: 12s ago, last-write: 12s ago, 
unanswered-write: 290293s ago, keep-alive: 60s, 
state: Connecting, mgr: 10 of 10 available, 
last-heartbeat: never, global: 0s ago, v: 2.0.513.63329)

Все ответы и сообщения в блогах, которые я нашел, говорят нам установить свойство AbortOnConnectFail в ложь.Мы уже установили для этого свойства значение false, и все же эти ошибки возникают.Вот наша реализация:

public class CacheService : ICacheService
    {
        private static IRedisConfiguration _redisConfiguration;
        private readonly IDateService _dateService;

        private static readonly Lazy<ConnectionMultiplexer> LazyConnection =
            new Lazy<ConnectionMultiplexer>(() =>
            {
                var configurationOptions = CreateConfigurationOptions();
                return ConnectionMultiplexer.Connect(configurationOptions);
            });

        public CacheService(IRedisConfiguration redisConfiguration, IDateService dateService)
        {
            _redisConfiguration = redisConfiguration;
            _dateService = dateService;
        }

        private 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 = 2000;
            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;
        }

        public static ConnectionMultiplexer Connection => LazyConnection.Value;

        public static IDatabase Cache => Connection.GetDatabase();
}

В службе приложений Azure я проверил соединения TCP, и предупреждения не отображаются.Произошло увеличение исходящих соединений , но оно было ниже 1000.

При двух запущенных API-интерфейсах у нас около 80 соединений, почти постоянных.Без увеличения в течение дня, поэтому кажется, что управление соединениями кажется правильным.

Какие-нибудь советы, как решить эту проблему?Возможно, это связано с некоторыми дополнительными настройками.

Redis Azure: P1 Premium StackExchange.Redis версия: 2.0.513 .NET Core API, работающая на .NET Core 2.0

Большое спасибо заранее.

...