Jobs, cron e la coda dei messaggi non recapitati
Come eseguire il lavoro al di fuori di una richiesta: cos'è un lavoro, come viene ritentato, come cron crea lavori e cosa fare con i lavori che finiscono per essere inattivi.
1. Accodare un lavoro
Un lavoro è una chiamata in background a una funzione. Accodalo da un server con una chiave service_role.
| Opzione | Predefinito | Significato |
|---|---|---|
payload | null | JSON assegnato alla funzione come corpo della richiesta |
delaySecs | 0 | Secondi di attesa prima del primo tentativo. Il lavoro rimane pending fino ad allora. |
maxAttempts | 3 | Numero totale di tentativi, incluso il primo |
Si rilegge un lavoro con getJob(id) o listJobs({ status, limit }) (limit è compreso tra 1 e 500, predefinito 50). Il lavoro ha un status, attempts, max_attempts, error e le date scheduled_at, started_at, completed_at.
enqueueJob, getJob e listJobs necessitano di una chiave service_role. Una chiave pubblica riceve 403.
2. Cosa riceve la tua funzione
Un lavoro chiama la tua funzione come qualsiasi altra richiesta, con tre differenze che devi gestire:
| Parte | Valore |
|---|---|
| Metodo | JOB (non POST) |
| Percorso | /jobs/<job id> |
| Corpo | Il lavoro è payload, come JSON |
| Intestazioni di identità | Nessuno: x-aura-role e x-aura-user-id sono assenti |
Una vera chiamata registrata {"method":"JOB","path":"/jobs/d443d541-…","role":null,"userId":null,"body":"{\"items\":[\"a\",\"b\"],\"order\":42}"}.
Un lavoro viene eseguito senza un utente: non fare affidamento su x-aura-user-id. Se l'opera appartiene a un utente, inserisci l'ID dell'utente nel payload.
3. Ciclo di vita e tentativi
- Un lavoro viene eseguito almeno una volta. Può essere eseguito due volte se un lavoratore si ferma mentre è in esecuzione, quindi rendi la funzione idempotente.
- Un tentativo fallito viene ritentato dopo un ritardo fisso di 5 secondi, fino al raggiungimento di
maxAttempts. Il lavoro sarà quindidead. Il ritardo e il conteggio dei tentativi predefiniti sono impostazioni del servizio (JOB_RETRY_DELAY_SECS,JOB_MAX_RETRIES). - Un lavoro che è ancora
runningdopo il lease (450 secondi per impostazione predefinita) viene recuperato dal servizio. - Per impostazione predefinita, i lavori finiti vengono conservati per 14 giorni.
Un lavoro è completed non appena la tua funzione risponde, qualunque sia il codice di stato. In un'esecuzione reale, una funzione che ha restituito 500 ha prodotto un lavoro completed dopo un tentativo e non è mai stata riprovata.
Un lavoro fallisce e viene ritentato solo quando la chiamata stessa fallisce: la funzione non esiste o è inattiva, il runtime non è raggiungibile o la chiamata scade. Se desideri riprovare quando il tuo codice rileva un errore, accoda un nuovo lavoro dal gestore (con delaySecs per un backoff) invece di fare affidamento sul codice di stato.
Nella stessa esecuzione reale, un lavoro per una funzione che non esiste ha seguito questa sequenza: tentativo 1 fallito in 3 s con Fonction 'ghost' introuvable, tentativo 2 fallito in circa 9 s e il lavoro è diventato dead con attempts uguale a max_attempts.
4. La coda dei messaggi non recapitabili
I lavori morti rimangono in coda e possono essere elencati e ritentati. Questi percorsi non hanno ancora un metodo SDK: utilizza HTTP con una chiave service_role.
Un nuovo tentativo riporta il lavoro a pending senza reimpostare il contatore dei tentativi, quindi ottiene esattamente un altro tentativo e ritorna a dead se fallisce di nuovo. Correggere la causa (ad esempio, distribuire la funzione mancante) prima di riprovare.
5. Pianifica con cron
Una voce cron non richiama la funzione stessa: ogni volta che viene attivata, accoda un lavoro.
- La pianificazione ha 5 campi (
min hour day month weekday) o 6 campi (sec min hour day month weekday). Una pianificazione a 5 campi ottiene0secondi in anticipo:*/1 * * * *viene memorizzato come0 */1 * * * *. - Alias come
@dailyvengono rifiutati con un400che indica il formato previsto. - Gli orari sono in UTC.
last_runenext_runsononullfino alla prima cottura. In un'esecuzione reale, una pianificazione creata alle 15:40 è stata attivata alle 15:41:00 e quindi ha mostratonext_run15:42:00.- Il payload viene bloccato quando crei la voce.
- L'eliminazione di un nome sconosciuto restituisce
404. L'eliminazione di una voce cron ne impedisce anche l'attivazione. - L'SDK non ha
getCronJoboupdateCronJob: elimina la voce e creala di nuovo.
Per il lavoro puramente di database, l'estensione Postgres pg_cron evita il viaggio di andata e ritorno verso una funzione: vedere la pagina Cron.