Aufgabenwarteschlangen für TypeScript: Bull, Agenda und Bee-Queue
In modernen Webanwendungen mit TypeScript besteht häufig die Notwendigkeit, ressourcenintensive oder langwierige Operationen asynchron auszuführen, ohne den Hauptthread zu blockieren. Aufgabenwarteschlangen (Job Queues) sind ein bewährtes Architekturmuster, das es ermöglicht, die Ausführung von Aufgaben zu verzögern, die Last auf Worker zu verteilen und eine zuverlässige Verarbeitung zu gewährleisten. In diesem Artikel betrachten wir drei beliebte Werkzeuge für TypeScript: Bull, Agenda und Bee-Queue. Sie erfahren, wie Sie diese in Ihr Projekt integrieren, was ihre Stärken sind und welches Werkzeug Sie für bestimmte Szenarien wählen sollten.
1. Bull – Leistungsstarke Warteschlange auf Basis von Redis
Bull ist wohl die bekannteste Bibliothek zur Verwaltung von Aufgabenwarteschlangen in Node.js/TypeScript. Sie verwendet Redis als Backend, was eine hohe Leistung und Ausfallsicherheit gewährleistet. Bull unterstützt Aufgabenprioritäten, Wiederholungsversuche, Verzögerungen sowie komplexe Szenarien mit Pausieren und Fortsetzen der Warteschlange.
Installation:
npm install bullnpm install @types/bull // für TypeScriptBeispiel eines einfachen Producer-Consumer:
import Queue from 'bull';
// Erstellen einer Warteschlange mit dem Namen 'email'const emailQueue = new Queue('email', { redis: { host: 'localhost', port: 6379 }});
// Producer: Aufgabe hinzufügenasync function sendWelcomeEmail(userId: string) { await emailQueue.add( { userId, type: 'welcome' }, { attempts: 3, backoff: 2000 } // 3 Versuche mit 2s Verzögerung );}
// Consumer: Aufgabe verarbeitenemailQueue.process(async (job) => { const { userId, type } = job.data; console.log(`Senden der ${type}-E-Mail an Benutzer ${userId}`); // Hier die Logik zum E-Mail-Versand});Bull bietet auch eine praktische UI-Überwachung über bull-board oder bull-repl, was das Debugging in der Produktion vereinfacht.
2. Agenda – Flexible Warteschlange mit Zeitplanunterstützung
Agenda ist eine Bibliothek, die ebenfalls MongoDB als Speicher verwendet. Ihr Hauptmerkmal ist die integrierte Unterstützung für periodische Aufgaben (Cron-ähnliche Zeitpläne) und eine benutzerfreundliche API zur Definition wiederkehrender Arbeiten. Agenda eignet sich hervorragend für Aufgaben, die nach einem Zeitplan ausgeführt werden sollen: Datenbankbereinigung, Berichtserstellung, Versand von Zusammenfassungen.
Installation:
npm install agendanpm install @types/agendaBeispiel zur Verwendung mit einem Zeitplan:
import Agenda from 'agenda';
const agenda = new Agenda({ db: { address: 'mongodb://localhost:27017/agenda-example' }});
// Aufgabe definierenagenda.define('send weekly report', async (job) => { const { department } = job.attrs.data; console.log(`Erstellung des wöchentlichen Berichts für Abteilung ${department}`);});
// Agent starten und Aufgabe planen(async () => { await agenda.start(); // Jeden Freitag um 18:00 Uhr ausführen await agenda.every('0 18 * * 5', 'send weekly report', { department: 'IT' });})();Agenda unterstützt Prioritäten, Wiederholungsversuche und Graceful Shutdown. Aufgrund der Verwendung von MongoDB anstelle von Redis ist sie jedoch weniger leistungsstark als Bull.
3. Bee-Queue – Leichte und schnelle Warteschlange
Bee-Queue ist eine minimalistische Warteschlange auf Redis, die auf maximale Leistung und geringe Codegröße ausgelegt ist. Sie unterstützt keine komplexen Funktionen wie Prioritäten oder Zeitpläne, ist aber ideal für einfache Szenarien, bei denen Geschwindigkeit und geringer Speicherverbrauch wichtig sind.
Installation:
npm install bee-queuenpm install @types/bee-queueBeispiel zur Verwendung:
import Bee from 'bee-queue';
const imageQueue = new Bee('image-processing', { redis: { host: 'localhost', port: 6379 }});
// ProducerimageQueue.createJob({