Не удалось подключиться к серверу (-ам) redis;ConnectTimeout - PullRequest
0 голосов
/ 03 июня 2019

Я использую функцию Azure V1 с StackExchange.Redis 1.2.6.Функция получения 1000 сообщений в минуту, Для каждого сообщения, Для каждого устройства я проверяю Redis.Я заметил, что когда в это время у нас появляется больше сообщений, мы получаем ошибку ниже.

Исключительная ситуация при выполнении функции: TSFEventRoutingFunction Нет соединения для обслуживания этой операции: HGET GEO_DYNAMIC_hash;Не удалось подключиться к серверу (-ам) redis;ConnectTimeout;IOCP: (Занято = 1, Свободно = 999, Мин. = 24, Макс. = 1000), РАБОЧИЙ: (Занято = 47, Свободно = 32720, Мин. = 24, Макс. = 32767), Local-CPU: н / д Не быловозможно подключение к серверу (-ам) redis;ConnectTimeout

CacheService в соответствии с рекомендациями MS

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);
    }
}

Я ввожу ICacheService в функцию Azure и вызываю GetAsync Метод при каждом запросе.

Использование экземпляра Azure Redis C3

enter image description here

В настоящее время вы видите, что у меня есть одно соединение, Создание нескольких соединений поможет решитьЭта проблема?или Любое другое предложение, чтобы решить / понять эту проблему.

1 Ответ

1 голос
/ 03 июня 2019

Есть много разных причин ошибки, которую вы получаете. Вот некоторые из них, которые я могу придумать вне головы (не в каком-то определенном порядке):

  1. Ваш connectTimeout слишком мал . Я часто вижу, как клиенты часто устанавливают небольшой тайм-аут соединения, потому что они думают, что это обеспечит установление соединения в течение этого промежутка времени. Проблема с этим подходом заключается в том, что когда что-то идет не так (высокая загрузка ЦП, высокая загрузка ЦП сервера и т. Д.), Попытка подключения завершится неудачей. Это часто усугубляет плохую ситуацию - вместо того, чтобы помочь, оно усугубляет проблему, заставляя систему перезапускать процесс попытки переподключения, что часто приводит к циклу connect -> fail -> retry . Как правило, я рекомендую, чтобы вы оставляли свой ConnectionTimeout на 15 секунд или выше. Лучше, чтобы попытка подключения была успешной через 15 или 20 секунд, чем повторение сбоя через 5 секунд, что приведет к отключению, которое длится несколько минут до окончательного восстановления системы.

  2. Происходит аварийное переключение на стороне сервера. Сервер разрывает соединение в результате сбоя некоторого типа от главной к реплике. Это может произойти, если программное обеспечение на стороне сервера обновляется на уровне Redis, уровне ОС или уровне хостинга.

  3. Отказ сетевой инфраструктуры какого-либо типа (аппаратное обеспечение между клиентом и сервером видит какую-либо проблему).

  4. Вы меняете пароль доступа для своего экземпляра Redis . Смена пароля приведет к сбросу подключений ко всем клиентам, что приведет к их повторной аутентификации.

  5. Необходимо изменить настройки пула потоков . Если настройки пула потоков не настроены должным образом для вашей рабочей нагрузки, вы можете столкнуться с задержками запуска новых потоков, как объяснено здесь .

Я написал кучу рекомендаций для Redis , которые помогут вам избежать других проблем.

...