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 largas o que consumen muchos recursos de forma asíncrona, sin bloquear el hilo principal de procesamiento de solicitudes. Ejemplos típicos: enviar notificaciones por correo electrónico, procesar imágenes cargadas, generar informes en PDF o sincronizar con APIs externas. Para resolver estas tareas se utilizan colas de tareas (job queues), un mecanismo que permite aplazar la ejecución del trabajo, distribuir la carga y garantizar la tolerancia a fallos.
En este artículo, revisaremos tres bibliotecas populares para la gestión de colas en el ecosistema Node.js: Bull, Bee-Queue y Kue. Cada una tiene sus propias características, ventajas y casos de uso.
¿Por qué son necesarias las colas de tareas?
Las principales razones para implementar colas en un backend de Node.js:
- Descargar el hilo principal. Las operaciones largas (por ejemplo, enviar 1000 correos) no bloquean la respuesta al usuario.
- Reintentos. Si una tarea falla, la cola la reintenta automáticamente después de un intervalo definido.
- Programación. Se puede aplazar la ejecución de una tarea para un momento específico (por ejemplo, dentro de 1 hora).
- Escalabilidad. Varios workers pueden procesar tareas de una misma cola en paralelo.
1. Bull — cola moderna y de alto rendimiento
Bull es una de las bibliotecas más populares para trabajar con colas en Node.js. Está construida sobre Redis y proporciona una API rica para la gestión de tareas.
Características principales de Bull:
- Soporte para prioridades de tareas.
- Reintentos configurables (retries).
- Ejecución retrasada (delay).
- Eventos (tarea completada, error, progreso).
- Interfaz de usuario integrada para monitoreo a través de
bull-board.
Instalación:
npm install bullEjemplo de creación de cola y manejador:
const Queue = require('bull');
// Creamos una cola para enviar correos electrónicosconst emailQueue = new Queue('email', { redis: { host: '127.0.0.1', port: 6379 }});
// Añadimos una tarea a la colaemailQueue.add({ to: 'user@example.com', subject: '¡Hola!', body: 'Este es un correo de prueba'}, { attempts: 3, // reintentar hasta 3 veces en caso de error delay: 5000 // retrasar 5 segundos});
// Manejador de tareasemailQueue.process(async (job) => { const { to, subject, body } = job.data; // Simulación de envío de correo await sendEmail(to, subject, body); console.log(`Correo enviado a: ${to}`);});Cuándo elegir Bull: si necesitas una cola confiable con funciones avanzadas (prioridades, reintentos, monitoreo) y estás dispuesto a usar Redis.
2. Bee-Queue — ligera y rápida
Bee-Queue es una cola minimalista, también basada en Redis. Está orientada a la simplicidad y el rendimiento. El código de la biblioteca es compacto y la API es intuitiva.
Características de Bee-Queue:
- Sin dependencias, excepto Redis.
- Soporte para eventos (ready, job succeeded, job failed).
- Posibilidad de configurar un tiempo de espera de procesamiento.
- Sistema simple de reintentos.
Instalación:
npm install bee-queueEjemplo de uso:
const Queue = require('bee-queue');
const imageQueue = new Queue('image-processing', { redis: { host: '127.0.0.1', port: 6379 }});
// Añadimos una tareaimageQueue.createJob({ imagePath: '/uploads/photo.jpg' }) .retries(2) .save();
// ManejadorimageQueue.process(async (job) => { const { También en la biblioteca
Trabajo con fechas en PHP: revisión de bibliotecas y herramientas
Rate Limiting en Go: guía para limitar la velocidad de las solicitudes
Caché en Swift (iOS/macOS): Redis, NSCache y otras soluciones
Internacionalización (i18n) en C++: guía completa con gettext e ICU