Skip to main content

Überblick

Die Queue-Funktionen von Laravel bieten zwei Arten der Ausführungssteuerung: Deduplizierung (Unique) und Debouncing. Beide dienen dazu, „bei mehrfachem Dispatchen desselben Jobs unnötige Ausführungen zu vermeiden”, verhalten sich jedoch unterschiedlich.
Unique Jobs und Debounced Jobs sind gegenseitig ausschließend. Implementieren Sie in Jobs, die das Attribut DebounceFor verwenden, nicht ShouldBeUnique.

Unique Jobs — ShouldBeUnique

Solange ein identischer Job in der Queue vorhanden ist, werden weitere Dispatches ignoriert.
Solange UpdateSearchIndex in der Queue liegt (oder gerade verarbeitet wird), werden Versuche, denselben Job zu dispatchen, ignoriert.

Eindeutigkeitsbeschränkung mit einem Schlüssel einschränken — UniqueFor + uniqueId()

Wenn Sie in derselben Job-Klasse „Update von Produkt A” und „Update von Produkt B” als separate Jobs behandeln möchten, definieren Sie den Schlüssel über die Methode uniqueId().
  • Der von uniqueId() zurückgegebene Wert dient als Schlüssel für den Cache-Lock.
  • Wird #[UniqueFor(Sekunden)] angegeben, wird die Sperre nach Ablauf dieser Sekunden automatisch aufgehoben (Failsafe für Jobs, die nicht verarbeitet werden).

Cache-Treiber angeben — uniqueVia()

Wenn Sie einen anderen als den Standard-Cache-Treiber verwenden möchten, implementieren Sie uniqueVia().
Unique Jobs benötigen einen Cache-Treiber, der atomare Locks unterstützt (redis, database, memcached, dynamodb, file, array).

ShouldBeUnique vs. ShouldBeUniqueUntilProcessing

Der Lock von ShouldBeUnique bleibt bestehen, bis der Job abgeschlossen oder das Retry-Limit erreicht ist. Das kann in bestimmten Fällen zum Problem werden. Beispiel: In der Queue liegt ein UpdateSearchIndex(product_id: 42), und Sie möchten unmittelbar nach Beginn der Verarbeitung denselben Job erneut dispatchen. Mit ShouldBeUnique gelangt der zweite Job erst nach Abschluss der Verarbeitung in die Queue. In diesem Fall verwenden Sie ShouldBeUniqueUntilProcessing. Da der Lock unmittelbar vor Beginn der Verarbeitung freigegeben wird, ist ein erneuter Dispatch möglich, sobald der Worker den Job entnimmt.

Zusammenfassender Vergleich


Debounced Jobs — #[DebounceFor]

Das Attribut DebounceFor ist eine in Laravel 13 hinzugefügte Funktion.
Wird derselbe Job in kurzer Zeit viele Male dispatched, wird nur der zuletzt eingereihte Job ausgeführt. Es handelt sich um dasselbe Konzept wie das Debouncing im Web-Frontend.
  • Der von debounceId() zurückgegebene Wert identifiziert den Job (das Debouncing wird pro Produkt-ID unabhängig angewendet).
  • Selbst wenn innerhalb von 30 Sekunden 10-mal mit derselben productId dispatched wird, wird nur der letzte Job ausgeführt.

maxWait — Obergrenze für die Wartezeit

Bei häufig aktualisierten Daten könnte das Debouncing endlos weitergehen und der Job nie ausgeführt werden. Mit maxWait legen Sie eine maximale Verzögerung fest.
In diesem Beispiel wird der Job spätestens 120 Sekunden nach dem ersten Dispatch garantiert ausgeführt (selbst wenn das 30-Sekunden-Debouncing andauert, kommt es nach 120 Sekunden zum Timeout).

Cache-Treiber angeben — debounceVia()

JobDebounced-Event

Ein Job, der von einem nachfolgenden Dispatch überschrieben wurde, wird aus der Queue entfernt und löst das Event Illuminate\Queue\Events\JobDebounced aus. Indem Sie dieses Event abonnieren, können Sie zurückgesetzte Jobs verfolgen und überwachen.

Welche Variante sollten Sie wählen?


Interne Implementierung

Lock-Mechanismus von Unique Jobs

Wenn ein ShouldBeUnique-Job dispatched wird, holt Laravel intern einen atomaren Lock über den Cache. Der Lock-Schlüssel hat folgendes Format:
Kann der Lock nicht erworben werden (weil ein anderer Job ihn hält), wird der Job nicht in die Queue aufgenommen.

Implementierung von Debounced Jobs

DebounceFor verwendet intern einen Cache-Eintrag, der das „Debounce-Fenster” verwaltet. Bei jedem neuen Dispatch geschieht Folgendes:
  1. Der bestehende Job wird aus der Queue entfernt (JobDebounced-Event wird ausgelöst).
  2. Der neue Job wird in die Queue aufgenommen (mit der Verzögerung der Debounce-Sekunden).
  3. Der Timer im Cache wird zurückgesetzt.
Ist maxWait angegeben, wird zusätzlich der Zeitstempel des ersten Dispatches erfasst, um zu verhindern, dass das Debouncing die maxWait-Sekunden ab diesem Zeitpunkt überschreitet.
Zuletzt geändert am 2. August 2026