Was sind Queues
In Web-Anwendungen gibt es Vorgänge – z. B. E-Mail-Versand, Bildskalierung oder Aufrufe externer APIs – die mehrere Sekunden dauern können. Erledigen Sie diese synchron innerhalb eines HTTP-Requests, muss der Nutzer bis zur Antwort warten. Mit Laravels Queues erledigen Sie solche schweren Aufgaben asynchron im Hintergrund. Der Request liefert sofort die Antwort, die eigentliche Arbeit übernimmt ein Worker-Prozess.Queues unterstützen mehrere Backends wie Datenbank, Redis oder Amazon SQS.
In der Entwicklung führt der Treiber
sync Jobs direkt aus, ohne eine echte Queue zu nutzen.Queue-Konfiguration
config/queue.php
Die Queue-Konfiguration liegt inconfig/queue.php.
Über die Umgebungsvariable QUEUE_CONNECTION wählen Sie den Treiber.
.env-Konfiguration
Vorbereitung des Datenbank-Treibers
Für dendatabase-Treiber braucht es eine Tabelle. In neuen Laravel-11-Projekten ist die Migration bereits enthalten – andernfalls erzeugen Sie sie so:
Vorbereitung des Redis-Treibers
Für denredis-Treiber ergänzen Sie in config/database.php die Redis-Verbindung und installieren den Client.
SQS Overflow Storage
Amazon SQS begrenzt die Größe der Nachrichten-Payload. Für Jobs mit großen Payloads speichern Sie den Überschuss in einem Cache-Store und schicken an SQS nur einen Pointer.- Mit
enabledwerden Payloads ab 1 MB in den angegebenen Cache-Store ausgelagert. - Mit
always: truewerden alle SQS-Payloads unabhängig von der Größe im Cache-Store abgelegt. delete_after_processingentfernt gespeicherte Payloads nach erfolgreicher Verarbeitung (Standard:true).flush_on_clearlöscht beiqueue:clearden Overflow-Store. Nutzen Sie hier einen dedizierten Store, damit nicht der normale Cache mitgeleert wird.
Job-Klassen erstellen
make:job
Erzeugen Sie ein Grundgerüst mit dem Artisan-Befehl make:job.
app/Jobs/SendWelcomeEmail.php.
Aufbau einer Job-Klasse
ShouldQueue signalisiert Laravel, dass der Job in einer Queue asynchron verarbeitet werden soll.
Das Trait Queueable liefert die für Queue-Operationen benötigten Methoden.
Jobs dispatchen
dispatch()
Aus Controllern oder Services stellen Sie einen Job mit dispatch() in die Queue.
Verzögerter Dispatch
Mitdelay() verschieben Sie die Ausführung.
dispatchAfterResponse()
Mit dispatchAfterResponse() läuft der Job unmittelbar nach dem Ausliefern der HTTP-Antwort. Es funktioniert auch mit dem sync-Treiber und eignet sich daher für kleine Aufgaben, die keinen eigenen Worker brauchen.
Dispatch in eine bestimmte Queue
Queue Routing
Um bestimmte Job-Klassen standardmäßig einer bestimmten Verbindung oder Queue zuzuordnen, verwenden Sie in derboot()-Methode eines Service-Providers Queue::route(). So verwalten Sie Zuordnungen zentral, ohne in jeder Job-Klasse onQueue() / onConnection() zu schreiben.
Queue Routing lässt sich vom Job aus über
onQueue() / onConnection() überschreiben.Synchrone Ausführung (Test/Entwicklung)
dispatchSync() führt den Job unmittelbar aus, ohne die Queue zu benutzen.
Bulk-Dispatch
Wenn Sie viele unabhängige Jobs auf einmal dispatchen möchten, verwenden Sie die Methodebulk() der Fassade Bus. Ideal, wenn Sie keine Batch-Nachverfolgung oder Callbacks benötigen.
Bus::bulk() gruppiert die Jobs nach Verbindung und Queue-Name und pusht jede Gruppe gesammelt – das ist effizient.
Bus::bulk() schickt Jobs gesammelt als Batch in die Queue. Anders als bei Batch-Verarbeitung (Bus::batch()) gibt es kein Fortschritts-Tracking und keine Completion-Callbacks. Ideal, um viele unabhängige Jobs einfach in großem Volumen zu senden.Jobs verarbeiten
queue:work
Starten Sie einen Queue-Worker, um Jobs abzuarbeiten.
Optionen zur Worker-Steuerung
Häufig genutzte Optionen können Sie kombinieren.| Option | Beschreibung |
|---|---|
--tries=N | Maximale Versuche eines Jobs. Danach gilt der Job als fehlgeschlagen |
--timeout=N | Maximaldauer eines Jobs in Sekunden. Bei Überschreitung wird der Worker abgebrochen |
--sleep=N | Wartezeit in Sekunden bis zur nächsten Poll-Anfrage, wenn die Queue leer ist (Standard: 3) |
--max-jobs=N | Beendet den Worker nach N verarbeiteten Jobs |
--max-time=N | Beendet den Worker nach N Sekunden |
--queue=A,B | Bearbeitet die Queues mit Priorisierung (A zuerst) |
Retry-Einstellungen in der Job-Klasse
Statt Kommandozeilenoptionen kann es übersichtlicher sein, die Einstellungen direkt in der Job-Klasse zu definieren.Job wieder freigeben (Release-Middleware)
Wenn ein Job unter bestimmten Bedingungen nicht ausgeführt, sondern zurück in die Queue gelegt werden soll, verwenden Sie dieRelease-Middleware.
Release::unless() gibt frei, wenn die Bedingung false ist.
Fehlgeschlagene Jobs
Tabelle failed_jobs einrichten
Überschreitet ein Job die maximale Anzahl an Versuchen, landet er in der Tabelle failed_jobs.
Falls die Tabelle fehlt:
Aufräumen im Fehlerfall
Definieren Sie in der Job-Klasse die Methodefailed(), um im Fehlerfall aufzuräumen.
Retries für bestimmte Exceptions unterbinden
Manchmal möchte man bei bestimmten Exceptions gar nicht erst retryen. Inbootstrap/app.php innerhalb von withExceptions() verwenden Sie dontRetry.
dontRetryWhen mit einer Closure. Gibt sie true zurück, wird der Job sofort als fehlgeschlagen markiert und nicht mehr retryet.
Liste fehlgeschlagener Jobs
Fehlgeschlagene Jobs erneut ausführen
Fehlgeschlagene Jobs löschen
Häufig verwendete Queue-Treiber
database-Treiber
Ein einfacher Treiber, ohne zusätzliche Infrastruktur direkt einsetzbar.
Jobs landen in der Tabelle jobs, Worker pollen diese und verarbeiten sie.
- Vorteile: einfache Einrichtung, nutzt Ihre vorhandene RDBMS
- Nachteile: erhöht die DB-Last – für sehr viele Jobs weniger geeignet
redis-Treiber
Der in Produktion am häufigsten verwendete, schnelle Treiber.
Da Redis im Speicher arbeitet, sind Durchsatz und Skalierung deutlich besser.
- Vorteile: schnell, skalierbar
- Nachteile: Redis-Server erforderlich
Produktivbetrieb mit Supervisor
In Produktion solltenqueue:work-Prozesse bei einem Ausfall automatisch neu starten.
Unter Linux ist Supervisor der Klassiker.
numprocs=2 starten Sie zwei Worker parallel.
Danach Supervisor neu einlesen:
Beispiel: E-Mail-Versand via Queue
Zusammenfassung
Wann Queues nutzen?
Wann Queues nutzen?
- E-Mail-/SMS-Versand
- Bilder-/Videokonvertierung
- Aufrufe externer APIs
- Report- oder CSV-Erstellung
- Webhook-Versand
Tipp für die Entwicklung
Tipp für die Entwicklung
Setzen Sie in der
.env QUEUE_CONNECTION=sync, werden Jobs direkt ausgeführt.
So funktioniert alles auch ohne Worker – ideal beim Entwickeln.Wichtige Befehle
Wichtige Befehle