Backoffするときに、Jitterがあると良いとよく言われているが、いまいちピンとこない。 例えば: AWS Solutions Architect ブログ: Exponential Backoff And Jitter (この記事ではグラフも交えて説明されているのでわかりやすい)
というわけで、いろいろパラメータを変えてグラフで見れるようなやつを作った。 Backoff時のJitterの様子 | tools.gomiba.co
これを見ると圧倒的にわかりやすいのがJitter有無によるタイミングのばらつきで、これはExponentialかどうかは関係ない。Linearでも同じようにばらつく。 ばらつくと何がいいかというと、処理が集中しないことにある。集中すればその分だけ負荷も上がるので、いずれかの処理を後回しにしなければならない。いくらクラウドだとしても無限のリソースで無限にスケールできるわけではない。これを事前に、ばらつきをもって処理をすれば、負荷も分散され余裕が出来てくる。という理解。
LinearかExponentialかについては、処理の失敗する可能性が上がるとよりExponentialが効いてくるように見える。
Linearの場合は線形にリトライ待ち時間が増えていくので、失敗する可能性が高いような場合ではどれだけリトライしても実行するタイミングはだいたい同じになる。(Jitterによるブレはあるが) 一方でExponentialの場合はリトライ回数が増えると指数関数的に待ち時間が爆発していくので、失敗が続くような処理は長い時間待たされるようになる。これによって処理待ちが増え、処理の回数が減り、回復することをLinearよりもゆっくりと待ってくれる。
具体的な待ち時間は前回作った計算機で出来る。 Backoff計算機 | tools.gomiba.co
逆に言えば、(現実は何が起こるのかわからないけれど。。)失敗する可能性がそこまで高くないような場合ではLinear + Jitterでも十分そうな感じがする。まあでも、Exponentialのデメリットは待ち時間が爆発することだと思うので、それで問題がなければ、何も気にせず思考停止でExponential + Jitterを使うのが楽なのかな・・・ 自分で1から実装するではなくて、その手のBackoffするライブラリもいろいろあるので、実装が大変そうとかっていうことも無いと思う。実際コード読みながら自分でこのようにざっくり実装も出来るくらいなので。
というのを作って遊んでだいぶ理解した。
それはそうと、vue-chartjsを使ったのだけれども、chart.jsの3.xに対応していないので2.xをいれる必要がある、というのはなかなかトラップなのでは。公式のガイド修正するか3.x対応がなされてほしい。。。
Chart.js 3.0 support · Issue #695 · apertureless/vue-chartjs
vue-chartjsもデータをいい感じに変えたらいい感じにグラフも変わって便利だなあ〜