Очереди задач для JavaScript (Node.js): Bull, Bee-Queue и Kue
При разработке веб-приложений на Node.js часто возникает необходимость выполнять ресурсоёмкие или длительные операции вне основного потока обработки HTTP-запросов. Отправка email-рассылок, генерация PDF-отчётов, обработка загруженных изображений или взаимодействие с внешними API — все эти задачи могут блокировать ответ пользователю, если выполнять их синхронно. Для решения этой проблемы используются очереди задач (job queues).
Очередь задач — это механизм, который позволяет:
- Откладывать выполнение работы на фоне.
- Управлять приоритетами и порядком обработки.
- Автоматически повторять задания при ошибках.
- Масштабировать обработку горизонтально (несколько воркеров).
В экосистеме Node.js наибольшую популярность получили три библиотеки: Bull, Bee-Queue и Kue. Все они построены поверх Redis, что обеспечивает высокую производительность и устойчивость к сбоям. Рассмотрим каждую из них подробно.
1. Bull — самая популярная и функциональная очередь
Bull (npm: bull) — это зрелая, хорошо документированная библиотека, которая поддерживает практически все необходимые сценарии: отложенные задачи, повторение по расписанию, приоритеты, лимиты скорости, стеки ошибок и даже визуальный интерфейс (Arete). Bull активно поддерживается сообществом и рекомендуется для production-проектов.
Установка:
npm install bull
Простой пример — создание очереди и обработчика:
const Queue = require('bull');
// Создаём очередь с именем 'email'
const emailQueue = new Queue('email', {
redis: { host: 'localhost', port: 6379 }
});
// Добавляем задачу (job)
emailQueue.add({
to: 'user@example.com',
subject: 'Добро пожаловать!',
body: 'Спасибо за регистрацию.'
}, {
attempts: 3, // попытки при ошибке
backoff: 5000, // задержка между попытками (5 сек)
delay: 10000 // отложить на 10 секунд
});
// Обработчик (воркер)
emailQueue.process(async (job) => {
const { to, subject, body } = job.data;
console.log(`Отправка письма на ${to}: ${subject}`);
// Здесь вызов вашей функции отправки email
await sendEmail(to, subject, body);
});
Ключевые возможности Bull:
- Повторные попытки — настройка количества ретраев и экспоненциальная задержка.
- Расписание (cron) — выполнение задач по расписанию (например, каждую ночь).
- Приоритеты — задания с высоким приоритетом обрабатываются раньше.
- События — подписка на события (completed, failed, progress).
- Graceful shutdown — корректное завершение работы.
2. Bee-Queue — лёгкая и быстрая очередь
Bee-Queue (npm: bee-queue) — минималистичная альтернатива Bull. Она предлагает только базовые возможности, но делает это с минимальными накладными расходами. Bee-Queue идеально подходит для простых сценариев, где не нужны сложные настройки, но важна скорость.
Установка:
npm install bee-queue
Пример использования:
const Queue = require('bee-queue');
const imageQueue = new Queue('image-processing', {
redis: { host: '127.0.0.1', port: 6379 },
isWorker: true
});
// Добавляем задачу
imageQueue.createJob({ imageId: 123, size: 'thumbnail' })
.timeout(30000) // таймаут 30 сек
.retries(2) // 2 попытки
.save()
.then(job => console.log('Job created:', job.id));
// Обработчик
imageQueue.process((job, done) => {
console.log(`Обрабатываем изображение ${job.data.imageId}`);
// Выполняем работу
processImage(job.data.imageId, job.data.size);
done(); // Обязательно вызываем для завершения
});
Особенности Bee-Queue:
- Очень низкая задержка (latency) — подходит для real-time.
- Простой API — меньше методов, чем у Bull.
- Не поддерживает приоритеты и расписание из коробки.
- Требует ручного вызова
done().
3. Kue — классика, но с оговорками
Также в библиотеке
Логирование для Kotlin: лучшие решения и библиотеки
Конфигурация приложений Java: обзор библиотек и инструментов
Работа с CSV в TypeScript: библиотеки, парсинг и генерация данных
Очереди задач в Swift: GCD, OperationQueue и Swift Concurrency
Конфигурация приложений Swift (iOS/macOS): библиотеки и инструменты