Colas de tareas para TypeScript: Bull, Bee-Queue y procesamiento asíncrono

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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/bull


Ejemplo 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, progress y 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-queue


import Bee from 'bee                    

Recommendations