Планирование задач и фоновых заданий с node-cron
Запускайте повторяющуюся работу по расписанию, не дожидаясь запроса
node-cron позволяет описать эти часы привычной cron-строкой и передать ей функцию для запуска.
- читать и писать cron-выражения из пяти полей;
- планировать, запускать и останавливать задание с помощью
node-cron; - предотвращать наложение запусков медленного задания с помощью простого флага-замка;
- объяснять, почему запланированная работа должна быть вне обработчиков запросов;
- добавить настоящее ночное задание очистки в существующий Express API.
1. Зачем нужна запланированная работа
Ваш API большую часть жизни реагирует: приходит запрос, вы выполняете обработчик, отправляете ответ. Но у многих важных дел нет запроса позади. Никто не заходит на URL, чтобы вчерашние временные файлы удалились. Никто не нажимает кнопку, чтобы отправилось письмо-дайджест в 8 утра. Эта работа должна происходить по расписанию — по графику, который программа ведёт сама для себя.
Типичные запланированные задания, которые встречаются в продакшене:
- Очистки — удаление просроченных токенов сброса пароля, обрезка старых логов, удаление брошенных загрузок.
- Отчёты — построение ночной сводки продаж и отправка её команде по почте.
- Напоминания — уведомление пользователей, у которых пробный период кончается завтра.
- Опрос — каждые несколько минут спрашивать платёжный сервис, прошли ли отложенные списания.
Аналогия. Представьте смотрителя здания. Посетители (запросы) приходят и уходят весь день, а сотрудники на ресепшене (ваши обработчики маршрутов) их обслуживают. Но смотритель работает по графику, о котором никто не спрашивает: выносить мусор каждую ночь, проверять котёл каждое утро, поливать цветы по понедельникам. Запланированные задания — это смотритель вашего сервера: тихий, регулярный и незаменимый.
В Unix-системах у этого графика есть классическое имя: cron — фоновый демон, запускающий команды в заданное время. node-cron переносит ту же идею внутрь вашего Node-процесса, позволяя планировать JavaScript-функции, не выходя из приложения и не редактируя конфигурацию операционной системы.