Очереди задач для TypeScript: обзор библиотек и практическая реализация
В современных веб-приложениях на TypeScript часто возникает необходимость выполнять ресурсоёмкие операции асинхронно, не блокируя основной поток. Для этого используются очереди задач (job queues). Они позволяют отложить выполнение, распределить нагрузку и обеспечить надёжную обработку фоновых процессов. В этой статье мы рассмотрим лучшие библиотеки для работы с очередями в TypeScript, их особенности и примеры использования.
Зачем нужны очереди задач?
Представьте, что вашему приложению нужно отправить 1000 писем, обработать изображения или выполнить сложные расчёты. Если делать это синхронно, пользователь будет ждать ответа минутами. Очередь решает эту проблему: вы помещаете задачу в список, а воркер (worker) обрабатывает её в фоне. Ключевые преимущества:
- Асинхронность и неблокирующая обработка
- Масштабирование (несколько воркеров могут работать параллельно)
- Устойчивость к сбоям (задача перезапускается при ошибке)
- Планирование (задачи можно откладывать на определённое время)
Топ библиотек для TypeScript
Большинство популярных решений построены на Redis — это быстрая in-memory база данных, идеально подходящая для очередей. Рассмотрим три основных варианта:
1. Bull (наиболее популярная)
Bull — зрелая и производительная библиотека для Node.js с полной поддержкой TypeScript. Она предоставляет богатый API и встроенные механизмы повторов, задержек и приоритетов.
Установка:
npm install bull
npm install @types/bull
Пример создания очереди и обработчика:
import Queue from 'bull';
// Создаём очередь для обработки email-рассылок
const emailQueue = new Queue('email', {
redis: { host: 'localhost', port: 6379 }
});
// Добавляем задачу
async function sendWelcomeEmail(userId: string) {
await emailQueue.add({ userId });
}
// Обработчик (воркер)
emailQueue.process(async (job) => {
const { userId } = job.data;
// Тут логика отправки письма
console.log(`Sending email to user ${userId}`);
await sendEmail(userId);
});
// Обработка ошибок и повторные попытки
emailQueue.on('failed', (job, err) => {
console.error(`Job ${job.id} failed: ${err.message}`);
});
2. Bee-Queue (лёгкая альтернатива)
Bee-Queue — минималистичная очередь, также работающая на Redis. Она проще Bull, но быстрее для простых сценариев. Хорошо подходит, когда не нужны сложные настройки.
Установка:
npm install bee-queue
npm install @types/bee-queue
Пример:
import Queue from 'bee-queue';
const imageQueue = new Queue('images', {
redis: { host: 'localhost', port: 6379 }
});
// Добавление задачи
imageQueue.createJob({ imagePath: '/uploads/photo.jpg' }).save();
// Обработка
imageQueue.process((job, done) => {
const { imagePath } = job.data;
// Обработка изображения
resizeImage(imagePath)
.then(() => done())
.catch(done);
});
3. RSMQ (без отдельного воркера)
RSMQ (Redis Simple Message Queue) — очередь на чистом Redis, которая не требует запуска отдельного воркер-процесса. Задачи обрабатываются через pull-механизм. Идеально для микросервисной архитектуры.
Установка:
npm install rsmq
Пример:
import RedisSMQ from 'rsmq';
const rsmq = new RedisSMQ({ host: 'localhost', port: 6379 });
// Создаём очередь
await rsmq.createQueueAsync({ qname: 'tasks' });
// Отправляем сообщение
await rsmq.sendMessageAsync({ qname: 'tasks', message: '{"type":"process_payment"}' });
// Получаем и обрабатываем (в цикле)
const message = await rsmq.receiveMessageAsync({ qname: 'tasks' });
if (message.id) {
console.log('Processing:', message.message);
await rsmq.deleteMessageAsync({ qname: 'tasks', id: message.id });
}
Сравнение библиотек
- Bull — для сложных проектов с высокими требованиями к надёжности (отложенные задачи, приоритеты, повторы).
- Bee-Queue — для простых сценариев, где важна скорость и минимальное потребление памяти.
- RSMQ — для случаев, когда не хочется запускать отдельный воркер-процесс, а обработка происходит в том же приложении.
Прод
Также в библиотеке
Генерация PDF отчётов на JavaScript (Node.js): Puppeteer, PDFKit, jsPDF
Работа с ZIP-архивами в PHP: полное руководство по ZipArchive
Отправка SMS на PHP: API библиотеки sms.ru и других сервисов
Chai для JavaScript (Node.js): полное руководство с примерами
Планировщик задач PHP: cron‑подобные задачи без crond