Einzelne Jobaufgaben oder sogar Jobausführungen können aus verschiedenen Gründen fehlschlagen. Diese Seite enthält Best Practices zum Umgang mit diesen Fehlern, rund um Aufgabenneustarts und Jobprüfpunktausführung.
Wiederholungsversuche für Aufgaben verwenden
Einzelne Jobaufgaben können aus verschiedenen Gründen fehlschlagen, z. B. aufgrund von Problemen mit Anwendungsabhängigkeiten, Kontingenten oder sogar internen Systemereignissen. Oft sind solche Probleme vorübergehend und die Aufgabe wird nach einem erneuten Versuch erfolgreich ausgeführt.
Standardmäßig wird jeder Vorgang automatisch bis zu dreimal wiederholt. So wird sichergestellt, dass ein Job auch dann abgeschlossen wird, wenn vorübergehende Aufgabenfehler auftreten. Sie können auch die maximale Anzahl von Wiederholungen anpassen. Wenn Sie die Standardeinstellung jedoch ändern, sollten Sie mindestens einen Wiederholungsversuch angeben.
Neustarts von Jobaufgaben planen
Jobs idempotent machen, damit der Neustart einer Aufgabe nicht zu beschädigten oder doppelten Ausgaben führt. Das heißt, wiederholbare Logik schreiben, die für ein bestimmtes Set von Eingaben das gleiche Verhalten hat, unabhängig davon, wie oft sie wiederholt werden oder wann sie ausgeführt wird.
Schreiben Sie Ihre Ausgabe an einen anderen Ort als die Eingabedaten, sodass die Eingabedaten intakt bleiben. Auf diese Weise kann der Job von Anfang an wiederholt werden und dasselbe Ergebnis erhalten, wenn der Job noch einmal ausgeführt wird.
Duplizieren Sie nicht die Ausgabedaten, indem Sie dieselbe eindeutige Kennzeichnung wiederverwenden oder prüfen, ob die Ausgabe bereits vorhanden ist. Doppelte Daten stellen eine Datenbeschädigung auf Sammlungsebene dar.
Prüfpunktausführung verwenden
Prüfen Sie Ihre Jobs nach Möglichkeit, damit Aufgaben, die nach einem Fehler neu gestartet werden, an der Stelle fortgesetzt werden können, an der sie unterbrochen wurden, anstatt die Arbeit am Anfang neu zu starten. Dadurch werden Ihre Jobs beschleunigt und unnötige Kosten werden minimiert.
Schreiben Sie regelmäßig Teilergebnisse und geben Sie Hinweise auf den Fortschritt an einem nichtflüchtigen Speicherort wie Cloud Storage oder einer Datenbank. Suchen Sie nach dem Start der Aufgabe nach Teilergebnissen. Wenn Teilergebnisse gefunden werden, beginnen Sie mit der Verarbeitung an der Stelle, an der sie unterbrochen wurden.
Wenn sich Ihr Job nicht für die Prüfpunktausführung eignet, sollten Sie ihn in kleinere Blöcke aufteilen und eine größere Anzahl von Aufgaben ausführen.
Prüfpunktbeispiel 1: Pi berechnen
Wenn Sie einen Job haben, der einen rekursiven Algorithmus ausführt, z. B. die Berechnung von Pi auf viele Dezimalstellen und eine Parallelität, die auf den Wert 1 festgelegt ist, gilt:
- Schreiben Sie Ihren Fortschritt alle 10 Minuten oder, wenn die Toleranz Ihrer Arbeit zulässt, in ein
pi-progress.txt
-Cloud Storage-Objekt. - Wenn eine Aufgabe gestartet wird, fragen Sie das
pi-progress.txt
-Objekt ab und laden den Wert als Ausgangspunkt. Verwenden Sie diesen Wert als anfängliche Eingabe für Ihre Funktion. - Schreiben Sie das Endergebnis in Cloud Storage als Objekt mit dem Namen
pi-complete.txt
, um eine Duplizierung durch parallele oder wiederholte Ausführung oderpi-complete-DATE.txt
zur Unterscheidung nach Abschlussdatum zu vermeiden.
Prüfpunktbeispiel 2: 10.000 Einträge aus Cloud SQL verarbeiten
Wenn Sie einen Job haben, der 10.000 Einträge in einer relationalen Datenbank wie Cloud SQL verarbeitet, gilt Folgendes:
- Datensätze abrufen, die mit einer SQL-Abfrage wie
SELECT * FROM example_table LIMIT 10000
verarbeitet werden sollen - Schreiben Sie aktualisierte Datensätze in Batches mit 100 Schritten, damit wichtige Unterbrechungen bei der Unterbrechung nicht verloren gehen.
- Notieren Sie beim Schreiben von Datensätzen, welche verarbeitet wurden. Sie können der Tabelle eine boolesche Spalte hinzufügen, die nur auf 1 gesetzt ist, wenn die Verarbeitung bestätigt wurde.
- Wenn eine Aufgabe gestartet wird, sollte die Abfrage, die zum Abrufen von Elementen für die Verarbeitung verwendet wird, die verarbeitete Bedingung = 0 hinzufügen.
- Zusätzlich zu sauberen Wiederholungsversuchen kann dieses Verfahren auch die Arbeit in kleinere Aufgaben aufteilen, z. B. indem Ihre Abfrage so geändert wird, dass 100 Einträge gleichzeitig ausgewählt sind:
LIMIT 100 OFFSET $CLOUD_RUN_TASK_INDEX*100
und 100 Aufgaben werden ausgeführt, um alle 10.000 Rekorder zu verarbeiten.CLOUD_RUN_TASK_INDEX
ist eine integrierte Umgebungsvariable, die in dem Container vorhanden ist, in dem Cloud Run-Jobs ausgeführt werden.
All dies zusammen betrachtet könnte die endgültige Abfrage so aussehen: SELECT * FROM example_table WHERE processed = 0 LIMIT 100 OFFSET $CLOUD_RUN_TASK_INDEX*100
Nächste Schritte
- Informationen zum Erstellen eines Cloud Run-Jobs finden Sie unter Jobs erstellen.
- Informationen zum Ausführen eines Jobs finden Sie unter Jobs ausführen.
- Informationen zum Ausführen eines Jobs nach einem Zeitplan finden Sie unter Jobs nach einem Zeitplan ausführen.