Короткий ответ
Нужно обрабатывать SIGTERM, дожидаясь завершения уже принятых запросов и закрывая соединения с БД/брокером, прежде чем процесс завершится, а оркестратор должен давать приложению достаточный grace period перед принудительным SIGKILL.
Как это работает подробнее
при остановке контейнера Docker/Kubernetes сначала отправляет SIGTERM и ждёт grace period, затем присылает SIGKILL; Gunicorn/Uvicorn по умолчанию умеют корректно обрабатывать SIGTERM, переставая принимать новые соединения и ожидая завершения текущих.
Пример кода
config.yaml
services:
web:
build: .
stop_grace_period: 30sЧто использовать на практике
- Рекомендация. важно, чтобы оркестратор сначала убирал инстанс из балансировки, и только потом слал SIGTERM — иначе новые запросы продолжат приходить на останавливающийся инстанс; grace period должен быть больше самого долгого ожидаемого запроса.
Подводные камни
- Риск. слишком короткий grace period относительно реальной длительности запросов; перехват SIGTERM с мгновенным
sys.exit()без ожидания текущих запросов, что равносильно отсутствию graceful shutdown.