Graceful Shutdown
Graceful shutdown простыми словами: как сервис корректно завершается по SIGTERM — дренаж HTTP-запросов, остановка consumers и фоновых задач, k8s preStop и probes, чтобы при деплое не терять запросы и не рвать транзакции.
Вы выкатываете новую версию сервиса. Kubernetes останавливает старый pod — и часть запросов обрывается ошибкой, транзакция остаётся наполовину выполненной, сообщение из Kafka теряется. Каждый деплой превращается в лотерею: повезёт или нет.
Graceful shutdown — это набор приёмов, благодаря которым при остановке сервис успевает доделать начатое и не теряет ни одного запроса. Когда приходит сигнал «завершайся» (SIGTERM), сервис не падает мгновенно: он перестаёт принимать новый трафик, дожимает уже начатые запросы, аккуратно останавливает фоновые задачи и consumers, закрывает соединения с базой — и только потом выходит.
Этот раздел разбирает graceful shutdown по слоям, от которых он зависит:
- Конфигурация приложения — что включить, чтобы сервер вообще начал завершаться корректно, а не рвал соединения.
- HTTP-дренаж — как дожать активные запросы и почему без
preStopв Kubernetes всё равно теряется трафик. - База данных и транзакции — что происходит с пулом соединений и незавершёнными транзакциями.
- Фоновые задачи, @Async и outbox — как остановить периодические задачи, не оборвав их на середине.
- Kafka и consumers — как дочитать текущую порцию сообщений и не потерять offset.
- Идемпотентность и повторы — почему при остановке без идемпотентности возможны двойные операции.
- Kubernetes — probes,
preStop,terminationGracePeriodSecondsи порядок событий при выкате. - Бюджеты и наблюдаемость — сколько времени закладывать на завершение и как увидеть, что оно прошло чисто.
Статьи есть в вариантах под разные языки и стеки — выберите свой.