Colas de tareas en Node.js: Bull, Bee-Queue, Kue e implementación en Redis

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 JavaScript (Node.js): Bull, Bee-Queue y Kue



Al desarrollar aplicaciones web en Node.js, a menudo surge la necesidad de ejecutar operaciones que consumen muchos recursos o son de larga duración fuera del hilo principal de procesamiento de solicitudes HTTP. El envío de correos electrónicos masivos, la generación de informes PDF, el procesamiento de imágenes cargadas o la interacción con APIs externas: todas estas tareas pueden bloquear la respuesta al usuario si se ejecutan de forma síncrona. Para solucionar este problema se utilizan colas de tareas (job queues).



Una cola de tareas es un mecanismo que permite:

  • Diferir la ejecución del trabajo en segundo plano.
  • Gestionar prioridades y el orden de procesamiento.
  • Reintentar automáticamente las tareas en caso de errores.
  • Escalar el procesamiento horizontalmente (varios workers).


En el ecosistema de Node.js, las tres bibliotecas más populares son: Bull, Bee-Queue y Kue. Todas están construidas sobre Redis, lo que garantiza un alto rendimiento y resistencia a fallos. Analicemos cada una de ellas en detalle.






1. Bull — la cola más popular y funcional



Bull (npm: bull) es una biblioteca madura y bien documentada que admite prácticamente todos los escenarios necesarios: tareas diferidas, repetición programada, prioridades, límites de velocidad, pilas de errores e incluso una interfaz visual (Arete). Bull es mantenido activamente por la comunidad y se recomienda para proyectos en producción.



Instalación:

npm install bull


Un ejemplo simple: crear una cola y un procesador:



const Queue = require('bull');

// Creamos una cola con el nombre 'email'const emailQueue = new Queue('email', { redis: { host: 'localhost', port: 6379 }});

// Agregamos una tarea (job)emailQueue.add({ to: 'user@example.com', subject: '¡Bienvenido!', body: 'Gracias por registrarte.'}, { attempts: 3, // intentos en caso de error backoff: 5000, // retraso entre intentos (5 seg) delay: 10000 // diferir por 10 segundos});

// Procesador (worker)emailQueue.process(async (job) => { const { to, subject, body } = job.data; console.log(`Enviando correo a ${to}: ${subject}`); // Aquí se llama a su función de envío de correo await sendEmail(to, subject, body);});


Características clave de Bull:

  • Reintentos — configuración del número de reintentos y retardo exponencial.
  • Programación (cron) — ejecución de tareas según un horario (por ejemplo, cada noche).
  • Prioridades — las tareas con alta prioridad se procesan primero.
  • Eventos — suscripción a eventos (completed, failed, progress).
  • Graceful shutdown — finalización correcta del trabajo.





2. Bee-Queue — una cola ligera y rápida



Bee-Queue (npm: bee-queue) es una alternativa minimalista a Bull. Ofrece solo las funcionalidades básicas, pero lo hace con una sobrecarga mínima. Bee-Queue es ideal para escenarios simples donde no se necesitan configuraciones complejas, pero la velocidad es importante.



Instalación:

npm install bee-queue


Ejemplo de uso:



const Queue = require('bee-queue');

const imageQueue = new Queue('image-processing', { redis: { host: '127.0.0.1', port: 6379 }, isWorker: true});

// Agregamos una tareaimageQueue.createJob({ imageId: 123, size: 'thumbnail' }) .timeout(30000) // tiempo de espera 30 seg .retries(2) // 2 intentos .save() .then(job => console.log('Job created:', job.id));

// ProcesadorimageQueue.process((job, done) => { console.log(`Procesando imagen ${job.data.imageId}`); // Realizamos el trabajo proce

Recommendations