Очереди задач в Node.js: Bull, Bee-Queue, Kue и реализация на Redis

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

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

Начать курс

Очереди задач для 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 — классика, но с оговорками

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