Qu'est-ce que Bull et pourquoi l'utiliser ?
Bull est une bibliothèque puissante et populaire pour gérer les files d'attente de tâches (job queues) dans l'environnement Node.js. Construite sur Redis, elle offre un moyen fiable, scalable et flexible de traiter des tâches en arrière-plan. Si votre application doit effectuer des opérations qui ne doivent pas bloquer le thread principal (par exemple, envoi d'e-mails, traitement d'images, génération de PDF, synchronisation avec des API externes, analyse de données), Bull est la solution idéale.
Pourquoi utiliser Bull ?
- Traitement asynchrone : Décharge le serveur principal en déplaçant les tâches lourdes vers un processus en arrière-plan.
- Fiabilité : Les tâches sont stockées dans Redis, elles ne sont donc pas perdues en cas de redémarrage de l'application ou de panne d'un worker.
- Nouvelles tentatives : Prise en charge intégrée des tentatives automatiques en cas d'erreur.
- Planification : Possibilité de différer des tâches ou de les exécuter selon un calendrier (cron).
- Priorités : Gestion de l'ordre d'exécution des tâches.
- Surveillance : Suivez facilement l'état des files d'attente grâce à l'interface utilisateur intégrée (Bull Board).
Installation de Bull
Pour commencer, assurez-vous que Redis est installé et en cours d'exécution. Bull ne fonctionne pas sans lui.
- Installation de Redis (exemple pour Ubuntu/Debian) :
sudo apt update sudo apt install redis-server sudo systemctl start redis - Installation de Bull via npm :
npm install bull - Installation de Bull Board (optionnel, pour l'interface web) :
npm install @bull-board/express @bull-board/api
Démarrage rapide : premier exemple
Créons une file d'attente simple pour envoyer des e-mails de bienvenue.
Étape 1 : Créer le producteur (producer.js)
const Queue = require('bull');
// Crée une file d'attente nommée 'emailQueue'
const emailQueue = new Queue('emailQueue', {
redis: { host: 'localhost', port: 6379 }
});
// Fonction pour ajouter une tâche à la file d'attente
async function addEmailJob(to, subject, body) {
const job = await emailQueue.add(
{ to, subject, body }, // Données de la tâche
{
attempts: 3, // Nombre de tentatives en cas d'erreur
backoff: { type: 'fixed', delay: 5000 } // Délai entre les tentatives (5 sec)
}
);
console.log(`Tâche ajoutée avec l'ID : ${job.id}`);
return job;
}
// Exemple d'utilisation
addEmailJob('user@example.com', 'Bienvenue !', 'Merci de vous être inscrit.')
.then(() => process.exit(0))
.catch(err => console.error(err));
Étape 2 : Créer le worker (worker.js)
const Queue = require('bull');
// Se connecte à la même file d'attente
const emailQueue = new Queue('emailQueue', {
redis: { host: 'localhost', port: 6379 }
});
// Gestionnaire de tâches
emailQueue.process(async (job) => {
console.log(`Traitement de la tâche ${job.id}...`);
const { to, subject, body } = job.data;
// Simulation d'envoi d'e-mail (en réalité, utilisez nodemailer)
await new Promise(resolve => setTimeout(resolve, 2000));
console.log(`E-mail envoyé à ${to} : ${subject}`);
// Si quelque chose ne va pas, levez une erreur
// throw new Error('Erreur d\'envoi');
});
console.log('Worker démarré et en attente de tâches...');
Étape 3 : Lancer l'exécution
Lancez d'abord le worker : node worker.js. Ensuite, dans un autre terminal, lancez le producteur : node producer.js. Vous verrez la tâche entrer dans la file d'attente et être traitée.
Méthodes et fonctions principales de Bull
1. new Queue(name, [options]) — Création d'une file d'attente
Ce qu'elle fait : Crée une nouvelle instance de file d'attente. Si une file d'attente portant ce nom existe déjà dans Redis, elle s'y connecte.
Aussi dans la bibliothèque
Juniper : Une bibliothèque GraphQL élégante en Rust pour les applications web modernes
Nodemailer JavaScript (Node.js) : guide complet avec exemples
Travail avec les dates en C++ : aperçu des bibliothèques de manipulation du temps