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個作られてしまっても問題ないような実装にするよう気をつけましょう。