У нас есть приложение Spring Boot (2.0.4), предоставляющее ряд конечных точек, одна из которых позволяет клиентам извлекать иногда очень большие файлы (~ 200 ГБ).Приложение предоставляется в Pod через развертывание Kubernetes, настроенное с помощью стратегии скользящего обновления.
Когда мы обновляем наше развертывание, устанавливая образ на последнюю версию, модули уничтожаются, а новые запускаются.Предоставление наших услуг является бесшовным для новых запросов.Однако текущие запросы могут и не получаться, и это может раздражать клиентов во время загрузки очень больших файлов.
Мы можем настроить перехваты Pre-Stop жизненного цикла контейнера в нашей спецификации развертывания, чтобы ввести паузу перед отправкой завершения работысигналы к приложению через его PID.Это помогает предотвратить любой новый трафик, идущий к модулям, которые были установлены на Завершение.Есть ли способ приостановить процесс завершения работы приложения до тех пор, пока все текущие запросы не будут выполнены (это может занять десятки минут)?
Вот что мы попробовали из приложения Spring Boot:
Реализация прослушивателя отключения, который перехватывает ContextCloseEvents
;к сожалению, мы не можем надежно получить список активных запросов.Любые метрики привода, которые могли быть полезны, недоступны на данном этапе процесса выключения.
Подсчет активных сеансов путем реализации HttpSessionListener
и переопределения sessionCreated/Destroy
методов для обновления счетчика.Это терпит неудачу, потому что методы не вызываются в отдельном потоке, поэтому всегда сообщайте одно и то же значение в слушателе завершения работы.
Любая другая стратегия, которую мы должны попробовать?Из самого приложения, или из контейнера, или напрямую через дескрипторы ресурсов Kubernetes?Советы / справка / указатели были бы весьма признательны.
Редактировать: мы управляем кластером, поэтому мы пытаемся уменьшить простои служб только для подключенных в данный момент клиентов во время управляемого обновления нашего развертывания через модифицированный модуль.spec