Планировщик задач на Node.js (node-cron, node-schedule, Bull)

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Планировщик задач в 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:

Рекомендаций