Go版retriable作った

Rubyretirable の Go版を書いた。

github.com

使い方

一番シンプルな使い方。引数として渡されたクロージャが成功するまでリトライし続ける。 リトライ回数のデフォルトは3で、リトライ間隔は randomized exponential backoff アルゴリズムを使っている。簡単に言うと、CSMA/CD みたいにコリジョン(失敗)すると次に実行するまでの時間が徐々に長くなっていくアルゴリズム(をちょっと変形させたやつで、元ネタはここらしい google-http-java-client )。

retriable.Retry(func() error {
    // your code
    return nil
})

リトライ回数を変更したい場合は Options を使う。 リトライ回数を5、最初のリトライ間隔を1秒に設定した例。

opt := retriable.Options{
  retries:  5,
  interval: 1 * time.Second,
}

retriable.RetryWithOptions(func() error {
  // your code
  return nil
}, opt)

処理全体にタイムアウトを設定することも出来る。 RetryWithOptionsに渡されたクロージャが5秒以上かかった場合にリトライするのをやめて、処理を返えす。

opt := retriable.Options{
    timeout: 5 * time.Second,
}

retriable.RetryWithOptions(func() error {
    // your code
    return nil
}, opt)

リトライ間隔がexponentialに増加するのではなく、一定にしたい場合はbackoffをConstantBackoffに変更する。

opt := retriable.Options{
    backoff: backoff.NewConstantBackOff(1 * time.Second),
}

retriable.RetryWithOptions(func() error {
    // your code
    return nil
}, opt)

まとめ

ご意見があればぜひ