Lectores como tú ayudan a apoyar a MUO. Cuando realiza una compra utilizando enlaces en nuestro sitio, podemos ganar una comisión de afiliado. Leer más.

Como desarrollador web, es crucial que sus aplicaciones funcionen lo más rápido posible. Debe crear aplicaciones web que respondan a las solicitudes en el menor tiempo posible.

Una de las muchas tecnologías que pueden ayudarte es la cola de tareas.

Entonces, ¿qué es la cola de tareas y cómo puede usarla para optimizar una aplicación Node.js?

¿Qué es la cola de tareas?

La cola de mensajes es un medio de comunicación asincrónica entre dos aplicaciones o servicios, generalmente denominado productor y consumidor. Es un concepto bien conocido empleado en arquitecturas sin servidor y de microservicio.

El concepto de tarea o trabajohaciendo cola aprovecha la cola de mensajes para mejorar el rendimiento de la aplicación. Abstrae las complejidades de la gestión de mensajes y le permite definir funciones para gestionar trabajos o tareas de forma asincrónica mediante una cola, lo que reduce la tasa de

instagram viewer
uso de memoria en algunas partes de una aplicación.

El ejemplo más común de software de cola de mensajes es RabbitMQ. Las herramientas de cola de tareas incluyen Celery y Bull. También puede configurar RabbitMQ para que funcione como una cola de tareas. Siga leyendo para obtener información sobre la cola de tareas en Node.js con Bull.

¿Qué es BullMQ?

BullMQ (Bull.js) es una biblioteca de Node.js que se utiliza para implementar colas en las aplicaciones de Node. Bull es un sistema basado en Redis (es posible que esté más familiarizado con Redis como una herramienta para almacenamiento rápido de datos) y es una opción rápida y confiable a considerar para la cola de tareas en Node.js.

Puede usar Bull para muchas tareas, como implementar trabajos retrasados, trabajos programados, trabajos repetibles, colas prioritarias y muchas más.

Entonces, ¿cómo puede usar Bull y Redis para ejecutar tareas de Node.js de forma asíncrona?

Cómo configurar Bull y Redis para la cola de tareas en Node.js

Para comenzar con la cola de tareas en Node.js con Bull, necesita Node.js y Redis instalados en su máquina. Puedes seguir el Guía de laboratorios de Redis para instalar Redis si no lo tienes instalado.

El primer paso para implementar Bull es agregarlo a las dependencias de su proyecto ejecutando npm instalar toro o hilo añadir toro en la terminal dentro de la carpeta de su proyecto. Hay varias formas de inicializar una cola en Bull, como se muestra a continuación:

constante Cola = requerir('toro');

// diferentes formas de inicializar una cola
// - usando la cadena de URL redis
constante Cola de correo electrónico = nuevo Cola('Cola de correo electrónico', 'redis://127.0.0.1:6379');

// - con una conexión redis y un objeto de opciones de cola
constante cola de video = nuevo Cola('Cola de vídeo', 'redis://127.0.0.1:6379', opciones de cola);

// - sin una conexión redis pero con queueOption
constante ColaDocumentos = nuevo Cola('Cola de documentos', opciones de cola);

// - sin conexión redis ni opciones de cola
constante ClienteCola = nuevo Cola('Mi cola');

Todos estos usan una configuración mínima para Bull en Node.js. El objeto de opciones admite muchas propiedades y puede aprender sobre ellas en el sección de opciones de cola de la documentación de Bull.

Implementación de una cola de tareas de correo electrónico con BullMQ

Para implementar una cola para enviar correos electrónicos, puede definir su función de productor que agrega correos electrónicos a la cola de correos electrónicos y una función de consumidor para manejar el envío de correos electrónicos.

En primer lugar, puede inicializar su cola en una clase usando una URL de Redis y algunas opciones de cola como se ve a continuación.

// controlador de cola.js
constante Cola = requerir('toro');

// use un módulo de manejo de correo electrónico real aquí; esto es solo un ejemplo
constante controlador de correo electrónico = requerir('./manejador de correo electrónico.js');

// definir constantes, URL de Redis y opciones de cola
constante REDIS_URL = 'redis://127.0.0.1:6379';

constante colaOpts = {
// opciones de limitador de velocidad para evitar sobrecargar la cola
limitador: {
// número máximo de tareas que puede tomar la cola
máximo: 100,

// tiempo de espera en milisegundos antes de aceptar nuevos trabajos después
// llegando al limite
duración: 10000
},
prefijo: 'EMAIL-TAREA', // un prefijo para agregar a todas las claves de la cola
opciones de trabajo predeterminadas: { // opciones predeterminadas para tareas en la cola
intentos: 3, // número predeterminado de veces para reintentar una tarea

// para eliminar una tarea de la cola después de completarla
removeOnComplete: verdadero
}
};

claseCola de correo electrónico{
constructor() {
este.cola = nuevo Cola('Cola de correo electrónico', REDIS_URL, colaOpts);
}
};

exportarpor defecto Cola de correo electrónico; // exportamos la clase

Ahora que ha inicializado una cola, puede definir su función de productor (usando Bull's agregar() función) como método de Cola de correo electrónico class para agregar correos electrónicos a la cola de tareas. El siguiente bloque de código demuestra esto:

// controlador de cola.js

claseCola de correo electrónico{
constructor () {
// ...
}

// función de productor para agregar correos electrónicos a la cola
asíncrono agregar correo electrónico a la cola (datos de correo electrónico) {
// agregue la tarea con el nombre 'email_notification' a la cola
esperareste.cola.añadir('Notificación de correo electrónico', datos de correo electrónico);
consola.registro('el correo electrónico se ha agregado a la cola...');
}
};

exportarpor defecto Cola de correo electrónico; // exportamos la clase

La función de productor está lista y ahora puede definir una función de consumidor (utilizando la función de Bull). proceso() función) para procesar todas las tareas de correo electrónico en la cola, es decir. llame a la función para enviar un correo electrónico. Debe definir esta función de consumidor en el constructor de la clase.

