notebook

都内でWEB系エンジニアやってます。

CloudTasksの再試行設定覚書

公式ドキュメントを読んでもあんまりピンとこなかったので実際に動かしてみて感覚をつかむ

適当な関数を用意してcreate-http-taskでタスクを生成しCloudTasksのログから再実行の間隔を見る

再試行設定

CloudTasksでは指数関数的に再試行間隔が増加していくが細かい調整の設定を行うことができる

ドキュメントからたどっていくとAPIリファレンスにたどり着く

REST Resource: projects.locations.queues  |  Cloud Tasks のドキュメント

cloud.google.com

更にその中でどういう意味かみたいな話はこちらへどうぞとAppEngineのqueue.yamlのリトライ設定の箇所に飛ばされる

queue.yaml リファレンス  |  Python 2 の App Engine スタンダード環境  |  Google Cloud

cloud.google.com

こんな感じかな

項目
maxAttempts 最大施行回数
maxRetryDuration 初回実行からの最大間隔
minBackoff 最小の施行間隔
maxBackoff 最大の施行間隔
maxDoublings 何回まで指数関数的に再試行間隔を伸ばしていくか

実際に試してみる

項目
maxAttempts 10
maxRetryDuration
minBackoff 10
maxBackoff 10240
maxDoublings 4
  • 再試行間隔と施行間隔の増加分
10.0
20.0
40.0
81.0
160.0
320.0 + 160
480.0 + 160
640.0 + 160
800.0 + 160

試行間隔は5回(maxDoublings)までは倍々、それ移行は以前の差分を足していくように増えていく

項目
maxAttempts 10
maxRetryDuration
minBackoff 10
maxBackoff 10240
maxDoublings 3
  • 再試行間隔と施行間隔の増加分
11.0
20.0
40.0
80.0
160.0 + 80
240.0 + 80
321.0 + 80
400.0 + 80
480.0 + 80

試行間隔は3回(maxDoublings)までは倍々、それ移行は以前の差分を足していくように増えていく

項目
maxAttempts 10
maxRetryDuration
minBackoff 10
maxBackoff 50
maxDoublings 3
  • 再試行間隔
10.0
21.0
40.0
50.0
50.0
50.0
50.0
50.0
50.0

maxBackoffが50なので50以上は施行間隔が増えない

maxRetryDurationとmaxAttemptsどちらが優先されるのか

maxAttemptsmaxRetryDuration両方の設定が満たされるまで再試行が続く

とあったので試してみる

項目
maxAttempts 10
maxRetryDuration 200
minBackoff 10
maxBackoff 50
maxDoublings 3
  • 再試行間隔と総待機時間
10.0 10
20.0 30
40.0 70
50.0 120
50.0 170
50.0 220
50.0 270
50.0 320
50.0 370

先にmaxRetryDurationの設定値を超えてしまったがmaxAttemptsが10なので10回施行されるまでは再試行が続く

項目
maxAttempts 3
maxRetryDuration 200
minBackoff 10
maxBackoff 50
maxDoublings 3
  • 再試行間隔と総待機時間
10.0 10
20.0 30
40.0 70
50.0 120
50.0 170
50.0 220 この時点で超えたのでここで打ち止め

maxAttempsが3なので先に閾値を超えるがmaxRetryDurationが200なので総待機時間が200秒を超えるまでは再試行が続く

maxAttemptsとmaxRetryDurationは両方満たされるまで再実行されることが確認できた

所感

maxAttemptsは試行回数なので初回の施行も含まれるよう、なのでそれを踏まえて設定を書く必要がある

ドキュメント読んだだけだとあんまり良くわからなかったが試してみたらだいぶイメージが湧いた