Планировщик задач в Node.js: обзор библиотек node-cron, node-schedule и Bull
В современной веб-разработке на Node.js часто возникает потребность выполнять код по расписанию или с задержкой. Будь то отправка email-рассылок, очистка кэша, генерация отчётов или синхронизация данных — без надёжного планировщика задач не обойтись. В этой статье мы разберём три популярных инструмента: node-cron, node-schedule и Bull. Вы узнаете их особенности, примеры использования и поймёте, какой выбрать под свою задачу.
1. node-cron — классика Cron для Node.js
node-cron — это минималистичная библиотека, реализующая синтаксис Unix-планировщика cron. Она идеально подходит для простых повторяющихся задач.
Установка
npm install node-cron
Пример: задача, выполняющаяся каждую минуту
const cron = require('node-cron');
cron.schedule('* * * * *', () => {
console.log('Задача выполняется каждую минуту');
});
Формат cron-выражения
Выражение состоит из 5 полей:
секунда (0-59, опционально)минута (0-59)час (0-23)день месяца (1-31)месяц (1-12)день недели (0-7, 0 и 7 = воскресенье)
Продвинутый пример: ежедневно в 8:30 утра
cron.schedule('30 8 * * *', () => {
// Отправка утренней статистики
sendMorningReport();
});
Особенности
- Поддержка временных зон через опцию
timezone - Возможность запуска и остановки задач
- Лёгкий вес (~20 КБ)
- Не подходит для сложной логики с очередями
2. node-schedule — гибкий планировщик с рекуррентными правилами
node-schedule предоставляет более богатый API: можно задавать расписание через объекты, а не только cron-строки. Это удобно для сложных сценариев (например, «каждый второй вторник месяца в 15:00»).
Установка
npm install node-schedule
Пример: задача по cron-выражению
const schedule = require('node-schedule');
const job = schedule.scheduleJob('*/5 * * * *', () => {
console.log('Запуск каждые 5 минут');
});
Пример: рекуррентное правило через объект
const rule = new schedule.RecurrenceRule();
rule.dayOfWeek = [1, 3, 5]; // Пн, Ср, Пт
rule.hour = 10;
rule.minute = 30;
schedule.scheduleJob(rule, () => {
console.log('Задача по будням в 10:30');
});
Пример: отложенный запуск
const date = new Date(Date.now() + 5000); // через 5 секунд
schedule.scheduleJob(date, () => {
console.log('Одноразовая задача через 5 секунд');
});
Особенности
- Гибкое задание правил (дни недели, месяцы, диапазоны)
- Поддержка одноразовых задач по дате
- Возможность отмены задачи:
job.cancel() - Не поддерживает кластеризацию и очереди
3. Bull — мощная очередь с планировщиком и повторами
Bull — это не просто планировщик, а полноценная система очередей на основе Redis. Она идеальна для продакшн-сред: поддерживает отложенные задачи, повторы при ошибках, приоритеты и параллельную обработку.
Установка
npm install bull
# Требуется установленный Redis
Пример: простая задача с задержкой
const Queue = require('bull');
const myQueue = new Queue('myQueue', 'redis://127.0.0.1:6379');
// Добавляем задачу с задержкой 1 час
myQueue.add({ email: 'user@example.com' }, { delay: 3600000 });
// Обработчик
myQueue.process(async (job) => {
console.log(`Отправка email для ${job.data.email}`);
await sendEmail(job.data.email