golang backoff再試行指数退避アルゴリズム

7813 ワード

前言:
前の時間に小さな問題が発生して、下流のサービスは時々渋滞して、私の側はデータの一致性を確保するために、絶えず再試行して要求して、このような結果は自然に雪の上に霜が降ります.もちろん、下流の処理は向上する必要がありますが、再試行を最適化する方法はありますか?backoff指数退避アルゴリズムはこのことをしている.
この記事は引き続き更新されていますので、原文アドレスに移動してください http://xiaorui.cc/?p=5836
backoff退避アルゴリズム
退避アルゴリズムとは?通常、サービスに障害が発生した場合、一定の間隔で再試行しますか?しかし、これはいくつかの問題をもたらし、同じ時間に多くのリクエストが再試行されると無意味なリクエストになる可能性があります.
指数退避アルゴリズムは,連続的な衝突を防止するためにジッタ(ランダム遅延)を利用する.効果は以下の通りで、間隔の時間ごとに指数が上昇し、少量のランダムが加わった.
待ち時間:101 ms待ち時間:208 ms待ち時間:413 ms待ち時間:821 ms待ち時間:1602 ms待ち時間:3203 ms
こちらにはgolang backoffの指数退避ライブラリが封入されていますので、興味のある方はコードを見てくださいhttps://github.com/rfyiamcool/backoff
backoffのコード実装は簡単で,彼の使用方法も簡単で,一例を示した.
b := NewBackOff( WithMinDelay(100*time.Millisecond), WithMaxDelay(10*time.Second), WithFactor(2), ) equals(t, b.Duration(), 100*time.Millisecond) equals(t, b.Duration(), 200*time.Millisecond) equals(t, b.Duration(), 400*time.Millisecond) for index := 0; index < 100; index++ { b.Duration() } // is max equals(t, b.Duration(), 10*time.Second) b.Reset() equals(t, b.Duration(), 100*time.Millisecond)

少量のランダム遅延時間を実現するにはjitterパラメータをオンにする必要があります
b := NewBackOff( WithMinDelay(100*time.Millisecond), WithMaxDelay(10*time.Second), WithFactor(2), WithJitterFlag(true), ) equals(t, b.Duration(), 100*time.Millisecond) between(t, b.Duration(), 100*time.Millisecond, 200*time.Millisecond) between(t, b.Duration(), 100*time.Millisecond, 400*time.Millisecond) b.Reset() equals(t, b.Duration(), 100*time.Millisecond)

まとめ:
 
ソース:http://xiaorui.cc/2019/04/23/golang-backoff%E9%87%8D%E8%AF%95%E6%8C%87%E6%95%B0%E9%80%80%E9%81%BF%E7%AE%97%E6%B3%95/