Очереди задач для 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 — лучший выбор для сложных систем с высокими требованиями к надёжности, приоритетам и мониторингу. Подходит для микросервисной архитектуры.
Также в библиотеке
rig для Rust: полное руководство с примерами
HTTP-клиент для JavaScript (Node.js): топ библиотек 2025