Aurabase-Logo
AurabasisDokumente
Dokumente›Edge Functions›Jobs, cron and the DLQ

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?

9 Min. gelesen·Ebene Mittelstufe·Überarbeitet am 12.10.2026
Dieser englische Text wurde automatisch aus dem französischen Original generiert und wurde noch nicht überprüft.
Diese Seite wurde automatisch übersetzt. Maßgeblich ist die englische Version.
#
In die Warteschlange stellen

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.

server/enqueue.tstypescript
import { createClient } from '@aurabase/aurabase-js'

const admin = createClient(process.env.AURA_URL!, process.env.AURA_SERVICE_ROLE_KEY!)

const { data: job, error } = await admin.functions.enqueueJob('send-report', {
  payload: { month: '2026-10' },
  delaySecs: 60,   // Warten Sie 60 Sekunden vor dem ersten Versuch
  maxAttempts: 3,  // die Standardeinstellung
})
OptionStandardBedeutung
payloadnullJSON, das der Funktion als Anforderungstext übergeben wird
delaySecs0Sekunden Wartezeit bis zum ersten Versuch. Der Job bleibt bis dahin pending.
maxAttempts3Gesamtzahl 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.

Jobs sind ein serverseitiges Tool

enqueueJob, getJob und listJobs benötigen einen service_role-Schlüssel. Ein öffentlicher Schlüssel erhält 403.

#
Handler

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:

TeilWert
MethodeJOB (nicht POST)
Pfad/jobs/<job id>
KörperDer Job ist payload als JSON
IdentitätsheaderKeine: x-aura-role und x-aura-user-id fehlen
aurabase/functions/send-report/index.tstypescript
Deno.serve(async (req) => {
  const jobId = new URL(req.url).pathname.split('/').pop()
  const { month } = await req.json()
  // …den Bericht erstellen und senden, wobei jobId als Idempotenzschlüssel verwendet wird
  return new Response('ok')
})

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.

#
Wiederholungen

3. Lebenszyklus und Wiederholungsversuche

statusestext
pending ──claimed──▶ running ──▶ completed
   ▲                    │
   └── after 5 s ◀── failed (attempts left)
                        └──▶ dead (no attempts left)
  • 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 maxAttempts erreicht ist. Der Job ist dann dead. 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 running ist, wird vom Dienst zurückgefordert.
  • Abgeschlossene Aufträge werden standardmäßig 14 Tage lang aufbewahrt.
Ein HTTP-Fehler Ihrer Funktion ist kein Fehler

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.

#
Erholung

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.

terminalbash
# Listen Sie tote Jobs auf
curl "$AURA_URL/v1/functions/jobs/dlq" -H "apikey: $AURA_SERVICE_ROLE_KEY"

# Versuchen Sie es erneut mit einem Job
curl -X POST "$AURA_URL/v1/functions/jobs/$JOB_ID/retry" -H "apikey: $AURA_SERVICE_ROLE_KEY"

# Wiederholen Sie jeden toten Job (bis zu 1000)
curl -X POST "$AURA_URL/v1/functions/jobs/dlq/requeue" -H "apikey: $AURA_SERVICE_ROLE_KEY"
# → {"data":{"requeued":1},"meta":null}

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.

#
Zeitplan

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.

server/cron.tstypescript
await admin.functions.createCronJob('nightly-cleanup', '0 3 * * *', 'cleanup', {
  payload: { dryRun: false },
})

const { data: crons } = await admin.functions.listCronJobs()
await admin.functions.deleteCronJob('nightly-cleanup') // nach NAME, nicht nach ID
  • 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ält 0 Sekunden vor: */1 * * * * wird als 0 */1 * * * * gespeichert.
  • Aliase wie @daily werden mit einem 400 abgelehnt, das das erwartete Format angibt.
  • Die Zeiten sind in UTC angegeben.
  • last_run und next_run sind bis zur ersten Zündung null. In einem echten Lauf wurde ein um 15:40 Uhr erstellter Zeitplan um 15:41:00 Uhr ausgelöst und zeigte dann next_run 15:42:00 Uhr an.
  • Die Nutzdaten werden eingefroren, wenn Sie den Eintrag erstellen.
  • Das Löschen eines unbekannten Namens gibt 404 zurück. Das Löschen eines Cron-Eintrags verhindert auch, dass er ausgelöst wird.
  • Das SDK hat kein getCronJob oder updateCronJob: 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.

Zuletzt aktualisiert · 12.10.2026