Files d'attente de tâches dans Node.js : Bull, Bee-Queue et Kue

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

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 longues ou gourmandes en ressources de manière asynchrone, sans bloquer le thread principal de traitement des requêtes. Les exemples typiques incluent : l'envoi de notifications par email, le traitement d'images téléchargées, la génération de rapports PDF ou la synchronisation avec des API externes. Pour résoudre ces problèmes, on utilise les files d'attente de tâches (job queues) — un mécanisme qui permet de différer l'exécution du travail, de répartir la charge et d'assurer la tolérance aux pannes.



Dans cet article, nous examinerons trois bibliothèques populaires pour la gestion des files d'attente dans l'écosystème Node.js : Bull, Bee-Queue et Kue. Chacune d'elles a ses propres caractéristiques, avantages et scénarios d'utilisation.



Pourquoi des files d'attente de tâches ?



Les principales raisons d'introduire des files d'attente dans un backend Node.js :

  • Déchargement du thread principal. Les opérations longues (par exemple, l'envoi de 1000 emails) ne bloquent pas la réponse à l'utilisateur.
  • Nouvelles tentatives. Si une tâche échoue, la file d'attente la relance automatiquement après un intervalle défini.
  • Planification. Il est possible de différer l'exécution d'une tâche à un moment précis (par exemple, dans 1 heure).
  • Passage à l'échelle. Plusieurs workers peuvent traiter des tâches d'une même file d'attente en parallèle.


1. Bull — une file d'attente moderne et performante



Bull est l'une des bibliothèques les plus populaires pour travailler avec des files d'attente dans Node.js. Elle est construite sur Redis et fournit une API riche pour la gestion des tâches.



Principales fonctionnalités de Bull :

  • Prise en charge des priorités de tâches.
  • Nouvelles tentatives configurables (retries).
  • Exécution différée (delay).
  • Événements (tâche terminée, erreur, progression).
  • Interface utilisateur intégrée pour la surveillance via bull-board.


Installation :

npm install bull


Exemple de création d'une file d'attente et d'un gestionnaire :

const Queue = require('bull');

// Création d'une file d'attente pour l'envoi d'emailsconst emailQueue = new Queue('email', { redis: { host: '127.0.0.1', port: 6379 }});

// Ajout d'une tâche à la file d'attenteemailQueue.add({ to: 'user@example.com', subject: 'Bonjour !', body: 'Ceci est un email de test'}, { attempts: 3, // répéter jusqu'à 3 fois en cas d'erreur delay: 5000 // différer de 5 secondes});

// Gestionnaire de tâchesemailQueue.process(async (job) => { const { to, subject, body } = job.data; // Simulation d'envoi d'email await sendEmail(to, subject, body); console.log(`Email envoyé à : ${to}`);});


Quand choisir Bull : si vous avez besoin d'une file d'attente fiable avec des fonctionnalités avancées (priorités, nouvelles tentatives, surveillance) et que vous êtes prêt à utiliser Redis.



2. Bee-Queue — légère et rapide



Bee-Queue est une file d'attente minimaliste, également basée sur Redis. Elle est conçue pour la simplicité et la performance. Le code de la bibliothèque est compact, l'API est intuitive.



Caractéristiques de Bee-Queue :

  • Aucune dépendance autre que Redis.
  • Prise en charge des événements (ready, job succeeded, job failed).
  • Possibilité de configurer un délai d'attente de traitement.
  • Système simple de nouvelles tentatives.


Installation :

npm install bee-queue


Exemple d'utilisation :

const Queue = require('bee-queue');

const imageQueue = new Queue('image-processing', { redis: { host: '127.0.0.1', port: 6379 }});

// Ajout d'une tâcheimageQueue.createJob({ imagePath: '/uploads/photo.jpg' }) .retries(2) .save();

// GestionnaireimageQueue.process(async (job) => { const {

Recommendations