// controlador de cola.js
claseCola de correo electrónico{
constructor () {
// ...

// función de consumidor que toma el nombre asignado de la tarea y
// una función de devolución de llamada
este.cola.proceso('Notificación de correo electrónico', asíncrono (emailJob, hecho) => {
consola.registro('procesando tarea de notificación por correo electrónico');
esperar controlador de correo electrónico. enviar correo electrónico (trabajo de correo electrónico); // enviar el correo electrónico
hecho(); // completa la tarea
})
}
// ...
};

exportarpor defecto Cola de correo electrónico; // exportamos la clase

Un trabajo también puede tener opciones para definir su comportamiento en la cola o cómo lo maneja la función del consumidor. Puede obtener más información sobre esto en el sección de opciones de trabajo de la documentación de Bull.

El emailTrabajo argumento es un objeto que contiene las propiedades de la tarea para que la cola las procese. También incluye los principales datos necesarios para construir el correo electrónico.. Para facilitar la comprensión, el enviar correo electrónico() La función sería similar a este ejemplo:

// manejador de correo electrónico.js
constante enviargridMail = requerir('@sendgrid/correo');

constante apiKey = proceso.env. ENVIARGRID_API_KEY

enviargridMail.setApiKey (apiKey); // establece las credenciales de seguridad del transportador de correo electrónico

constante enviarCorreo = asíncrono (trabajo de correo electrónico) => {
intentar {
// extrae los datos de correo electrónico del trabajo
constante { nombre, email } = emailJob.data;

constante mensaje = {
de: '[email protected]',
a: '[email protected]',
sujeto: '¡Hola! Bienvenido',
texto: `Hola ${nombre}, bienvenido a MUO`
};

esperar sendgridMail.sendMail (mensaje); // enviar correo electrónico

// marca la tarea como completada en la cola
esperar emailJob.moveToCompleted('hecho', verdadero);
consola.registro('Correo electrónico enviado con éxito...');
} atrapar (error) {
// mover la tarea a trabajos fallidos
esperar emailJob.moveToFailed({ mensaje: 'proceso de tarea fallido..' });
consola.error (error); // registrar el error
}
}

exportarpor defecto enviar correo electrónico;

Ahora que tiene las funciones de productor y consumidor definidas y listas para usar, ahora puede llamar a su función de productor en cualquier lugar de su aplicación para agregar un correo electrónico a la cola para su procesamiento.

Un controlador de ejemplo se vería así:

// controlador de usuario.js
constante Cola de correo electrónico = requerir('../handlers/queueHandler.js')

constante registrarse = asíncrono (requerido, res) => {
constante { nombre, correo electrónico, contraseña } = req.body;

// --
// una consulta para agregar el nuevo usuario a la base de datos...
// --

// agregar a la cola de correo electrónico
constante emailData = { nombre, correo electrónico };
esperar Cola de correo electrónico.addEmailToQueue (datos de correo electrónico);

res.status(200).json({
mensaje: "Regístrese con éxito, por favor revise su correo electrónico"
})
}

Su queueHandler.js El archivo ahora debería ser el siguiente:

// controlador de cola.js
constante Cola = requerir('toro');
constante controlador de correo electrónico = requerir('../handlers/emailHandler.js');

constante REDIS_URL = 'redis://127.0.0.1:6379';

constante colaOpts = {
limitador: {
máximo: 100,
duración: 10000
},

prefijo: 'EMAIL-TAREA',

opciones de trabajo predeterminadas: {
intentos: 3,
removeOnComplete: verdadero
}
};

claseCola de correo electrónico{
constructor() {
este.cola = nuevo Cola('Cola de correo electrónico', REDIS_URL, colaOpts);

// consumidor
este.cola.proceso('Notificación de correo electrónico', asíncrono (emailJob, hecho) => {
consola.registro('procesando tarea de notificación por correo electrónico');
esperar controlador de correo electrónico. enviar correo electrónico (trabajo de correo electrónico);
hecho();
})
}

// productor
asíncrono agregar correo electrónico a la cola (datos de correo electrónico) {
// agregue la tarea con el nombre 'email_notification' a la cola
esperareste.cola.añadir('Notificación de correo electrónico', datos de correo electrónico);
consola.registro('el correo electrónico se ha agregado a la cola...');
}
};

exportarpor defecto Cola de correo electrónico;

Cuando implemente esto en una API REST de Node.js, notará una disminución en el tiempo de respuesta del punto final de registro y tiempos de entrega de correo electrónico más rápidos, en comparación con la alternativa.

Las colas de tareas también le permitieron manejar los errores de registro y correo electrónico de forma independiente.

Optimización de aplicaciones mediante colas de tareas

Las colas de mensajes y tareas son una excelente manera de mejorar el rendimiento general de las aplicaciones. También son muy baratos y puede usarlos en tantas partes de una aplicación como necesite.

Aunque este tutorial usó correos electrónicos como un escenario de ejemplo para manejar tareas que consumen memoria con colas, hay muchos otros casos en los que puede aplicar los mismos conceptos. Estos incluyen operaciones pesadas de lectura/escritura, representación de imágenes o documentos de alta calidad y envío de notificaciones masivas.