3
2

More than 1 year has passed since last update.

Cloud Run jobsでのtimeout回避のために分割処理をする

Last updated at Posted at 2022-12-15

はじめに

これはno plan inc.の Advent Calendar 2022の15日目の記事です。

cloud run jobsではタスク1つあたりの実行時間の上限が1時間になっており、これを超えるような処理を行うにはタスクを分割する必要がある。
ここでは例として1000万以下の素数を求めるプログラムを100分割して5個並列に処理する。

目次

  1. ジョブで利用できる環境変数
  2. ジョブの設定
  3. コード

ジョブで利用できる環境変数

cloud run jobでは以下の環境変数が利用できる。

名前 説明
CLOUD_RUN_JOB 実行されている Cloud Run ジョブの名前。 hello-world
CLOUD_RUN_EXECUTION 実行されている Cloud Run 実行の名前。 hello-world-abc
CLOUD_RUN_TASK_INDEX タスクごとに、0 から「タスク数 - 1」までの一意の値が設定されます。 0
CLOUD_RUN_TASK_ATTEMPT このタスクが再試行された回数。最初の試行は 0 から始まり、再試行の最大回数まで、続けて再試行するたびに 1 ずつ増加します。 0
CLOUD_RUN_TASK_COUNT --tasks パラメータで定義されたタスクの数。 1

今回はCLOUD_RUN_TASK_INDEXとCLOUD_RUN_TASK_COUNTを利用する。

ジョブの設定

以下の画像のように設定する。
スクリーンショット 2022-12-13 14.25.43.png

コード

以下のコードをデプロイし実行すると1000万以下の素数を表示する。

example.ts
export class PrimeNumber {
  main(): void {
    //jobの環境変数
    const taskIndex = Number(process.env.CLOUD_RUN_TASK_INDEX);
    const taskCount = Number(process.env.CLOUD_RUN_TASK_COUNT);

    //タスク1つ当たりの素数を求める範囲
    const numPerTask = 10000000 / taskCount;
    //そのタスクでstartNum以上、endNum以下の素数を求める
    let startNum = numPerTask * taskIndex + 1;
    const endNum = numPerTask * (taskIndex + 1);

    //素数を求めるロジック
    for (; startNum <= endNum; startNum++) {
      let divisor = 0;

      for (let i = 1; i <= startNum; i++) {
        if (startNum % i == 0) divisor++;
      }

      if (divisor == 2) console.log(startNum);
    }
  }
}

const primeNumber = new PrimeNumber();

primeNumber.main();

参考文献

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2