Я создал приложение на 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 и его взаимодействия с сервером.
Вот несколько шагов, которые могут помочь решить эту проблему:
-
Проверка состояния соединения: Как вы заметили, корректный мониторинг и аудит имеют важное значение. Когда проходит более 75 секунд без запроса, клиент может терять активное соединение с сервером ElasticSearch, что требует повторной инициализации соединения, и это время занимает около 15 секунд. Вы можете рассмотреть возможность настройки автоматического поддержания соединения или уменьшения времени, через которое клиент отключается от сервера.
-
Настройка интервала между запросами: Попробуйте настроить частоту выполнения запросов, чтобы она была выше, чем каждые 75 секунд. Это позволит избежать ситуации, при которой клиент должен восстанавливать соединение. Если ваши запросы не требуют частого обращения к сервису, подумайте о том, чтобы организовать фоновые задачи, которые периодически отправляют запросы, даже если они не являются критически важными.
-
Использование пулов соединений: Некоторые клиенты имеют возможность создавать пулы соединений, которые могут уменьшить задержку при выполнение первых запросов. Проверьте, есть ли такая возможность в вашем клиенте Elastic.
-
Обновление клиента: Поскольку вы упомянули, что используете устаревшую библиотеку Elasticsearch.Net 7.17.5, рекомендуется обновить клиент до последней версии. Новые версии библиотек часто содержат оптимизации производительности и решают известные проблемы.
-
Изоляция проблемы в Docker: Поскольку вы заметили, что проблема не возникает на локальной машине, но проявляется в Docker-контейнере, стоит проверить настройки Docker. Возможно, ограничения по ресурсам (CPU, память и т.д.) или особенности сетевой конфигурации в другом окружении могут вызывать эти задержки. Попробуйте запустить контейнер с увеличенными ресурсами или проверьте настройки сети.
- Проверка конфигурации сервера ElasticSearch: Убедитесь, что ваш сервер ElasticSearch настроен оптимально. Проверьте настройки таймаутов и пулов соединений. Также могут быть полезны метрики и логи с сервера Elastic, которые могут дать больше информации о задержках.
Применение этих стратегий должно помочь вам сократить время выполнения запросов и устранить задержки, возникающие после 75 секунд без активности.