Goで指数バックオフとジッターを実装してみる

指数バックオフ(Exponential backoff)

リクエストの遅延を乗算的に増加させる(リトライ間隔を遅延させていく)形で失敗したリクエストを定期的に再試行(リトライ)する手法。

ex. 1回目のリトライは1秒後、2回目は2秒後、3回目は4秒後、4回目は8秒後...

リトライ設計においては、バックオフのみに依存するのではなく、リトライ上限やタイムアウト(接続タイムアウトとリクエストタイムアウト)も考慮する必要がある。

ジッター

指数バックオフのリトライ間隔にランダムな値を加えることで、同時に失敗したリクエストが同時に再試行するのを防ぐ手法。

単純な指数的間隔だとリトライ間隔が同じになってしまうため、時間的ゆらぎを持たせるために導入される。

指数バックオフとジッターの実装

簡易的に実装するとしたらこんな感じだろうか。

ジッターのアルゴリズムは下記記事を参考にしたが、ちゃんと正しく反映できているかちょっと自信がない。ファジーなのでロジックに考慮漏れがある。 cf. aws.amazon.com - Exponential Backoff And Jitter

所感

実装雑にしてしまったが雰囲気はわかった!

参考