Best Practices für Wiederholungsversuche und Prüfpunkte

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.

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 oder pi-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