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.