Каждые 75 секунд без запроса к Elastic следующий запрос обрабатывается за 15 секунд.

Вопросы и ответы

Я создал приложение на asp .net 8, которое обращается к Elastic через внедренный сервис:

public static IServiceCollection AddElasticClient(this IServiceCollection services, ElasticSettings elasticSettings)
{
    var settings = new ConnectionSettings(new Uri(elasticSettings.Url))
      .ServerCertificateValidationCallback((o, certificate, chain, errors) => true)
      .ServerCertificateValidationCallback(CertificateValidations.AllowAll)
      .RequestTimeout(TimeSpan.FromMinutes(10))
      .EnableDebugMode()
      .EnableTcpStats()
      .EnableThreadPoolStats()
      .DisablePing()
      .DisableAutomaticProxyDetection()
      .SniffOnStartup(false)
      .BasicAuthentication(elasticSettings.Username, elasticSettings.Password);

    IElasticClient client = new Nest.ElasticClient(settings);
    services.AddSingleton(client);
    return services;
}

Я заметил, что первый запрос занимает более 15 секунд. Это всегда 15 секунд + несколько миллисекунд. После этого каждый следующий запрос завершается за 10-100 мс. Если за 75 секунд не поступит следующий запрос к Elastic, следующий запрос также завершится вновь за 15 секунд. Я включил детализированное логирование и заметил, что более длительные запросы происходят из-за дополнительного аудита:

# Аудит этого API вызова:
 - [1] ProductCheckOnStartup: Время: 00:00:15.1298210
 - [2] ProductCheckSuccess: Узел: https://{HIDDEN}:9201/ Время: 00:00:15.1296355
 - [3] HealthyResponse: Узел: https://{HIDDEN}:9201/ Время: 00:00:00.0944143

Странно, что этот аудит выполняется не только при старте, но и при каждом запросе, когда прошло более 75 секунд с момента предыдущего запроса. Сервис создается как singleton, так что это его единственный экземпляр. Мой клиент Elasticsearch — это Elasticsearch.Net 7.17.5. Я знаю, что это устаревшая библиотека, которая будет заменена в будущем.

Есть еще один момент — когда я запускаю это на запасной Windows машине, этой проблемы нет. Мое приложение запускается через Nomad как Docker-образ.

Ответ

Проблема, с которой вы столкнулись, связана с задержкой выполнения запросов к ElasticSearch, когда время между запросами превышает 75 секунд. Это происходит из-за особенностей работы клиента Elastic и его взаимодействия с сервером.

Вот несколько шагов, которые могут помочь решить эту проблему:

  1. Проверка состояния соединения: Как вы заметили, корректный мониторинг и аудит имеют важное значение. Когда проходит более 75 секунд без запроса, клиент может терять активное соединение с сервером ElasticSearch, что требует повторной инициализации соединения, и это время занимает около 15 секунд. Вы можете рассмотреть возможность настройки автоматического поддержания соединения или уменьшения времени, через которое клиент отключается от сервера.

  2. Настройка интервала между запросами: Попробуйте настроить частоту выполнения запросов, чтобы она была выше, чем каждые 75 секунд. Это позволит избежать ситуации, при которой клиент должен восстанавливать соединение. Если ваши запросы не требуют частого обращения к сервису, подумайте о том, чтобы организовать фоновые задачи, которые периодически отправляют запросы, даже если они не являются критически важными.

  3. Использование пулов соединений: Некоторые клиенты имеют возможность создавать пулы соединений, которые могут уменьшить задержку при выполнение первых запросов. Проверьте, есть ли такая возможность в вашем клиенте Elastic.

  4. Обновление клиента: Поскольку вы упомянули, что используете устаревшую библиотеку Elasticsearch.Net 7.17.5, рекомендуется обновить клиент до последней версии. Новые версии библиотек часто содержат оптимизации производительности и решают известные проблемы.

  5. Изоляция проблемы в Docker: Поскольку вы заметили, что проблема не возникает на локальной машине, но проявляется в Docker-контейнере, стоит проверить настройки Docker. Возможно, ограничения по ресурсам (CPU, память и т.д.) или особенности сетевой конфигурации в другом окружении могут вызывать эти задержки. Попробуйте запустить контейнер с увеличенными ресурсами или проверьте настройки сети.

  6. Проверка конфигурации сервера ElasticSearch: Убедитесь, что ваш сервер ElasticSearch настроен оптимально. Проверьте настройки таймаутов и пулов соединений. Также могут быть полезны метрики и логи с сервера Elastic, которые могут дать больше информации о задержках.

Применение этих стратегий должно помочь вам сократить время выполнения запросов и устранить задержки, возникающие после 75 секунд без активности.

Оцените материал
Добавить комментарий

Капча загружается...