Colas de tareas para TypeScript: Bull, Agenda y Bee-Queue
En las aplicaciones web modernas con TypeScript, a menudo surge la necesidad de ejecutar operaciones que consumen muchos recursos o son de larga duración de forma asíncrona, sin bloquear el hilo principal. Las colas de tareas (Job Queues) son un patrón arquitectónico probado que permite retrasar la ejecución de tareas, distribuir la carga entre los trabajadores y garantizar la fiabilidad del procesamiento. En este artículo, analizaremos tres herramientas populares para TypeScript: Bull, Agenda y Bee-Queue. Aprenderá cómo integrarlas en su proyecto, cuáles son sus puntos fuertes y qué herramienta elegir para escenarios específicos.
1. Bull — una potente cola basada en Redis
Bull es, probablemente, la biblioteca más popular para gestionar colas de tareas en Node.js/TypeScript. Utiliza Redis como backend, lo que garantiza un alto rendimiento y resistencia a fallos. Bull admite prioridades de tareas, reintentos, retrasos, así como escenarios complejos con pausas y reanudación de la cola.
Instalación:
npm install bullnpm install @types/bull // para TypeScriptEjemplo de un productor-consumidor simple:
import Queue from 'bull';
// Creamos una cola con el nombre 'email'const emailQueue = new Queue('email', { redis: { host: 'localhost', port: 6379 }});
// Productor: añadimos una tareaasync function sendWelcomeEmail(userId: string) { await emailQueue.add( { userId, type: 'welcome' }, { attempts: 3, backoff: 2000 } // 3 intentos con un retraso de 2s );}
// Consumidor: procesamos la tareaemailQueue.process(async (job) => { const { userId, type } = job.data; console.log(`Enviando correo ${type} al usuario ${userId}`); // Aquí la lógica de envío de correo});Bull también proporciona una práctica interfaz de monitoreo a través de bull-board o bull-repl, lo que facilita la depuración en producción.
2. Agenda — una cola flexible con soporte de horarios
Agenda es una biblioteca que también utiliza MongoDB como almacenamiento. Su característica principal es el soporte integrado para tareas periódicas (horarios tipo cron) y una API conveniente para definir trabajos recurrentes. Agenda es ideal para tareas que deben ejecutarse según un horario: limpieza de bases de datos, generación de informes, envío de resúmenes.
Instalación:
npm install agendanpm install @types/agendaEjemplo de uso con horario:
import Agenda from 'agenda';
const agenda = new Agenda({ db: { address: 'mongodb://localhost:27017/agenda-example' }});
// Definimos una tareaagenda.define('send weekly report', async (job) => { const { department } = job.attrs.data; console.log(`Generando informe semanal para el departamento ${department}`);});
// Iniciamos el agente y programamos la tarea(async () => { await agenda.start(); // Ejecutar cada viernes a las 18:00 await agenda.every('0 18 * * 5', 'send weekly report', { department: 'IT' });})();Agenda admite prioridades, reintentos y apagado graceful. Sin embargo, es menos eficiente que Bull debido al uso de MongoDB en lugar de Redis.
3. Bee-Queue — una cola ligera y rápida
Bee-Queue es una cola minimalista basada en Redis, orientada a la máxima eficiencia y un tamaño de código reducido. No admite funciones complejas como prioridades u horarios, pero es ideal para escenarios simples donde la velocidad y el bajo consumo de memoria son importantes.
Instalación:
npm install bee-queuenpm install @types/bee-queueEjemplo de funcionamiento:
import Bee from 'bee-queue';
const imageQueue = new Bee('image-processing', { redis: { host: 'localhost', port: 6379 }});
// ProductorimageQueue.createJob({ También en la biblioteca
Envío de Email en Swift: Guía Completa sobre SMTP y MailKit
Cliente Elasticsearch para Node.js: @elastic/elasticsearch
Procesamiento de Markdown en C# (.NET): bibliotecas y herramientas
Generación de PDF en Swift (iOS/macOS): UIGraphicsPDFRenderer, PDFKit y Core Graphics