Ü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 — ShouldBeUnique
Solange ein identischer Job in der Queue vorhanden ist, werden weitere Dispatches ignoriert.
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.- 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
productIddispatched 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.
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 einShouldBeUnique-Job dispatched wird, holt Laravel intern einen atomaren Lock über den Cache. Der Lock-Schlüssel hat folgendes Format:
Implementierung von Debounced Jobs
DebounceFor verwendet intern einen Cache-Eintrag, der das „Debounce-Fenster” verwaltet. Bei jedem neuen Dispatch geschieht Folgendes:
- Der bestehende Job wird aus der Queue entfernt (
JobDebounced-Event wird ausgelöst). - Der neue Job wird in die Queue aufgenommen (mit der Verzögerung der Debounce-Sekunden).
- Der Timer im Cache wird zurückgesetzt.
maxWait angegeben, wird zusätzlich der Zeitstempel des ersten Dispatches erfasst, um zu verhindern, dass das Debouncing die maxWait-Sekunden ab diesem Zeitpunkt überschreitet.