Планировщик задач в Node.js: обзор и примеры использования
В современной backend-разработке часто возникает необходимость выполнять код по расписанию: отправлять email-рассылки, очищать кэш, создавать бэкапы баз данных или обновлять агрегированные данные. В экосистеме Node.js для этих целей существует несколько зрелых библиотек. В этой статье мы разберём три основных подхода к планированию задач: классический cron, гибкое расписание и очереди задач.
1. node-cron — классический cron для JavaScript
node-cron — это минималистичная библиотека, которая позволяет запускать функции по стандартным cron-выражениям. Она идеально подходит для простых периодических задач (каждую минуту, каждый час, каждый день в 3:00).
Установка:
npm install node-cron
Пример задачи, которая выполняется каждую минуту:
const cron = require('node-cron');
cron.schedule('* * * * *', () => {
console.log('Задача выполняется каждую минуту');
});
Структура cron-выражения: секунда минута час день_месяца месяц день_недели (в node-cron секунда опциональна).
Примеры выражений:
'0 0 * * *'— каждый день в полночь'*/5 * * * *'— каждые 5 минут'0 9-18 * * 1-5'— каждый час с 9 до 18 по будням'30 3 * * 0'— каждое воскресенье в 3:30
Библиотека поддерживает валидацию выражений и запуск/остановку задач:
const task = cron.schedule('*/10 * * * *', () => {
// задача каждые 10 минут
});
// Остановить задачу
task.stop();
// Возобновить
task.start();
// Проверить, активна ли задача
console.log(task.isStarted()); // true/false
Когда использовать: для простых периодических действий, где не требуется хранение состояния или обработка ошибок.
2. node-schedule — гибкое расписание с поддержкой рекуррентных правил
node-schedule — более мощная альтернатива, которая позволяет задавать расписание не только через cron, но и через JavaScript-объекты с явным указанием дат, дней недели и времени.
Установка:
npm install node-schedule
Пример с cron-выражением:
const schedule = require('node-schedule');
const job = schedule.scheduleJob('*/5 * * * *', () => {
console.log('Выполняется каждые 5 минут');
});
Главное преимущество — возможность задать расписание через объект:
const job = schedule.scheduleJob({
hour: 14,
minute: 30,
dayOfWeek: [1, 3, 5] // понедельник, среда, пятница
}, () => {
console.log('14:30 по будням');
});
Также можно запланировать одноразовую задачу на конкретную дату:
const date = new Date(2025, 11, 31, 23, 59, 0);
schedule.scheduleJob(date, () => {
console.log('Новый год наступил!');
});
Библиотека поддерживает отмену задачи и проверку следующего времени выполнения:
// Отменить задачу
job.cancel();
// Получить следующую дату выполнения
console.log(job.nextInvocation()); // Date object
Когда использовать: когда нужно точное управление временем, комбинирование правил или одноразовые задачи.
3. Bull — очереди задач с планированием и повторными попытками
Bull — это полноценная система очередей на базе Redis, которая включает в себя мощный планировщик. Bull позволяет не только откладывать задачи, но и управлять повторами, приоритетами и параллельным выполнением.
Установка:
npm install bull
Базовый пример очереди с отложенной задачей:
const Queue = require('bull');
const emailQueue = new Queue('email', {
redis: { host: 'localhost', port: 6379 }
});
// Добавить задачу с задержкой в 1 час
emailQueue.add(
{ to: 'user@example.com', subject: 'Привет!' },
{ delay: 3600000 } // 1 час в миллисекундах
);
// Обработчик очереди
emailQueue.process(async (job) => {
console.log(`Отправляем письмо на ${job.data.to}`);
// логика отправки
});
Bull поддерживает повторяющиеся задачи через метод add с опцией repeat: