[JP] go-retry - Go で処理を途中에서 리트라이데 나무루팍케이지を作った

7732 단어 opensourceshowdevgo
この記事は2021年11月に zenn.dev で公開されたものです.

なぜ作たのか



通信処理やInstorl処理など, 一連の処理を Step by step に実行してstep毎にritraiさせることがあったので、その実装をパッケージとして切り出してみました.

https://github.com/kenkyu392/go-retry

最初 最初 とりあえず は が が キャンセル さ れる れる まで リトライ リトライ する する の の 実装 実装 でし た が が 、 、 さすが 現在 現在 は Exponential Backoff や 最大 リトライ 回数 回数 など など 限 限 な もの を 実装 し し て い ます ます.. 必要 必要

使い方



使い方は retry.DoWithContext にrittrai間隔を設定する retry.DurationFunc を設定し、あとは実行したい処理をstep毎に関数化して渡すだけです.

package main

import (
    "context"
    "log"

    "github.com/kenkyu392/go-retry"
)

func main() {
    // キャンセル用にコンテキストを用意する。
    ctx, cancel := context.WithCancel(context.Background())
    defer cancel()

    // 処理を実行する。
    errs := retry.DoWithContext(ctx,
        // Exponential Backoff を行いながら 5 回リトライする。
        retry.ExponentialBackoff(5),
        // 実行したい処理をステップ毎に関数に分離して渡す。
        func(ctx context.Context) error {
            // リトライ不可能な何かが発生した場合は
            // retry.Canceled で処理をキャンセルする。
            if failed {
                return retry.Canceled
            }
            return nil
        },
        // 前のステップが成功したら次のステップに進む。
        func(ctx context.Context) error {
            return nil
        },
    )

    // 実行中に発生したエラーを全て確認する。
    for _, err := range errs {
        log.Print(err)
    }
}


지수 백오프는?



簡単に説明すると、処理の失敗回数に合わせてリトライ間隔を指数関数的に長くするアルゴリズムです.リトライ間隔を長くすることの必要性などは詳しく調べると良い説明が出てくると思いますが、用途としては「処理の衝突を避けるため」나 「負荷を軽減するため」に実装する ことが多いと思います.

https://cloud.google.com/iot/docs/how-tos/exponential-backoff

https://docs.aws.amazon.com/general/latest/gr/api-retries.html

리트라이間隔の調整



ritライ間隔の調整には retry.DurationFunc を使用します.現在このパッケージには標準的な retry.ExponentialBackoffretry.Duration が実装されています.

リトライ リトライ の の を を 関数 し し た 理由 理由 は は 、 単純 に に カスタム カスタム できる できる 実装 に に する の が 好き な な こと も も あり あり ます 、 、 、 に に は 様々 な 実装 が ある こと こと が が 大きい です.. 例えば 、 現在 は は いる いる いる いる いる 1046714 retry.ExponentialBackoff のようにランダムな値を使用したアルゴリズムで実装されていますが、ランダムな値を使用しない Exponential Backoff を使用したい場合は、以下のような独自関数を実装することで簡単に使用できます.

func ExponentialBackoff(maxRetries int) retry.DurationFunc {
    return func(retries int) time.Duration {
        if maxRetries >= 0 && maxRetries < retries {
            return -1
        }
        return time.Duration(math.Pow(2, float64(retries))*100)*time.Millisecond
    }
}


まとめ



この この は パッケージ パッケージ 処理 や インストール 処理 、 、 データ データ ベース など の の 他 に に 対話 対話 型 型 の インターフェース を 伴う 伴う cli など など で 使用 できる できる よう よう に 設計 し て て 実装 し て ます. いろいろ な 場所 場所 に 組み込み 組み込み 設計 設計 に に し て いる 使っ 使っ 使っ 使っ 使っ 使っ 使っ 使っ 使っ 使っ 使っ 使っ 使っ 使っ 使っ 使っ いろいろ いろいろ いろいろ いろいろ な な な いろいろ いろいろ いろいろ いろいろ.てみてください.200ms + (20ms ~ 100ms) の追加やご指摘などcontrivieworto も お待ちしてます.

https://github.com/kenkyu392/go-retry

좋은 웹페이지 즐겨찾기