Overzicht
De queuefunctionaliteit van Laravel biedt twee soorten uitvoeringscontrole voor jobs: deduplicatie (Unique) en debounce (Debounce). Beide zijn mechanismen om “onnodige uitvoeringen te besparen wanneer dezelfde job herhaaldelijk wordt gedispatcht”, maar het gedrag verschilt.Unique Jobs — ShouldBeUnique
Zolang dezelfde job in de queue staat, worden extra dispatches genegeerd.
UpdateSearchIndex in de queue staat (of wordt verwerkt), wordt een poging om dezelfde job te dispatchen genegeerd.
De uniciteitsbeperking verfijnen met een sleutel — UniqueFor + uniqueId()
Wil je binnen dezelfde jobklasse “de update van product A” en “de update van product B” als aparte jobs behandelen, dan definieer je een sleutel met de uniqueId()-methode.
- De waarde die
uniqueId()teruggeeft, wordt de sleutel van de cachelock. - Met
#[UniqueFor(seconden)]wordt de lock na dat aantal seconden automatisch vrijgegeven (een failsafe voor het geval de job niet verwerkt is).
Een cachedriver opgeven — uniqueVia()
Wil je een andere dan de standaard-cachedriver gebruiken, dan implementeer je uniqueVia().
Unique Jobs vereisen een cachedriver die atomic locks ondersteunt (
redis, database, memcached, dynamodb, file, array).ShouldBeUnique vs ShouldBeUniqueUntilProcessing
De lock van ShouldBeUnique wordt aangehouden totdat de job is voltooid of het retrymaximum is bereikt. Er zijn gevallen waarin dat een probleem is.
Voorbeeld: er staat één UpdateSearchIndex(product_id: 42) in de queue en je wilt direct nadat de worker de verwerking is gestart dezelfde job opnieuw dispatchen. Met ShouldBeUnique komt de tweede pas in de queue nadat de verwerking is voltooid.
In dat geval gebruik je ShouldBeUniqueUntilProcessing. Omdat de lock vlak vóór het begin van de verwerking wordt vrijgegeven, is een volgende dispatch mogelijk op het moment dat de worker de job oppakt.
Vergelijking samengevat
Debounced Jobs — #[DebounceFor]
Het
DebounceFor-attribute is een functie die in Laravel 13 is toegevoegd.- De waarde die
debounceId()teruggeeft, identificeert de job (per product-ID geldt een onafhankelijke debounce). - Ook als er binnen 30 seconden tien keer met hetzelfde
productIdwordt gedispatcht, wordt alleen de laatste uitgevoerd.
maxWait — de bovengrens van de maximale wachttijd
Bij data die vaak wordt bijgewerkt, kan de debounce eindeloos doorgaan en wordt de job mogelijk nooit uitgevoerd. Met maxWait stel je een maximale vertraging in.
Een cachedriver opgeven — debounceVia()
Het JobDebounced-event
Een job die door een latere dispatch is overschreven, wordt uit de queue verwijderd en vuurt het event Illuminate\Queue\Events\JobDebounced af. Door naar dit event te luisteren kun je gedebouncede jobs volgen en monitoren.
Welke moet je gebruiken?
Interne implementatie
Het lockmechanisme van Unique Jobs
Wanneer eenShouldBeUnique-job wordt gedispatcht, verkrijgt Laravel intern een atomic lock via de cache. De locksleutel heeft dit formaat:
De implementatie van Debounced Jobs
DebounceFor gebruikt intern een cache-entry die het “debouncevenster” beheert. Bij elke nieuwe dispatch gebeurt het volgende:
- De bestaande job wordt uit de queue verwijderd (het
JobDebounced-event wordt afgevuurd) - De nieuwe job wordt aan de queue toegevoegd (met een vertraging van het aantal debounceseconden)
- De timer in de cache wordt gereset
maxWait is opgegeven, wordt ook de timestamp van de eerste dispatch vastgelegd en wordt voorkomen dat de debounce langer dan maxWait seconden vanaf dat moment doorloopt.