Jobs, cron en de wachtrij voor dode letters
Hoe werk buiten een verzoek kan worden uitgevoerd: wat een taak is, hoe deze opnieuw wordt geprobeerd, hoe cron taken aanmaakt en wat te doen met de taken die uiteindelijk doodgaan.
1. Zet een taak in de wachtrij
Een taak is één achtergrondaanroep voor een functie. Zet het in de wachtrij vanaf een server met een service_role-sleutel.
| Optie | Standaard | Betekenis |
|---|---|---|
payload | null | JSON gegeven aan de functie als verzoekinstantie |
delaySecs | 0 | Seconden wachten voor de eerste poging. De taak blijft tot dan pending. |
maxAttempts | 3 | Totaal aantal pogingen, inclusief de eerste |
Je leest een taak terug met getJob(id) of listJobs({ status, limit }) (limit ligt tussen 1 en 500, standaard 50). De taak heeft de namen status, attempts, max_attempts, error en de datums scheduled_at, started_at, completed_at.
enqueueJob, getJob en listJobs hebben een service_role sleutel nodig. Een publieke sleutel ontvangt 403.
2. Wat jouw functie krijgt
Een baan roept uw functie op zoals elk ander verzoek, met drie verschillen die u moet afhandelen:
| Deel | Waarde |
|---|---|
| Methode | JOB (niet POST) |
| Pad | /jobs/<job id> |
| Lichaam | De taak is payload, als JSON |
| Identiteitskoppen | Geen: x-aura-role en x-aura-user-id zijn afwezig |
Een echt gesprek geregistreerd {"method":"JOB","path":"/jobs/d443d541-…","role":null,"userId":null,"body":"{\"items\":[\"a\",\"b\"],\"order\":42}"}.
Een taak wordt uitgevoerd zonder gebruiker: vertrouw niet op x-aura-user-id. Als het werk van een gebruiker is, plaatst u de ID van de gebruiker in de payload.
3. Levenscyclus en nieuwe pogingen
- Een taak wordt minstens één keer uitgevoerd. Het kan twee keer worden uitgevoerd als een werker stopt terwijl het actief is, dus maak de functie idempotent.
- Een mislukte poging wordt na een vaste vertraging van 5 seconden opnieuw geprobeerd, totdat
maxAttemptsis bereikt. De taak is dandead. De vertraging en het standaard aantal pogingen zijn service-instellingen (JOB_RETRY_DELAY_SECS,JOB_MAX_RETRIES). - Een taak die na het leasen nog steeds
runningis (standaard 450 seconden), wordt door de service teruggevorderd. - Voltooide opdrachten worden standaard 14 dagen bewaard.
Een taak is completed zodra uw functie antwoordt op, ongeacht de statuscode. In een echte run produceerde een functie die 500 retourneerde na één poging een completed-taak en deze werd nooit opnieuw geprobeerd.
Een taak mislukt en wordt alleen opnieuw geprobeerd als de oproep zelf mislukt: de functie bestaat niet of is inactief, de runtime is onbereikbaar of er treedt een time-out op voor de oproep. Als u een nieuwe poging wilt doen wanneer uw eigen code een fout detecteert, zet dan een nieuwe taak in de wachtrij van de handler (met delaySecs voor een back-off) in plaats van te vertrouwen op de statuscode.
In dezelfde echte run doorliep een taak voor een functie die niet bestaat deze reeks: poging 1 mislukte na 3 s met Fonction 'ghost' introuvable, poging 2 mislukte na ongeveer 9 s en de taak werd dead met attempts gelijk aan max_attempts.
4. De wachtrij voor dode letters
Dode opdrachten blijven in de wachtrij staan en kunnen worden weergegeven en opnieuw worden geprobeerd. Deze routes hebben nog geen SDK-methode: gebruik HTTP met een service_role sleutel.
Bij een nieuwe poging wordt de taak teruggezet naar pending zonder de pogingenteller opnieuw in te stellen, zodat de taak nog precies één poging krijgt en terugkeert naar dead als de taak opnieuw mislukt. Verhelp de oorzaak (implementeer bijvoorbeeld de ontbrekende functie) voordat u het opnieuw probeert.
5. Plannen met cron
Een cron-invoer roept de functie zelf niet aan: elke keer dat deze wordt geactiveerd, wordt er een taak in de wachtrij geplaatst.
- Het schema heeft 5 velden (
min hour day month weekday) of 6 velden (sec min hour day month weekday). Een schema met 5 velden krijgt0seconden voorsprong:*/1 * * * *wordt opgeslagen als0 */1 * * * *. - Aliassen zoals
@dailyworden geweigerd met een400die het verwachte formaat aangeeft. - De tijden zijn in UTC.
last_runennext_runzijnnulltot het eerste schot. In een echte run werd een schema dat om 15:40 was gemaakt, om 15:41:00 afgevuurd en vervolgensnext_run15:42:00 weergegeven.- De payload wordt bevroren wanneer u de invoer maakt.
- Het verwijderen van een onbekende naam retourneert
404. Het verwijderen van een cron-item zorgt er ook voor dat het niet meer wordt geactiveerd. - De SDK heeft geen
getCronJobofupdateCronJob: verwijder het item en maak het opnieuw.
Voor puur databasewerk vermijdt de extensie Postgres pg_cron de retourvlucht naar een functie: zie de pagina Cron.