GAE/Go TaskQueue の max_doublings について

なんかググってもあんまり出てこなかったので、自分用メモ。

TaskQueue のリトライは queue.yaml で設定する。

以下のように設定すると、

task_retry_limit: 5
min_backoff_seconds: 10
max_backoff_seconds: 40

リトライ間隔は 10s -> 20s -> 30s -> 40s -> 40s のようになり、合計で5回リトライする。
min_backoff_seconds で設定した値が待機秒数に加算されるが、
最大でも max_backoff_seconds までしか増えない。
なので、5 回目は 50s になることなく、40s でリトライしている。

【追記】
上記の挙動は間違っていました。
max_doublings を指定しない場合は
10s -> 20s -> 40s -> 40s -> 40s
ように常に加算される待機秒数を2倍にして動作します。

待機秒数を大きく設定した場合、
待機秒数が2倍になっていくと値が大きくなりすぎて都合が悪いことがあるので、
max_doublings で制御する感じなんだと思います。
【追記終わり】

max_doublings では「加算される待機秒数を2倍にする回数」を設定することができる。

例えば、以下のように max_doublings = 3 に設定すると、

task_retry_limit: 7
min_backoff_seconds: 10
max_backoff_seconds: 500
max_doublings: 3

10s -> 20s -> 40s -> 80s -> 160s -> 240s -> 320s のように7回リトライする。

max_doublings = 3 によって、
最初の3回だけ待機秒数が2倍で増えるので、
4回目のリトライ間隔は 80s になる。
それ以降は2倍にならず、直近のリトライ間隔である 80s を加算していき、
最後の7回目のリトライでは 320s になる。

これは Exponential backoff というアルゴリズムらしい。
http://yoshidashingo.hatenablog.com/entry/2014/08/17/135017