intermediate

Graceful shutdown

Обрабатывайте signals, прекращайте accepting work, дожидайтесь in-flight requests, закрывайте resources и учитывайте orchestrator timeouts.

Graceful shutdown: не принимать новую работу, дождаться текущих запросов, закрыть соединения и фоновые ресурсы, затем выйти — нужно для деплоя без простоя и целостности данных.

					let shuttingDown = false;
const server = app.listen(PORT);

async function shutdown(signal) {
  if (shuttingDown) return;
  shuttingDown = true;
  logger.info({ signal }, 'shutdown started');
  server.close(() => logger.info('HTTP closed'));
  await Promise.race([
    drainInFlight(),
    sleep(orchestratorTimeoutMs),
  ]);
  await db.close();
  process.exit(0);
}

process.on('SIGTERM', () => shutdown('SIGTERM'));
process.on('SIGINT', () => shutdown('SIGINT'));
				

Kubernetes шлёт SIGTERM, затем kill по `terminationGracePeriodSeconds`. Закройте пулы БД, consumers очередей, таймеры. Readiness должен падать при drain, чтобы балансировщик не слал трафик.

На интервью: SIGTERM vs SIGINT; `server.close`; жёсткий таймаут.

Типовые ошибки: бесконечный drain; cron/очереди не остановлены; exit до commit транзакций.

Компромисс — между простотой, производительностью, безопасностью и эксплуатацией: назовите, что оптимизировали и какую цену приняли.

Чеклист:

  • Стоп accept + ранний fail health.
  • Счётчик in-flight запросов.
  • Ограниченный таймаут shutdown.
  • Интеграционный тест shutdown.