Backend

Job Queues mit BullMQ

Schwere Aufgaben im Hintergrund verarbeiten

Email senden, Bilder verarbeiten, Reports generieren, das gehoert nicht in deinen API-Response. Job Queues verarbeiten solche Aufgaben im Hintergrund damit deine App schnell bleibt.

Pro-Tip — Der schnelle Weg
Setze immer ein Timeout und maximale Retry-Versuche. Ein Job der ewig haengt blockiert die gesamte Queue. 3 Retries mit exponentiellem Backoff ist ein guter Standard.
Seite 1
1

BullMQ installieren

BullMQ ist die Standard-Queue-Library fuer Node.js. Sie braucht Redis als Backend, Upstash Redis funktioniert auch.

npm install bullmq ioredis
2

Queue definieren

Erstelle eine Queue mit einem Namen und Redis-Verbindung. Jede Queue verarbeitet einen bestimmten Typ von Jobs.

// lib/queue.ts
import { Queue } from 'bullmq';
import IORedis from 'ioredis';


const connection = new IORedis(process.env.REDIS_URL!, { maxRetriesPerRequest: null });


export const emailQueue = new Queue('emails', { connection });
export const imageQueue = new Queue('images', { connection });
3

Jobs hinzufuegen

Fuege Jobs zur Queue hinzu von ueberall in deiner App. Der Job wird asynchron verarbeitet, dein API-Response wartet nicht darauf.

// In deinem Route Handler
import { emailQueue } from '@/lib/queue';


export async function POST(request: Request) {
const { userId, plan } = await request.json();
await db.subscription.create({ data: { userId, plan } });


// Email wird im Hintergrund gesendet
await emailQueue.add('welcome-email', {
to: user.email,
template: 'welcome',
data: { name: user.name, plan },
}, { attempts: 3, backoff: { type: 'exponential', delay: 5000 } });


return Response.json({ success: true }); // Sofort zurueck
}
4

Worker erstellen

Der Worker laueft als separater Prozess und verarbeitet Jobs aus der Queue. Er kann auch auf einem anderen Server laufen.

// worker.ts
import { Worker } from 'bullmq';
import IORedis from 'ioredis';


const connection = new IORedis(process.env.REDIS_URL!, { maxRetriesPerRequest: null });


const emailWorker = new Worker('emails', async (job) => {
console.log(`Sende ${job.name} an ${job.data.to}`);
await sendEmail(job.data);
}, { connection, concurrency: 5 });


emailWorker.on('completed', (job) => console.log(`Job ${job.id} fertig`));
emailWorker.on('failed', (job, err) => console.error(`Job ${job?.id} fehlgeschlagen:`, err));
Seite 2
Warum das funktioniert
  • API-Responses bleiben schnell weil schwere Arbeit im Hintergrund passiert
  • Automatische Retries bei Fehlern ohne dass der User nochmal klicken muss
  • Concurrency-Control verhindert Ueberlastung bei vielen gleichzeitigen Jobs
  • Redis als Backend ist blitzschnell und bewaehrt fuer Millionen von Jobs
Tipps
  • Nutze separate Queues fuer verschiedene Job-Typen mit unterschiedlichen Prioritaeten
  • BullMQ Dashboard 'bull-board' gibt dir eine Web-UI zur Job-Ueberwachung
  • Fuer Serverless ohne Redis nutze Inngest oder Trigger.dev als Alternative
  • Teste Worker lokal mit einem Redis Docker Container: docker run -p 6379:6379 redis
Seite 3
Bereit für den nächsten Schritt?

KIWorld VibeCoding Masterclass

Du willst nicht nur einzelne Tools einrichten, sondern wirklich lernen wie du mit KI komplette Apps, Websites und SaaS-Produkte baust? Über 700 Videos — von Anfänger bis Fortgeschritten — in jedem Bereich. Von der Idee bis zum fertigen Produkt, ohne eine Zeile Code selbst zu schreiben.

Jetzt Masterclass ansehen