Очереди задач для TypeScript: Bull, Agenda, и Bee-Queue

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

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

Начать курс

Очереди задач для TypeScript: Bull, Agenda и Bee-Queue

В современных веб-приложениях на TypeScript часто возникает необходимость выполнять ресурсоёмкие или длительные операции асинхронно, не блокируя основной поток. Очереди задач (Job Queues) — это проверенный архитектурный паттерн, который позволяет отложить выполнение задач, распределить нагрузку между воркерами и обеспечить надёжность обработки. В этой статье мы рассмотрим три популярных инструмента для TypeScript: Bull, Agenda и Bee-Queue. Вы узнаете, как их интегрировать в проект, в чём их сильные стороны и какой инструмент выбрать для конкретных сценариев.

1. Bull — мощная очередь на базе Redis

Bull — это, пожалуй, самая популярная библиотека для управления очередями задач в Node.js/TypeScript. Она использует Redis как бэкенд, что обеспечивает высокую производительность и устойчивость к сбоям. Bull поддерживает приоритеты задачи, повторные попытки, задержки, а также сложные сценарии с паузами и возобновлением очереди.

Установка:

npm install bull
npm install @types/bull  // для TypeScript

Пример простого producer-consumer:

import Queue from 'bull';

// Создаём очередь с именем 'email'
const emailQueue = new Queue('email', {
  redis: { host: 'localhost', port: 6379 }
});

// Producer: добавляем задачу
async function sendWelcomeEmail(userId: string) {
  await emailQueue.add(
    { userId, type: 'welcome' },
    { attempts: 3, backoff: 2000 }  // 3 попытки с задержкой 2с
  );
}

// Consumer: обрабатываем задачу
emailQueue.process(async (job) => {
  const { userId, type } = job.data;
  console.log(`Отправка ${type} письма пользователю ${userId}`);
  // Здесь логика отправки email
});

Bull также предоставляет удобный UI-мониторинг через bull-board или bull-repl, что упрощает отладку в продакшене.

2. Agenda — гибкая очередь с поддержкой расписаний

Agenda — это библиотека, которая также использует MongoDB в качестве хранилища. Её главная особенность — встроенная поддержка периодических задач (cron-подобные расписания) и удобный API для определения повторяющихся работ. Agenda отлично подходит для задач, которые должны выполняться по расписанию: очистка базы данных, генерация отчётов, отправка дайджестов.

Установка:

npm install agenda
npm install @types/agenda

Пример использования с расписанием:

import Agenda from 'agenda';

const agenda = new Agenda({
  db: { address: 'mongodb://localhost:27017/agenda-example' }
});

// Определяем задачу
agenda.define('send weekly report', async (job) => {
  const { department } = job.attrs.data;
  console.log(`Генерация еженедельного отчёта для отдела ${department}`);
});

// Запускаем агента и планируем задачу
(async () => {
  await agenda.start();
  // Выполнять каждую пятницу в 18:00
  await agenda.every('0 18 * * 5', 'send weekly report', { department: 'IT' });
})();

Agenda поддерживает приоритеты, повторные попытки и graceful shutdown. Однако она менее производительна, чем Bull, из-за использования MongoDB вместо Redis.

3. Bee-Queue — лёгкая и быстрая очередь

Bee-Queue — это минималистичная очередь на Redis, ориентированная на максимальную производительность и малый размер кода. Она не поддерживает сложные функции вроде приоритетов или расписаний, но идеально подходит для простых сценариев, где важна скорость и низкое потребление памяти.

Установка:

npm install bee-queue
npm install @types/bee-queue

Пример работы:

import Bee from 'bee-queue';

const imageQueue = new Bee('image-processing', {
  redis: { host: 'localhost', port: 6379 }
});

// Producer
imageQueue.createJob({ imageId: 'img_123', format: 'webp' }).save();

// Consumer
imageQueue.process(async (job) => {
  const { imageId, format } = job.data;
  console.log(`Конвертация изображения ${imageId} в ${format}`);
  // Логика обработки
});

Bee-Queue автоматически управляет повторными попытками (с настраиваемой задержкой) и поддерживает работу с несколькими воркерами. Единственный минус — отсутствие встроенного мониторинга.

Сравнение и выбор инструмента

Выбор между Bull, Agenda и Bee-Queue зависит от ваших задач:

  • Bull — лучший выбор для сложных систем с высокими требованиями к надёжности, приоритетам и мониторингу. Подходит для микросервисной архитектуры.

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