Практикум: завершение HTTP-запросов перед закрытием ресурсов¶
driver.py запускает общий сервис отчётов и отправляет настоящие HTTP-запросы на localhost. Проверяются два исхода:
- Принятый отчёт длительностью 0,8 секунды возвращает 200 после смены readiness на 503; хранилище закрывается позже.
- Отчёт длительностью 30 секунд не укладывается в секундный лимит Uvicorn, отменяется и возвращает 500, поскольку отправка ответа ещё не началась. Затем закрывается ресурс. Такой ответ получен для этого обработчика и зафиксированных версий; это не общее правило для любой отмены.
AppSpec.drain_grace_seconds=3 оставляет HTTP-адаптеру время на завершение после лимита запроса в Uvicorn. Это разные ограничения. cleanup_timeout_seconds действует на отдельные шаги остановки; закрытие ресурсов в области приложения тоже должно иметь собственные ограничения.
server_servicewright.py и server_plain.py можно запускать вручную. Второй использует FastAPI lifespan и завершение запросов средствами Uvicorn: для многих приложений только с HTTP этого достаточно. Автоматический драйвер проверяет вариант с servicewright через Service.run(..., stop=event); он не посылает SIGTERM и не имитирует выкладку в Kubernetes. Доставку сигнала и задержку маршрутизации нужно проверить при развёртывании.
Сохраните соседний практикум с общим жизненным циклом: здесь используются его хранилище и обработчик. Docker не нужен.
Запустите из каталога docs/blog/lab/2026-09-07-graceful-shutdown в копии репозитория: