Graceful shutdown
Тема дорожной карты · Node.js
Graceful shutdown (корректное завершение работы) — это процесс, при котором серверное приложение Node.js завершает обработку текущих запросов перед выходом, гарантируя, что ни один запрос не будет потерян или оставлен в несогласованном состоянии, когда процесс получает сигнал завершения. Приложения Node.js реализуют корректное завершение, слушая сигналы process.on('SIGTERM') и process.on('SIGINT'), вызывая server.close() для прекращения приёма новых соединений, ожидая завершения активных соединений, закрывая пулы соединений с базами данных и только затем вызывая process.exit(0). Оркестраторы контейнеров, такие как Kubernetes, отправляют SIGTERM перед принудительным завершением пода, давая серверным приложениям Node.js настраиваемый период ожидания (задаваемый параметром terminationGracePeriodSeconds) для завершения текущей работы — это необходимо для безопасных rolling-обновлений без простоев. HTTP-серверы Express.js не закрывают автоматически keep-alive-соединения, поэтому логика корректного завершения также должна отслеживать и уничтожать зависшие сокеты, иначе колбэк server.close() никогда не будет вызван. Библиотеки @godaddy/terminus или lightship предоставляют готовые примитивы корректного завершения и проверки работоспособности для Node.js, которые чисто интегрируются с пробами liveness и readiness в Kubernetes.
Как это работает
Graceful shutdown имеет три столпа в Node: метрики (Prometheus-style counters/histograms через prom-client), логи (структурированный JSON через pino/winston, отправляется в Loki/Elastic), distributed tracing (OpenTelemetry SDK + exporter в Jaeger/Tempo). Node имеет встроенные performance hooks (perf_hooks), HTTP request/response события, async-local-storage (node:async_hooks) для request-scoped контекста. Всегда логируйте trace ID на каждую строку для корреляции.
Когда применять
Структурированное логирование — с первого дня; pino — современный дефолт (быстрее winston, JSON-first). Prometheus-эндпойнт (/metrics) — на любой сервис с реальным трафиком. OpenTelemetry tracing — когда сервисов больше одного или хотите дебажить latency через границы. Алёрты на event-loop lag, HTTP error rate, рост памяти — ловят баги, на которые "приложение работает нормально".
Типичные ошибки
Ловушки Graceful shutdown: console.log повсюду в production (без структуры, дорого grep-ать, без уровней); логирование секретов (карты, токены); high-cardinality метрики (request-id убивает Prometheus); tracing без sampling (трейсы перегружают backend); нет политики retention для логов (диск забивается, история теряется). Observability — фича, не afterthought.