Aufgabenwarteschlangen für TypeScript: Vollständiger Leitfaden zu Bull und Bee-Queue
Bei der Entwicklung moderner Webanwendungen mit TypeScript besteht häufig die Notwendigkeit, langwierige oder ressourcenintensive Operationen asynchron auszuführen, ohne den Hauptthread zu blockieren. Zum Beispiel: Senden von E-Mail-Benachrichtigungen, Generieren von PDF-Berichten, Bildverarbeitung oder Synchronisierung mit externen APIs. Zur Lösung dieser Aufgaben werden Aufgabenwarteschlangen (Job Queues) verwendet. In diesem Artikel betrachten wir im Detail die beiden beliebtesten Bibliotheken für TypeScript — Bull und Bee-Queue — und analysieren, wie man sie in Ihr Projekt integriert.
Wozu braucht man Aufgabenwarteschlangen?
Eine Aufgabenwarteschlange ermöglicht:
- Verantwortung trennen — der Hauptdienst ist nur für das Einreihen der Aufgabe zuständig, der Bearbeiter für deren Ausführung.
- Last steuern — die Anzahl paralleler Aufgaben (Concurrency) kann begrenzt werden.
- Zustellung garantieren — Aufgaben gehen auch bei Prozessabstürzen nicht verloren (dank Redis).
- Ausführung planen — eine Aufgabe auf einen bestimmten Zeitpunkt verschieben oder nach einem Zeitplan wiederholen.
- Fehler behandeln — automatische Wiederholungsversuche (Retry) mit exponentiellem Backoff.
Bull — die beliebteste Warteschlange für Node.js und TypeScript
Bull ist eine leistungsstarke, auf Redis basierende Bibliothek, die einen vollständigen Funktionsumfang unterstützt: Prioritäten, Wiederholungsversuche, Verzögerungen, Pausen, Ereignisse und Überwachung. Bull bietet eine hervorragende Typisierung für TypeScript.
Installation und Einrichtung
npm install bull @types/bullEin einfaches Beispiel einer Warteschlange zum Senden von E-Mails:
import Queue from 'bull';
interface EmailJob { to: string; subject: string; body: string;}
// Erstellen einer Warteschlange mit dem Namen 'email'const emailQueue = new Queue<EmailJob>('email', { redis: { host: 'localhost', port: 6379 }, defaultJobOptions: { attempts: 3, // bis zu 3 Versuche backoff: { type: 'exponential', delay: 2000 }, removeOnComplete: true, }});
// Bearbeiter — wird im Hintergrund ausgeführtemailQueue.process(async (job) => { console.log(`Sende E-Mail an ${job.data.to}`); // Simuliere das Senden await new Promise(resolve => setTimeout(resolve, 1000)); console.log(`E-Mail gesendet: ${job.data.subject}`);});
// Aufgabe hinzufügenasync function addEmail() { await emailQueue.add({ to: 'user@example.com', subject: 'Hallo aus der Warteschlange!', body: 'Dies ist eine Testnachricht.', });}
addEmail();Erweiterte Funktionen von Bull
- Wiederkehrende Aufgaben (Cron):
queue.add(data, { repeat: { cron: '0 8 * * *' } }) - Prioritäten:
queue.add(data, { priority: 1 })— je kleiner die Zahl, desto höher die Priorität. - Ausführungsverzögerung:
queue.add(data, { delay: 60000 })— um 1 Minute verzögern. - Ereignisse: Man kann auf
completed,failed,progressund andere abonnieren. - Pause/Fortsetzen:
queue.pause()/queue.resume().
// EreignisbehandlungemailQueue.on('completed', (job, result) => { console.log(`Aufgabe ${job.id} abgeschlossen`);});
emailQueue.on('failed', (job, err) => { console.error(`Aufgabe ${job.id} fehlgeschlagen: ${err.message}`);});Bee-Queue — eine leichte Alternative
Bee-Queue ist eine minimalistische Redis-basierte Warteschlange, die einfacher und speicherschonender als Bull ist. Geeignet für kleinere Projekte oder Fälle, in denen keine komplexen Konfigurationen erforderlich sind.
Installation und Beispiel
npm install bee-queueimport Bee from 'bee Auch in der Bibliothek
Swift-Aufgabenplaner: GCD, OperationQueue und Combine für iOS/macOS
Protocol Buffers für Java: Komplette Anleitung mit Beispielen
TypeScript-Aufgabenplaner: Vollständiger Leitfaden zu Cron-Bibliotheken und Timern
OAuth-Client für Rust: Bibliothek oauth2-rs
Rate Limiting in PHP: Vollständiger Leitfaden zur Anfragenbegrenzung