Colas de tareas para TypeScript: guía completa de Bull y Bee-Queue
Al desarrollar aplicaciones web modernas en TypeScript, a menudo surge la necesidad de ejecutar operaciones largas o que consumen muchos recursos de forma asíncrona, sin bloquear el hilo principal. Por ejemplo: enviar notificaciones por correo electrónico, generar informes PDF, procesar imágenes o sincronizar con APIs externas. Para resolver estas tareas se utilizan colas de tareas (job queues). En este artículo, analizaremos en detalle las dos bibliotecas más populares para TypeScript — Bull y Bee-Queue, y veremos cómo integrarlas en tu proyecto.
¿Para qué sirven las colas de tareas?
Una cola de tareas permite:
- Dividir la responsabilidad — el servicio principal solo se encarga de encolar la tarea, y el procesador de ejecutarla.
- Gestionar la carga — se puede limitar el número de tareas paralelas (concurrency).
- Garantizar la entrega — las tareas no se pierden incluso si el proceso falla (gracias a Redis).
- Programar la ejecución — retrasar una tarea para un momento específico o repetirla según un horario.
- Manejar errores — reintentos automáticos (retry) con retardo exponencial.
Bull — la cola más popular para Node.js y TypeScript
Bull es una potente biblioteca basada en Redis que admite un conjunto completo de funciones: prioridades, reintentos, retrasos, pausas, eventos y monitoreo. Bull tiene una excelente tipificación para TypeScript.
Instalación y configuración
npm install bull @types/bullEjemplo simple de una cola para enviar correos electrónicos:
import Queue from 'bull';
interface EmailJob { to: string; subject: string; body: string;}
// Creamos la cola con el nombre 'email'const emailQueue = new Queue<EmailJob>('email', { redis: { host: 'localhost', port: 6379 }, defaultJobOptions: { attempts: 3, // hasta 3 intentos backoff: { type: 'exponential', delay: 2000 }, removeOnComplete: true, }});
// Procesador — se ejecuta en segundo planoemailQueue.process(async (job) => { console.log(`Enviando correo a ${job.data.to}`); // Simulación de envío await new Promise(resolve => setTimeout(resolve, 1000)); console.log(`Correo enviado: ${job.data.subject}`);});
// Agregamos una tareaasync function addEmail() { await emailQueue.add({ to: 'user@example.com', subject: '¡Hola desde la cola!', body: 'Este es un correo de prueba.', });}
addEmail();Funciones avanzadas de Bull
- Tareas repetitivas (cron):
queue.add(data, { repeat: { cron: '0 8 * * *' } }) - Prioridades:
queue.add(data, { priority: 1 })— cuanto menor es el número, mayor es la prioridad. - Retraso en la ejecución:
queue.add(data, { delay: 60000 })— retrasar 1 minuto. - Eventos: se puede suscribir a
completed,failed,progressy otros. - Pausa/reanudación:
queue.pause()/queue.resume().
// Manejo de eventosemailQueue.on('completed', (job, result) => { console.log(`Tarea ${job.id} completada`);});
emailQueue.on('failed', (job, err) => { console.error(`Tarea ${job.id} falló: ${err.message}`);});Bee-Queue — una alternativa ligera
Bee-Queue es una cola minimalista basada en Redis, más simple y rápida que Bull en términos de consumo de memoria. Es adecuada para proyectos pequeños o casos donde no se necesitan configuraciones complejas.
Instalación y ejemplo
npm install bee-queueimport Bee from 'bee También en la biblioteca
Envío de correo electrónico en Swift (iOS/macOS): MFMailComposeViewController y SMTP
Procesamiento de imágenes en C# (.NET): bibliotecas y ejemplos de código
Trabajo con Markdown en Swift (iOS/macOS): bibliotecas Down, SwiftMarkdown