[JP] go-retry - Go で処理を途中에서 리트라이데 나무루팍케이지を作った
7732 단어 opensourceshowdevgo
なぜ作たのか
通信処理や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.ExponentialBackoff と retry.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
Reference
이 문제에 관하여([JP] go-retry - Go で処理を途中에서 리트라이데 나무루팍케이지を作った), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/kenkyu/jp-go-retry-go-dechu-li-wotu-zhong-kararitoraidekirupatukeziwozuo-tuta-3fja텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)