Очереди задач для JavaScript (Node.js): Bull, Bee-Queue и Kue
При разработке веб-приложений на Node.js часто возникает необходимость выполнять длительные или ресурсоёмкие операции асинхронно, не блокируя основной поток обработки запросов. Типичные примеры: отправка email-уведомлений, обработка загруженных изображений, генерация PDF-отчётов или синхронизация с внешними API. Для решения этих задач используются очереди задач (job queues) — механизм, который позволяет отложить выполнение работы, распределить нагрузку и обеспечить отказоустойчивость.
В этой статье мы рассмотрим три популярные библиотеки для управления очередями в экосистеме Node.js: Bull, Bee-Queue и Kue. Каждая из них имеет свои особенности, преимущества и сценарии использования.
Зачем нужны очереди задач?
Основные причины внедрения очередей в бэкенд на Node.js:
- Разгрузка основного потока. Долгие операции (например, отправка 1000 писем) не блокируют ответ пользователю.
- Повторные попытки. Если задача завершилась ошибкой, очередь автоматически повторит её через заданный интервал.
- Планирование. Можно отложить выполнение задачи на определённое время (например, через 1 час).
- Масштабирование. Несколько воркеров могут параллельно обрабатывать задачи из одной очереди.
1. Bull — современная и производительная очередь
Bull — это одна из самых популярных библиотек для работы с очередями в Node.js. Она построена на основе Redis и предоставляет богатый API для управления задачами.
Основные возможности Bull:
- Поддержка приоритетов задач.
- Настраиваемые повторные попытки (retries).
- Отложенный запуск (delay).
- События (job завершена, ошибка, прогресс).
- Встроенный UI-интерфейс для мониторинга через
bull-board.
Установка:
npm install bull
Пример создания очереди и обработчика:
const Queue = require('bull');
// Создаём очередь для отправки email
const emailQueue = new Queue('email', {
redis: { host: '127.0.0.1', port: 6379 }
});
// Добавляем задачу в очередь
emailQueue.add({
to: 'user@example.com',
subject: 'Привет!',
body: 'Это тестовое письмо'
}, {
attempts: 3, // повторить до 3 раз при ошибке
delay: 5000 // отложить на 5 секунд
});
// Обработчик задач
emailQueue.process(async (job) => {
const { to, subject, body } = job.data;
// Имитация отправки письма
await sendEmail(to, subject, body);
console.log(`Письмо отправлено: ${to}`);
});
Когда выбирать Bull: если вам нужна надёжная очередь с расширенными функциями (приоритеты, повторные попытки, мониторинг) и вы готовы использовать Redis.
2. Bee-Queue — лёгкая и быстрая
Bee-Queue — это минималистичная очередь, также работающая на Redis. Она ориентирована на простоту и производительность. Код библиотеки компактен, API интуитивно понятен.
Особенности Bee-Queue:
- Нет зависимостей, кроме Redis.
- Поддержка событий (ready, job succeeded, job failed).
- Возможность настройки таймаута обработки.
- Простая система повторных попыток.
Установка:
npm install bee-queue
Пример использования:
const Queue = require('bee-queue');
const imageQueue = new Queue('image-processing', {
redis: { host: '127.0.0.1', port: 6379 }
});
// Добавляем задачу
imageQueue.createJob({ imagePath: '/uploads/photo.jpg' })
.retries(2)
.save();
// Обработчик
imageQueue.process(async (job) => {
const { imagePath } = job.data;
// Обработка изображения
await processImage(imagePath);
console.log(`Изображение обработано: ${imagePath}`);
});
Когда выбирать Bee-Queue: если проект небольшой, не требуется сложная логика планирования, а скорость и простота важнее расширенных функций.
3. Kue — классика с встроенным UI
Kue — одна из старейших библиотек для очередей в Node.js. Она также использует Redis, но имеет встроенный веб-интерфейс для просмотра и управления задачами. Однако стоит отметить, что Kue менее активно поддерживается в послед