Корректное завершение работы
Корректное завершение работы (Graceful shutdown) - паттерн, который помогает остановить приложение без потери данных или прерывания выполняемых процессов (например, ответ на команду /start
).
Какие будут ваши последние слова?
Сигналы
SIGINT
(Signal Interrupt)
Этот сигнал отправляется, когда пользователь нажимает Ctrl+C.
SIGTERM
(Signal Terminate)
Этот сигнал часто отправляется менеджерами процессов (такими как Docker, Kubernetes или systemd), когда им нужно завершить процесс.
Поэтому мы хотим обрабатывать оба.
Пример
Представьте, что у вас есть бот на вебхуках с использованием аналитики.
import { app } from "./webhook";
import { bot } from "./bot";
import { posthog } from "./analytics";
const signals = ["SIGINT", "SIGTERM"];
for (const signal of signals) {
process.on(signal, async () => {
console.log(`Получен ${signal}. Начинаем завершение работы...`);
await app.stop();
await bot.stop();
await posthog.shutdown();
process.exit(0);
});
}
Во-первых, мы должны прекратить получение обновлений - остановить наш бэкенд API-фреймворк (например, Elysia).
Во-вторых, мы должны обработать все ожидающие обновления - остановить нашего бота с помощью метода bot.stop
.
И, наконец, мы должны вызвать posthog.shutdown()
, который отправляет собранную аналитику в наш экземпляр PostHog.
После этого мы выходим из нашего процесса с кодом статуса 0, и это всё!
Этот пример показывает, как корректно завершить работу вашего бота в правильном порядке для большинства приложений.