Files d'attente de tâches pour TypeScript : Bull, Agenda et Bee-Queue
Dans les applications web modernes en TypeScript, il est souvent nécessaire d'exécuter des opérations gourmandes en ressources ou longues de manière asynchrone, sans bloquer le thread principal. Les files d'attente de tâches (Job Queues) sont un modèle architectural éprouvé qui permet de différer l'exécution des tâches, de répartir la charge entre les workers et d'assurer la fiabilité du traitement. Dans cet article, nous examinerons trois outils populaires pour TypeScript : Bull, Agenda et Bee-Queue. Vous découvrirez comment les intégrer dans un projet, quels sont leurs points forts et quel outil choisir pour des scénarios spécifiques.
1. Bull — une file d'attente puissante basée sur Redis
Bull est sans doute la bibliothèque la plus populaire pour gérer les files d'attente de tâches dans Node.js/TypeScript. Elle utilise Redis comme backend, ce qui garantit des performances élevées et une résistance aux pannes. Bull prend en charge les priorités des tâches, les tentatives répétées, les délais, ainsi que des scénarios complexes avec pause et reprise de la file d'attente.
Installation :
npm install bullnpm install @types/bull // pour TypeScriptExemple simple de producteur-consommateur :
import Queue from 'bull';
// Création d'une file d'attente nommée 'email'const emailQueue = new Queue('email', { redis: { host: 'localhost', port: 6379 }});
// Producteur : ajout d'une tâcheasync function sendWelcomeEmail(userId: string) { await emailQueue.add( { userId, type: 'welcome' }, { attempts: 3, backoff: 2000 } // 3 tentatives avec un délai de 2s );}
// Consommateur : traitement de la tâcheemailQueue.process(async (job) => { const { userId, type } = job.data; console.log(`Envoi du courrier ${type} à l'utilisateur ${userId}`); // Logique d'envoi d'email ici});Bull fournit également une interface de surveillance pratique via bull-board ou bull-repl, ce qui facilite le débogage en production.
2. Agenda — une file d'attente flexible avec prise en charge des plannings
Agenda est une bibliothèque qui utilise également MongoDB comme stockage. Sa principale caractéristique est la prise en charge intégrée des tâches périodiques (plannings de type cron) et une API pratique pour définir des travaux récurrents. Agenda est parfait pour les tâches qui doivent être exécutées selon un planning : nettoyage de base de données, génération de rapports, envoi de newsletters.
Installation :
npm install agendanpm install @types/agendaExemple d'utilisation avec un planning :
import Agenda from 'agenda';
const agenda = new Agenda({ db: { address: 'mongodb://localhost:27017/agenda-example' }});
// Définition d'une tâcheagenda.define('send weekly report', async (job) => { const { department } = job.attrs.data; console.log(`Génération du rapport hebdomadaire pour le département ${department}`);});
// Démarrage de l'agent et planification de la tâche(async () => { await agenda.start(); // Exécution chaque vendredi à 18h00 await agenda.every('0 18 * * 5', 'send weekly report', { department: 'IT' });})();Agenda prend en charge les priorités, les tentatives répétées et l'arrêt progressif (graceful shutdown). Cependant, elle est moins performante que Bull en raison de l'utilisation de MongoDB au lieu de Redis.
3. Bee-Queue — une file d'attente légère et rapide
Bee-Queue est une file d'attente minimaliste basée sur Redis, conçue pour des performances maximales et une petite taille de code. Elle ne prend pas en charge les fonctionnalités complexes comme les priorités ou les plannings, mais elle est idéale pour les scénarios simples où la vitesse et une faible consommation de mémoire sont importantes.
Installation :
npm install bee-queuenpm install @types/bee-queueExemple de fonctionnement :
import Bee from 'bee-queue';
const imageQueue = new Bee('image-processing', { redis: { host: 'localhost', port: 6379 }});
// ProducteurimageQueue.createJob({ Aussi dans la bibliothèque
Génération de PDF en C++ : aperçu des bibliothèques et outils
Travailler avec Excel en PHP : bibliothèques PhpSpreadsheet, PhpOffice et génération XLSX
Mise en cache en Kotlin : Redis, Caffeine et autres solutions
Quartz Scheduler Java : guide complet avec exemples
Rate Limiting en TypeScript : bibliothèques, outils et exemples d'implémentation