Introduction : Pourquoi les files d'attente de tâches ?
Imaginez que vous lancez un serveur web sur Node.js. Un utilisateur envoie une demande d'envoi de 1000 e-mails. Si vous traitez cette demande de manière synchrone, le serveur "se bloquera" pendant plusieurs minutes — tous les autres utilisateurs ne pourront pas obtenir de réponse.
Comment résoudre ce problème ? La réponse — les files d'attente de tâches (task queues). Elles permettent de différer l'exécution d'opérations gourmandes en ressources (envoi d'e-mails, génération de PDF, traitement d'images) et de les exécuter en arrière-plan, sans bloquer le flux principal de l'application.
Dans cet article, nous aborderons :
- Ce qu'est une file d'attente de tâches et comment elle fonctionne
- Les bibliothèques populaires pour Node.js (Bull, Kue)
- Des exemples de code : création, ajout et traitement de tâches
- Les bonnes pratiques pour les débutants
1. Bases des files d'attente de tâches dans Node.js
Qu'est-ce qu'une file d'attente de tâches ?
Une file d'attente de tâches est une structure de données fonctionnant sur le principe du FIFO (First In, First Out — premier entré, premier sorti). Les tâches sont ajoutées à la fin de la file et traitées depuis le début. Généralement, les files d'attente sont construites sur la base de Redis — un stockage clé-valeur rapide en mémoire.
Les composants principaux d'une file d'attente :
- Producteur (Producer) — le code qui ajoute les tâches à la file
- Consommateur (Worker) — le code qui récupère les tâches et les exécute
- Gestionnaire de file d'attente (Queue Manager) — le mécanisme qui gère la file (généralement Redis)
Bibliothèques populaires
Pour Node.js, il existe deux bibliothèques principales :
- Bull — moderne, rapide, avec prise en charge des priorités, des tentatives et des délais
- Kue — ancienne mais simple (actuellement moins populaire)
Dans cet article, nous nous concentrerons sur Bull, car elle est activement maintenue et offre plus de fonctionnalités.
2. Installation et configuration de Bull
Étape 1 : Installation de Redis
Bull utilise Redis. Si vous n'avez pas Redis, installez-le :
# macOSbrew install redis
# Ubuntusudo apt-get install redis-server
# Démarrage de Redisredis-serverÉtape 2 : Installation de Bull
Créez un nouveau projet et installez le paquet :
mkdir queue-democd queue-demonpm init -ynpm install bullÉtape 3 : Configuration de base
Créez le fichier queue.js :
const Queue = require('bull');
// Création d'une file nommée 'emailQueue'const emailQueue = new Queue('emailQueue', { redis: { host: '127.0.0.1', port: 6379 }});
module.exports = emailQueue;3. Exemple : file d'attente pour l'envoi d'e-mails
Étape 1 : Création du Producteur (ajout de tâches)
Créez le fichier producer.js :
const emailQueue = require('./queue');
async function addEmailTask(to, subject, body) { // Ajout d'une tâche à la file const job = await emailQueue.add({ to: to, subject: subject, body: body }, { // Options de la tâche attempts: 3, // Nombre de tentatives en cas d'erreur backoff: 5000, // Délai entre les tentatives (5 sec) delay: 1000 // Délai avant exécution (1 sec) });
console.log(`Tâche ajoutée avec l'ID : ${job.id}`); return job;}
// Exemple d'utilisationaddEmailTask('user@example.com', 'Bonjour !', 'Message de test');Étape 2 : Création du Worker (traitement des tâches)
Créez le fichier worker.js :
const emailQueue = require('./queue');
// Fonction simulant l'envoi d'un e-mailasync function sendEmail(to, subject, body) { console.log(`Envoi de l'e-mail à ${to}...`); // Simulation d'un délai await new Promise(resolve => setTimeout(resolve, 2000)); console.log(`E-mail envoyé : ${subject}`);}
// Gestionnaire de la file d'attente