Что такое Graceful Shutdown и как его реализовать?#architecture #nodejs_api
Девятый пункт
The 12-Factor App Manifesto гласит:
Maximize robustness with fast startup and graceful shutdown , что в переводе означает: "Максимизируйте надёжность с помощью быстрого запуска и корректного завершения работы". Таким образом graceful shutdown
это корректное завершение работы. По умолчанию #nodejs выключается не безопасно – существуют риски повреждения работоспособности приложения при последующем запуске.
Для завершения работы приложения OS отправляет Unix сигнал Node.js процессу. В зависимости от контекста работы процесса и метода его остановки это могут быть SIGINT, SIGTERM, SIGHUP и прочие. Для обработки такого сигнала существует обработчик
process.on('<SIGNAL_NAME>', подробней в
документации. Есть библиотеки для этих целей, например
death. Во многих фреймворках существуют готовые методы, например в nestjs это
enableShutdownHooks.
Вот, что я обычно рекомендую делать для корректного завершения работы:
1. Записать в лог начало выключения.
2. Закрыть входящий поток бизнес-логики. Например: прекратить прием новых задач на обработку из очереди, прекратить обработку новых входящих HTTP-запросов и т.д.
3. Установите принудительный тайм-аут для завершения текущих задач или сохраните их для дальнейшей обработки. Рекомендуемое значение этого таймаута - не более секунды.
4. Уведомить клиентов об отключении в случае постоянного подключения (ws, sse и т.п.). Это называется heartbeat-shutdown.
5. Правильно отключите все соединения. Например: база данных, очереди, кэши.
6. Зарегистрируйте завершение корректного завершения работы и остановите процесс через process.exit().