Colas de tareas en JavaScript (Node.js): guía completa

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

Trabajo con colas de tareas en JavaScript (Node.js)



En las aplicaciones web modernas y arquitecturas de microservicios, a menudo surge la necesidad de ejecutar tareas en segundo plano que no deben bloquear el hilo principal de ejecución. Las colas de tareas son una herramienta poderosa que ayuda a gestionar operaciones asíncronas, proporcionando confiabilidad, escalabilidad y tolerancia a fallos. En este artículo, analizaremos en detalle cómo trabajar con colas de tareas en el entorno Node.js, revisaremos las bibliotecas principales y escribiremos ejemplos prácticos de código.



¿Qué es una cola de tareas y para qué sirve?



Una cola de tareas (Task Queue) es una estructura de datos que funciona bajo el principio FIFO (First In, First Out — «primero en entrar, primero en salir»). Las tareas se colocan en la cola y son procesadas por los workers en el orden de llegada. Los principales casos de uso incluyen:



  • Envío de notificaciones por email — no es necesario obligar al usuario a esperar mientras se envía el correo.
  • Generación de informes o PDF — operaciones que consumen muchos recursos y es mejor ejecutarlas de forma asíncrona.
  • Procesamiento de imágenes cargadas — cambio de tamaño, compresión, adición de marcas de agua.
  • Integración con APIs externas — ejecución de solicitudes con limitación de frecuencia (rate limiting).
  • Tareas programadas (cron) — limpieza regular de la base de datos o actualización de caché.


El uso de colas permite descargar el servidor principal, aumentar la tolerancia a fallos (si un worker falla, la tarea se transfiere a otro) y garantizar la ejecución de la tarea incluso durante fallos temporales.



Cola simple en memoria en Node.js



Para empezar, implementaremos una cola muy simple sin dependencias externas. Este enfoque es adecuado para prototipado o proyectos muy pequeños, pero no se recomienda para producción debido a la falta de persistencia.



class SimpleQueue {    constructor() {        this.queue = [];        this.processing = false;    }

enqueue(task) { this.queue.push(task); this.processNext(); }

async processNext() { if (this.processing || this.queue.length === 0) return; this.processing = true; const task = this.queue.shift(); try { await task(); } catch (err) { console.error('Error al ejecutar la tarea:', err); } finally { this.processing = false; this.processNext(); } }}

// Ejemplo de usoconst queue = new SimpleQueue();

queue.enqueue(async () => { console.log('Tarea 1: Envío de email');});

queue.enqueue(async () => { console.log('Tarea 2: Generación de informe');});

console.log('Tareas añadidas a la cola');


Este código demuestra la mecánica básica: las tareas se ejecutan secuencialmente, una tras otra. Sin embargo, al reiniciar el servidor, todas las tareas no procesadas se perderán.



Bull — cola profesional sobre Redis



Para proyectos serios en Node.js, el estándar de facto es la biblioteca Bull. Utiliza Redis como backend, lo que proporciona persistencia, soporte para prioridades, reintentos y tareas retrasadas.



Instalación:

npm install bull


Ejemplo de un productor y consumidor simple:



const Queue = require('bull');

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

// Función worker: procesa las tareasemailQueue.process(async (job) => { const { to, subject, body } = job.data; console.log(`Enviando email a ${to}: ${subject}`); // Aquí iría el código real de envío de email await new Promise(resolve => setTimeout(resolve, 1000)); return { success: true };});

// Añadir tarea

Blogs

Book Recommendations