Node.jsのCloud Tasksクライアントを使っていると、たまにgRPCのエラーでタスクの作成に失敗することがありました。リトライのための設定がややわかりにくかったので、リトライする方法を解説します。
バージョン
- @google-cloud/tasks: 1.5.1
- google-gax: 1.7.5
設定方法
ドキュメントにあるように、 CloudTasksClient.createTask()
の第2引数に CallOptionsを渡すとリトライなどの設定を行えます。具体的な設定例は次の通りです。
constclient=newCloudTasksClient();constrequest={parent:client.queuePath(project,location,queue),task:{appEngineHttpRequest:{httpMethod:"POST",relativeUri:"/log_payload"}}};constoptions={retry:{retryCodes:[13// INTERNAL],// リトライ対象のエラーコードを1つ以上指定するbackoffSettings:{initialRetryDelayMillis:100,// 最初のリトライ間隔(ミリ秒)retryDelayMultiplier:1.3,// リトライ間隔の増加率maxRetryDelayMillis:60000,// リトライ間隔の最大値initialRpcTimeoutMillis:20000,// 最初のタイムアウト(ミリ秒)rpcTimeoutMultiplier:1,// タイムアウトの増加率maxRpcTimeoutMillis:20000,// タイムアウトの最大値totalTimeoutMillis:600000// 全体のタイムアウト(ミリ秒)}}};const[response]=awaitclient.createTask(request,options);
retry.retryCodes
に1つ以上のエラーコードを指定しないとリトライされません。エラーコードは実際にタスク作成に失敗したときの例外に code
として含まれています。一覧はgoogle-gaxのソースコードで確認できます。
retry.backoffSettings
に書いているのは、createTask()
の第2引数を指定しなかった場合に使われるデフォルト値です。ドキュメントに記載がなかったので、デバッグ実行して確認しました。このデフォルト値は設定ファイルから生成されているようです。
終わりに
ちゃんとコードを読んだわけではないですが、タスクの作成は冪等な処理ではないので、安全側に倒して自動リトライしないのだと思われます。リトライする場合には、同じタスクが2個作られてしまっても問題ないような実装にするよう気をつけましょう。