Was ist Bull und warum braucht man es?
Bull ist eine leistungsstarke und beliebte Bibliothek zur Verwaltung von Aufgaben-Warteschlangen (Job Queues) in der Node.js-Umgebung. Es basiert auf Redis und bietet eine zuverlässige, skalierbare und flexible Möglichkeit zur Verarbeitung von Hintergrundaufgaben. Wenn Ihre Anwendung Vorgänge ausführen muss, die den Hauptthread nicht blockieren sollen (z. B. E-Mail-Versand, Bildverarbeitung, PDF-Generierung, Synchronisierung mit externen APIs, Daten-Parsing), ist Bull die ideale Lösung.
Warum Bull verwenden?
- Asynchrone Verarbeitung: Entlastet den Hauptserver, indem schwere Aufgaben in Hintergrundprozesse ausgelagert werden.
- Zuverlässigkeit: Aufgaben werden in Redis gespeichert, sodass sie bei einem Neustart der Anwendung oder einem Worker-Ausfall nicht verloren gehen.
- Wiederholungsversuche: Integrierte Unterstützung für automatische Wiederholungsversuche bei Fehlern.
- Planung: Möglichkeit, Aufgaben zu verzögern oder nach einem Zeitplan (Cron) auszuführen.
- Prioritäten: Steuerung der Ausführungsreihenfolge von Aufgaben.
- Monitoring: Einfache Überwachung des Warteschlangenstatus mit der integrierten UI (Bull Board).
Installation von Bull
Stellen Sie zunächst sicher, dass Redis installiert und gestartet ist. Bull funktioniert nicht ohne Redis.
- Redis-Installation (Beispiel für Ubuntu/Debian):
sudo apt update sudo apt install redis-server sudo systemctl start redis - Bull-Installation mit npm:
npm install bull - Bull Board-Installation (optional, für die Weboberfläche):
npm install @bull-board/express @bull-board/api
Schnellstart: Erstes Beispiel
Erstellen wir eine einfache Warteschlange zum Versenden von Begrüßungs-E-Mails.
Schritt 1: Producer erstellen (producer.js)
const Queue = require('bull');
// Warteschlange mit dem Namen 'emailQueue' erstellen
const emailQueue = new Queue('emailQueue', {
redis: { host: 'localhost', port: 6379 }
});
// Funktion zum Hinzufügen einer Aufgabe zur Warteschlange
async function addEmailJob(to, subject, body) {
const job = await emailQueue.add(
{ to, subject, body }, // Aufgabendaten
{
attempts: 3, // Anzahl der Wiederholungsversuche bei Fehlern
backoff: { type: 'fixed', delay: 5000 } // Verzögerung zwischen Versuchen (5 Sek.)
}
);
console.log(`Aufgabe hinzugefügt mit ID: ${job.id}`);
return job;
}
// Beispielaufruf
addEmailJob('user@example.com', 'Willkommen!', 'Vielen Dank für Ihre Registrierung.')
.then(() => process.exit(0))
.catch(err => console.error(err));
Schritt 2: Worker erstellen (worker.js)
const Queue = require('bull');
// Verbindung zur gleichen Warteschlange herstellen
const emailQueue = new Queue('emailQueue', {
redis: { host: 'localhost', port: 6379 }
});
// Aufgaben-Handler
emailQueue.process(async (job) => {
console.log(`Verarbeite Aufgabe ${job.id}...`);
const { to, subject, body } = job.data;
// E-Mail-Versand simulieren (in der Praxis nodemailer verwenden)
await new Promise(resolve => setTimeout(resolve, 2000));
console.log(`E-Mail gesendet an ${to}: ${subject}`);
// Bei einem Fehler werfen Sie einen Fehler
// throw new Error('Fehler beim Senden');
});
console.log('Worker gestartet und wartet auf Aufgaben...');
Schritt 3: Ausführen
Starten Sie zuerst den Worker: node worker.js. Öffnen Sie dann ein zweites Terminal und starten Sie den Producer: node producer.js. Sie werden sehen, wie die Aufgabe in die Warteschlange eingereiht und verarbeitet wird.
Wichtige Methoden und Funktionen von Bull
1. new Queue(name, [options]) — Warteschlange erstellen
Funktion: Erstellt eine neue Warteschlangeninstanz. Wenn bereits eine Warteschlange mit diesem Namen in Redis existiert, wird eine Verbindung zu ihr hergestellt.
Auch in der Bibliothek
Arbeiten mit XML in PHP: DOMDocument, SimpleXML und XPath
CsvHelper für C# (.NET): Komplettguide mit Beispielen
Arbeiten mit YAML in TypeScript: Vollständiger Leitfaden zum Parsen und Serialisieren
JWT-Token in C# (.NET): Arbeiten mit System.IdentityModel.Tokens.Jwt