¿Qué es Bull y para qué sirve?
\n\nBull es una potente y popular biblioteca para gestionar colas de tareas (job queues) en el entorno Node.js. Está construida sobre Redis y proporciona una forma confiable, escalable y flexible de procesar tareas en segundo plano. Si tu aplicación necesita ejecutar operaciones que no deben bloquear el hilo principal (por ejemplo, envío de correos electrónicos, procesamiento de imágenes, generación de PDF, sincronización con APIs externas, análisis de datos), Bull es la solución ideal.
\n\n¿Por qué usar Bull?
\n- \n
- Procesamiento asíncrono: Descarga el servidor principal moviendo tareas pesadas a un proceso en segundo plano. \n
- Confiabilidad: Las tareas se almacenan en Redis, por lo que no se pierden al reiniciar la aplicación o ante una falla del worker. \n
- Reintentos: Soporte integrado para reintentos automáticos en caso de errores. \n
- Programación: Posibilidad de retrasar tareas o ejecutarlas según un horario (cron). \n
- Prioridades: Gestión del orden de ejecución de las tareas. \n
- Monitoreo: Fácil seguimiento del estado de las colas mediante una interfaz de usuario integrada (Bull Board). \n
Instalación de Bull
\n\nPara empezar, asegúrate de tener Redis instalado y en ejecución. Bull no funciona sin él.
\n\n- \n
- Instalación de Redis (ejemplo para Ubuntu/Debian):\n
\nsudo apt update\nsudo apt install redis-server\nsudo systemctl start redis\n - Instalación de Bull mediante npm:\n
\nnpm install bull\n - Instalación de Bull Board (opcional, para interfaz web):\n
\nnpm install @bull-board/express @bull-board/api\n
Inicio rápido: primer ejemplo
\n\nCreemos una cola simple para enviar correos electrónicos de bienvenida.
\n\nPaso 1: Crear el productor (producer.js)
\nconst Queue = require('bull');\n\n// Creamos una cola con el nombre 'emailQueue'\nconst emailQueue = new Queue('emailQueue', {\n redis: { host: 'localhost', port: 6379 }\n});\n\n// Función para agregar una tarea a la cola\nasync function addEmailJob(to, subject, body) {\n const job = await emailQueue.add(\n { to, subject, body }, // Datos de la tarea\n {\n attempts: 3, // Número de intentos en caso de error\n backoff: { type: 'fixed', delay: 5000 } // Retardo entre intentos (5 seg)\n }\n );\n console.log(`Tarea agregada con ID: ${job.id}`);\n return job;\n}\n\n// Ejemplo de uso\naddEmailJob('user@example.com', '¡Bienvenido!', 'Gracias por registrarte.')\n .then(() => process.exit(0))\n .catch(err => console.error(err));\n\n\nPaso 2: Crear el worker (worker.js)
\nconst Queue = require('bull');\n\n// Nos conectamos a la misma cola\nconst emailQueue = new Queue('emailQueue', {\n redis: { host: 'localhost', port: 6379 }\n});\n\n// Manejador de tareas\nemailQueue.process(async (job) => {\n console.log(`Procesando tarea ${job.id}...`);\n const { to, subject, body } = job.data;\n\n // Simulación de envío de correo (en la realidad usa nodemailer)\n await new Promise(resolve => setTimeout(resolve, 2000));\n console.log(`Correo enviado a ${to}: ${subject}`);\n\n // Si algo sale mal, lanza un error\n // throw new Error('Error de envío');\n});\n\nconsole.log('Worker iniciado y esperando tareas...');\n\n\nPaso 3: Ejecutar
\nPrimero inicia el worker: node worker.js. Luego, en otra terminal, inicia el productor: node producer.js. Verás cómo la tarea entra en la cola y se procesa.
Métodos y funciones principales de Bull
\n\n1. new Queue(name, [options]) — Creación de cola
\nQué hace: Crea
También en la biblioteca
Playwright para JavaScript (Node.js): guía completa con ejemplos
Trabajo con archivos ZIP en Rust: biblioteca zip y guía completa
Envío de correo electrónico en Rust: bibliotecas lettre y mailparse para trabajar con correo