Специализация Frontend (React + TypeScript) — фундамент готов. Открыть frontend-раздел →

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 и порядок событий при выкате.
  • Бюджеты и наблюдаемость — сколько времени закладывать на завершение и как увидеть, что оно прошло чисто.

Статьи есть в вариантах под разные языки и стеки — выберите свой.