引き続き aws-sdk-go ネタです。
AWS APIのエラー時の再試行には、exponential backoff しなさいと書かれてまして、
goで exponential backoffしてみます。
exponential backoff とは?
再試行時のwait間隔を徐々に(指数関数的に)伸ばす処理のことです。
exponential backoff についてはこちらにわかりやすい説明があります。
goでexponential backoff するパッケージ
https://github.com/cenkalti/backoff
これを使います。
s3.PutObjectのサンプルの PutObjectを exponential backoff化すると以下のような感じ
var res *s3.PutObjectOutput
err = backoff.Retry(func() error {
res, err = S3.PutObject(&req)
return err
}, backoff.NewExponentialBackOff())
if err != nil {
log.Printf("err:%s", res, err)
}
log.Printf("res:%s", res)
エラーの種類を問わず再試行を繰り返してしまうようなかなりの手抜きですが、
こんな感じで簡単に使えます。
ちなみに、aws-sdk-go のdevelopブランチでは、標準でretry機能が実装されているっぽいです。