Bull pour JavaScript (Node.js) : guide complet avec exemples

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

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.

  1. Installation de Redis (exemple pour Ubuntu/Debian) :
    sudo apt update
    sudo apt install redis-server
    sudo systemctl start redis
  2. Installation de Bull via npm :
    npm install bull
  3. 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.

Recommendations