Files d'attente de tâches pour JavaScript (Node.js) : Bull, Bee-Queue et Kue
Lors du développement d'applications web en Node.js, il est souvent nécessaire d'exécuter des opérations gourmandes en ressources ou longues en dehors du flux principal de traitement des requêtes HTTP. L'envoi de campagnes d'emails, la génération de rapports PDF, le traitement d'images téléchargées ou l'interaction avec des API externes — toutes ces tâches peuvent bloquer la réponse à l'utilisateur si elles sont exécutées de manière synchrone. Pour résoudre ce problème, on utilise des files d'attente de tâches (job queues).
Une file d'attente de tâches est un mécanisme qui permet de :
- Reporter l'exécution du travail en arrière-plan.
- Gérer les priorités et l'ordre de traitement.
- Répéter automatiquement les tâches en cas d'erreur.
- Mettre à l'échelle le traitement horizontalement (plusieurs workers).
Dans l'écosystème Node.js, trois bibliothèques ont gagné la plus grande popularité : Bull, Bee-Queue et Kue. Elles sont toutes construites sur Redis, ce qui garantit des performances élevées et une résistance aux pannes. Examinons chacune d'elles en détail.
1. Bull — la file d'attente la plus populaire et la plus fonctionnelle
Bull (npm : bull) est une bibliothèque mature, bien documentée, qui prend en charge pratiquement tous les scénarios nécessaires : tâches différées, répétition planifiée, priorités, limites de vitesse, piles d'erreurs et même une interface visuelle (Arete). Bull est activement maintenue par la communauté et est recommandée pour les projets en production.
Installation :
npm install bullExemple simple — création d'une file d'attente et d'un gestionnaire :
const Queue = require('bull');
// Création d'une file d'attente nommée 'email'const emailQueue = new Queue('email', { redis: { host: 'localhost', port: 6379 }});
// Ajout d'une tâche (job)emailQueue.add({ to: 'user@example.com', subject: 'Bienvenue !', body: 'Merci pour votre inscription.'}, { attempts: 3, // tentatives en cas d'erreur backoff: 5000, // délai entre les tentatives (5 sec) delay: 10000 // différer de 10 secondes});
// Gestionnaire (worker)emailQueue.process(async (job) => { const { to, subject, body } = job.data; console.log(`Envoi d'un email à ${to} : ${subject}`); // Ici, appel de votre fonction d'envoi d'email await sendEmail(to, subject, body);});Fonctionnalités clés de Bull :
- Tentatives répétées — configuration du nombre de tentatives et délai exponentiel.
- Planification (cron) — exécution de tâches selon un calendrier (par exemple, chaque nuit).
- Priorités — les tâches à haute priorité sont traitées en premier.
- Événements — abonnement aux événements (completed, failed, progress).
- Arrêt progressif (Graceful shutdown) — arrêt correct du travail.
2. Bee-Queue — une file d'attente légère et rapide
Bee-Queue (npm : bee-queue) est une alternative minimaliste à Bull. Elle n'offre que des fonctionnalités de base, mais le fait avec une surcharge minimale. Bee-Queue est idéale pour les scénarios simples où des configurations complexes ne sont pas nécessaires, mais où la vitesse est importante.
Installation :
npm install bee-queueExemple d'utilisation :
const Queue = require('bee-queue');
const imageQueue = new Queue('image-processing', { redis: { host: '127.0.0.1', port: 6379 }, isWorker: true});
// Ajout d'une tâcheimageQueue.createJob({ imageId: 123, size: 'thumbnail' }) .timeout(30000) // timeout 30 sec .retries(2) // 2 tentatives .save() .then(job => console.log('Job created:', job.id));
// GestionnaireimageQueue.process((job, done) => { console.log(`Traitement de l'image ${job.data.imageId}`); // Exécution du travail proce