5
2

More than 3 years have passed since last update.

Node.jsのCloud Tasksクライアントでタスク作成をリトライする

Last updated at Posted at 2019-10-31

Node.jsのCloud Tasksクライアントを使っていると、たまにgRPCのエラーでタスクの作成に失敗することがありました。リトライのための設定がややわかりにくかったので、リトライする方法をまとめておきます。

バージョン

  • @google-cloud/tasks: 1.5.1
  • google-gax: 1.7.5

設定方法

ドキュメントにあるように、 CloudTasksClient.createTask() の第2引数に CallOptions を渡すとリトライなどの設定を行えます。具体的な設定例は次の通りです。

const client = new CloudTasksClient();

const request = {
  parent: client.queuePath(project, location, queue),
  task: {
    appEngineHttpRequest: {
      httpMethod: "POST",
      relativeUri: "/log_payload"
    }
  }
};

const options = {
  retry: {
    retryCodes: [
      13 // INTERNAL
    ], // リトライ対象のエラーコードを1つ以上指定する
    backoffSettings: {
      initialRetryDelayMillis: 100, // 最初のリトライ間隔(ミリ秒)
      retryDelayMultiplier: 1.3, // リトライ間隔の増加率
      maxRetryDelayMillis: 60000, // リトライ間隔の最大値
      initialRpcTimeoutMillis: 20000, // 最初のタイムアウト(ミリ秒)
      rpcTimeoutMultiplier: 1, // タイムアウトの増加率
      maxRpcTimeoutMillis: 20000, // タイムアウトの最大値
      totalTimeoutMillis: 600000 // 全体のタイムアウト(ミリ秒)
    }
  }
};

const [response] = await client.createTask(request, options);

retry.retryCodes に1つ以上のエラーコードを指定しないとリトライされません。エラーコードは実際にタスク作成に失敗したときの例外に code として含まれています。一覧はgoogle-gaxのソースコードで確認できます。

retry.backoffSettings に書いているのは、createTask()の第2引数を指定しなかった場合に使われるデフォルト値です。ドキュメントに記載がなかったので、デバッグ実行して確認しました。このデフォルト値は設定ファイルから生成されているようです。

終わりに

ちゃんとコードを読んだわけではないですが、タスクの作成は冪等な処理ではないので、安全側に倒して自動リトライしないのだと思われます。リトライする場合には、同じタスクが2個作られてしまっても問題ないような実装にするよう気をつけましょう。

5
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
5
2