Мы случайно получаем следующие журналы ошибок в нашей службе приложений .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
Большое спасибо заранее.