ジョブの再試行とチェックポイントのベスト プラクティス

個々のジョブタスクやジョブ実行はさまざまな理由で失敗します。このページでは、タスクの再起動とジョブのチェックポイントを中心に、これらのエラーを処理するためのベスト プラクティスについて説明します。

タスクの再試行を使用する

個々のジョブタスクは、アプリケーションの依存関係、割り当て、内部システム イベントに関する問題など、さまざまな理由で失敗する可能性があります。多くの場合、このような問題は一時的なもので、再試行するとタスクは成功します。

デフォルトでは、各タスクは最大 3 回自動的に再試行されます。これにより、一時的なタスク障害が発生しても、ジョブが確実に完了します。再試行の最大回数をカスタマイズすることもできます。ただし、デフォルトを変更する場合は、少なくとも 1 回の再試行を指定する必要があります。

ジョブタスクの再起動を計画する

タスクの再起動で出力が重複したり、破損しないように、ジョブをべき等にします。つまり、反復入力の回数やタイミングに関係なく、特定の入力セットに対して同じ動作を行う反復可能なロジックを記述します。

入力データは変更せずに、入力データと別の場所に出力を書き込みます。そうすることで、ジョブを再度実行するときに、ジョブを最初からやり直して同じ結果を得ることができます。

同じ固有識別子を再利用するか、出力がすでに存在するかどうか確認することで、出力データの重複を避けることができます。重複データは、コレクション レベルのデータの破損を表します。

チェックポイントを設定する

ジョブにチェックポイントを設定することで、障害発生後にタスクが再開したときに、タスクを最初からではなく、中断したところから再開できます。これにより、ジョブが高速化されるだけでなく、不要なコストを最小限に抑えることができます。

結果の一部を定期的に書き込み、Cloud Storage やデータベースなどの永続ストレージ ロケーションに対する進行状況を確認します。タスクを開始するときに、起動時の結果の一部を確認します。結果の一部が見つかった場合は、その続きから処理を開始します。

ジョブがチェックポインティングに適していない場合は、ジョブを小さなチャンクに分割して、より多くのタスクを実行することを検討してください。

チェックポイントの例 1: Pi を計算する

再帰的アルゴリズム(円周率を小数点以下まで計算するなど)を実行し、並列処理の値を 1 に設定したジョブがあるとします。

  • 10 分ごと、または失われる作業許の容範囲内で、進捗状況を pi-progress.txt Cloud Storage オブジェクトに書き込みます。
  • タスクが開始したら、pi-progress.txt オブジェクトをクエリして、その値を出発点として読み込みます。この値は、関数の最初の入力として使用します。
  • 最終結果を pi-complete.txt というオブジェクトとして Cloud Storage に書き込み、並列実行や繰り返し実行による重複を回避します。また、完了日で区別するために pi-complete-DATE.txt を使用します。

チェックポイントの例 2: Cloud SQL の 10,000 件のレコードを処理する

Cloud SQL などのリレーショナル データベースで 10,000 件のレコードを処理するジョブがあるとします。

  • SELECT * FROM example_table LIMIT 10000 などの SQL クエリで処理するレコードを取得します。
  • 更新されたレコードを 100 個のバッチで書き出します。これにより、中断しても重要な処理が失われることはありません。
  • レコードが書き込まれたら、どのレコードが処理されたかをメモします。処理が確認された場合にのみ、1 に設定されたブール値の列をテーブルに追加できます。
  • タスクの開始時に、処理するアイテムを取得するクエリを実行すると、処理された条件が 0 になっているはずです。
  • この手法では、クリーンな再試行だけでなく、クエリを分割して小さなタスクに分割することもできます。たとえば、クエリを変更して一度に 100 件のレコード(LIMIT 100 OFFSET $CLOUD_RUN_TASK_INDEX*100)を選択し、100 件のタスクを実行して 10,000 件のすべてのレコードを処理します。CLOUD_RUN_TASK_INDEX は、Cloud Run ジョブを実行するコンテナ内に存在する組み込み環境変数です。

これらの要素をすべて組み合わせると、最終的なクエリは次のようになります。 SELECT * FROM example_table WHERE processed = 0 LIMIT 100 OFFSET $CLOUD_RUN_TASK_INDEX*100

次のステップ