Jobs, Cron und die Warteschlange für unzustellbare Nachrichten
So führen Sie Arbeit außerhalb einer Anfrage aus: Was ist ein Job, wie wird er wiederholt, wie erstellt Cron Jobs und was ist mit den Jobs zu tun, die am Ende tot sind?
1. Stellen Sie einen Job in die Warteschlange
Ein Job ist ein Hintergrundaufruf einer Funktion. Stellen Sie es mit einem service_role-Schlüssel von einem Server in die Warteschlange.
| Option | Standard | Bedeutung |
|---|---|---|
payload | null | JSON, das der Funktion als Anforderungstext übergeben wird |
delaySecs | 0 | Sekunden Wartezeit bis zum ersten Versuch. Der Job bleibt bis dahin pending. |
maxAttempts | 3 | Gesamtzahl der Versuche, einschließlich des ersten |
Sie lesen einen Job mit getJob(id) oder listJobs({ status, limit }) zurück (limit liegt zwischen 1 und 500, Standard 50). Der Job hat ein status, attempts, max_attempts, error und die Daten scheduled_at, started_at, completed_at.
enqueueJob, getJob und listJobs benötigen einen service_role-Schlüssel. Ein öffentlicher Schlüssel erhält 403.
2. Was Ihre Funktion erhält
Ein Job ruft Ihre Funktion wie jede andere Anfrage auf, mit drei Unterschieden, die Sie berücksichtigen müssen:
| Teil | Wert |
|---|---|
| Methode | JOB (nicht POST) |
| Pfad | /jobs/<job id> |
| Körper | Der Job ist payload als JSON |
| Identitätsheader | Keine: x-aura-role und x-aura-user-id fehlen |
Ein echter Anruf wurde protokolliert {"method":"JOB","path":"/jobs/d443d541-…","role":null,"userId":null,"body":"{\"items\":[\"a\",\"b\"],\"order\":42}"}.
Ein Job wird ohne Benutzer ausgeführt: Verlassen Sie sich nicht auf x-aura-user-id. Wenn das Werk einem Benutzer gehört, geben Sie die Benutzer-ID in die Nutzlast ein.
3. Lebenszyklus und Wiederholungsversuche
- Ein Job wird mindestens einmal ausgeführt. Sie kann zweimal ausgeführt werden, wenn ein Worker während der Ausführung stoppt. Machen Sie die Funktion daher idempotent.
- Ein fehlgeschlagener Versuch wird nach einer festen Verzögerung von 5 Sekunden wiederholt, bis
maxAttemptserreicht ist. Der Job ist danndead. Die Verzögerung und die Standardversuchsanzahl sind Diensteinstellungen (JOB_RETRY_DELAY_SECS,JOB_MAX_RETRIES). - Ein Job, der nach seiner Lease (standardmäßig 450 Sekunden) immer noch
runningist, wird vom Dienst zurückgefordert. - Abgeschlossene Aufträge werden standardmäßig 14 Tage lang aufbewahrt.
Ein Job ist completed, sobald Ihre Funktion antwortet, unabhängig vom Statuscode. In einer echten Ausführung erzeugte eine Funktion, die 500 zurückgab, nach einem Versuch einen completed-Job und wurde nie wiederholt.
Ein Auftrag schlägt fehl und wird nur dann wiederholt, wenn der Aufruf selbst fehlschlägt: Die Funktion ist nicht vorhanden oder inaktiv, die Laufzeit ist nicht erreichbar oder der Aufruf läuft ab. Wenn Sie einen erneuten Versuch wünschen, wenn Ihr eigener Code einen Fehler erkennt, stellen Sie einen neuen Job vom Handler in die Warteschlange (mit delaySecs für einen Backoff), anstatt sich auf den Statuscode zu verlassen.
Im selben realen Lauf durchlief ein Job für eine Funktion, die nicht existiert, diese Sequenz: Versuch 1 schlug nach 3 s mit Fonction 'ghost' introuvable fehl, Versuch 2 schlug nach etwa 9 s fehl und der Job wurde zu dead mit attempts gleich max_attempts.
4. Die Warteschlange für unzustellbare Nachrichten
Abgebrochene Jobs bleiben in der Warteschlange und können aufgelistet und erneut versucht werden. Für diese Routen gibt es noch keine SDK-Methode: Verwenden Sie HTTP mit einem service_role-Schlüssel.
Bei einem erneuten Versuch wird der Auftrag auf pending zurückgesetzt, ohne dass sein Versuchszähler zurückgesetzt wird. Er erhält also genau einen weiteren Versuch und kehrt zu dead zurück, wenn er erneut fehlschlägt. Beheben Sie die Ursache (stellen Sie beispielsweise die fehlende Funktion bereit), bevor Sie es erneut versuchen.
5. Planen Sie mit Cron
Ein Cron-Eintrag ruft nicht die Funktion selbst auf: Bei jedem Auslösen wird ein Job in die Warteschlange gestellt.
- Der Zeitplan hat 5 Felder (
min hour day month weekday) oder 6 Felder (sec min hour day month weekday). Ein Zeitplan mit 5 Feldern erhält0Sekunden vor:*/1 * * * *wird als0 */1 * * * *gespeichert. - Aliase wie
@dailywerden mit einem400abgelehnt, das das erwartete Format angibt. - Die Zeiten sind in UTC angegeben.
last_runundnext_runsind bis zur ersten Zündungnull. In einem echten Lauf wurde ein um 15:40 Uhr erstellter Zeitplan um 15:41:00 Uhr ausgelöst und zeigte dannnext_run15:42:00 Uhr an.- Die Nutzdaten werden eingefroren, wenn Sie den Eintrag erstellen.
- Das Löschen eines unbekannten Namens gibt
404zurück. Das Löschen eines Cron-Eintrags verhindert auch, dass er ausgelöst wird. - Das SDK hat kein
getCronJoboderupdateCronJob: Löschen Sie den Eintrag und erstellen Sie ihn erneut.
Für reine Datenbankarbeit vermeidet die Erweiterung Postgres pg_cron den Roundtrip zu einer Funktion: siehe Seite Cron.