Skip to content

Корректное завершение работы

Корректное завершение работы (Graceful shutdown) - паттерн, который помогает остановить приложение без потери данных или прерывания выполняемых процессов (например, ответ на команду /start).

Какие будут ваши последние слова?

Сигналы

  • SIGINT (Signal Interrupt)

Этот сигнал отправляется, когда пользователь нажимает Ctrl+C.

  • SIGTERM (Signal Terminate)

Этот сигнал часто отправляется менеджерами процессов (такими как Docker, Kubernetes или systemd), когда им нужно завершить процесс.

Поэтому мы хотим обрабатывать оба.

Пример

Представьте, что у вас есть бот на вебхуках с использованием аналитики.

ts
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, и это всё!

Этот пример показывает, как корректно завершить работу вашего бота в правильном порядке для большинства приложений.