Introduction : pourquoi les files d'attente de tâches en JavaScript sont-elles nécessaires ?
\nDans le développement web moderne, les applications sont souvent confrontées à des tâches qui ne peuvent pas être exécutées instantanément dans le cadre d'une seule requête HTTP. L'envoi d'e-mails, le traitement d'images, la génération de rapports PDF ou la synchronisation avec des API externes — tout cela prend du temps et peut "figer" le serveur s'il est exécuté de manière synchrone.
\nLes files d'attente de tâches (Task Queues) résolvent ce problème. Elles permettent de différer l'exécution d'opérations gourmandes en ressources et de les traiter de manière asynchrone en arrière-plan. Dans cet article, nous allons voir comment créer et gérer des files d'attente de tâches dans l'environnement Node.js, en utilisant des bibliothèques populaires.
\n\n1. Principes de base du travail avec les files d'attente dans Node.js
\nUne file d'attente de tâches est une structure de données fonctionnant selon le principe FIFO (First In, First Out). Les tâches sont ajoutées à la fin de la file d'attente et traitées depuis le début. Dans le contexte de Node.js, cela signifie que votre serveur peut répondre rapidement à l'utilisateur ("Tâche prise en charge"), tandis que la tâche elle-même sera exécutée plus tard.
\nPour travailler avec les files d'attente dans Node.js, on utilise des bibliothèques spécialisées qui s'appuient sur des stockages externes (le plus souvent Redis). Examinons les deux plus populaires :
\n- \n
- Bull — une bibliothèque moderne, rapide et stable basée sur Redis. \n
- Kue — une bibliothèque plus ancienne mais toujours populaire avec une interface web intégrée. \n
Nous nous concentrerons sur Bull, car elle est devenue le standard de facto pour les nouveaux projets.
\n\n1.1 Installation et connexion de Bull
\nPour commencer, installez les dépendances nécessaires :
\nnpm install bull ioredis\nCréons maintenant une file d'attente simple :
\nconst Queue = require('bull');\nconst myQueue = new Queue('emailQueue', {\n redis: {\n host: '127.0.0.1',\n port: 6379\n }\n});\n\n// Ajouter une tâche à la file d'attente\nmyQueue.add({\n to: 'user@example.com',\n subject: 'E-mail de bienvenue',\n body: 'Bienvenue sur notre site !'\n});\n\nconsole.log('Tâche ajoutée à la file d'attente');\nDans cet exemple, nous avons créé une file d'attente nommée emailQueue et y avons ajouté une tâche — l'envoi d'un e-mail. La tâche n'est pas encore exécutée, elle attend simplement son gestionnaire.
2. Traitement des tâches de la file d'attente
\nPour que les tâches commencent à être exécutées, nous avons besoin d'un gestionnaire (consumer). Il va "écouter" la file d'attente et en retirer les tâches à exécuter.
\nCréons un fichier worker.js :
const Queue = require('bull');\nconst emailQueue = new Queue('emailQueue', {\n redis: { host: '127.0.0.1', port: 6379 }\n});\n\n// Fonction gestionnaire\nemailQueue.process(async (job) => {\n const { to, subject, body } = job.data;\n console.log(`Envoi de l'e-mail à ${to}...`);\n \n // Simulation d'envoi d'e-mail (dans un projet réel, ce serait nodemailer)\n await new Promise(resolve => setTimeout(resolve, 2000));\n \n console.log(`E-mail "${subject}" envoyé à ${to}`);\n return { status: 'sent', email: to };\n});\n\nconsole.log('Gestionnaire démarré et en attente de tâches...');\nExécutez ce script, puis ajoutez une tâche à partir du premier exemple. Vous verrez la tâche être traitée.
\n\n2.1 Gestion des erreurs et tentatives de reprise
\nDans les projets réels, les tâches peuvent échouer (par exemple, serveur SMTP indisponible). Bull fournit un mécanisme intégré de tentatives de reprise :
\nemailQueue.add(\n { to: 'user@example.com', subject: 'E-mail important' },\n { \n attempts: 5, // Nombre de tentatives\n backoff: { type: 'exponential', delay: 2000 } // Délai exponentiel\n }\n);\n\n// Dans le gestionnaire, on peut gérer l'échec\nemailQueue.on('failed', (job, err) => {\n console.error(`Tâche ${job.id} a échoué : ${err.message}`);\n});\n\n3. Fonctionnalités avancées des files d'attente
\nBull offre de nombreuses fonctions utiles pour la gestion des tâches.
\n\n