リトライストームとは? 解説
リトライストームとは、多数のクライアントが不調なサービスに同時にリトライを行い、サービスが回復できないほどの負荷を積み上げてしまう自己増幅的な障害です。
リトライは一時的な障害には有効ですが、不用意に行うと短時間のつまずきを持続的な障害に変えてしまいます。サービスがつまずいた際に、すべてのクライアントが即座にリトライすると、リトライの急増が元のトラフィックより重くなり、サービスをダウンさせたままにします。これがリトライストームであり、素朴なリトライに対する教訓的な事例です。
ストームはどう発生するか
サービスが一時的に遅くなるか失敗します。すべてのクライアントが一斉にリトライします。これらのリトライは通常のトラフィックの上に加わるため、サービスは以前より過負荷になります。さらに失敗が増え、さらに多くのリトライを引き起こす - このフィードバックループが、元の引き金が過ぎ去った後も長らくサービスをダウンさせたままにします。
なぜこれほど有害なのか
リトライストームは、数秒で解消するはずの一時的な乱れを、長引く障害に変えてしまいます。リトライは悪意あるものではなく、各クライアントは「妥当な」ことをしているだけです。問題は創発的な振る舞いにあります - 数千の妥当なリトライが、自らの依存先に対する偶発的なサービス拒否攻撃になってしまうのです。
どう防ぐか
- バックオフ: 試行間の待機時間を長くし、リトライを時間的に分散させます。
- ジッター: 遅延をランダム化し、クライアントが同期した波でリトライしないようにします。
- 上限: 試行の総数を制限し、決定的な失敗をループさせずに止めます。
- サーキットブレーカー: サービスが明らかにダウンしたら、リトライを完全に停止します。
自己修復への教訓
優れた自己修復とは「すべてを攻撃的にリトライする」ことではありません。まさにリトライストームを引き起こさないために、選択的で、限定的で、バックオフを備えたものです。リトライの本来の目的は一時的な障害から回復することであり、持続的な障害を作り出すことではありません。
Latchkeyの視点
Latchkeyの自己修復型マネージドrunnerは、一時的および機械的な障害に対して、即座かつ無限にではなく、妥当な上限とバックオフを備えてリトライします。そのため、一度きりの乱れがあなたのbuildを失敗させることはなく、回復がすでに不調なupstreamに対するリトライストームになることもありません。
重要なポイント
- リトライストームとは、同期したリトライが不調なサービスを圧倒することです。
- 短時間の乱れを、長引く自己強化的な障害に変えます。
- バックオフ、ジッター、上限、サーキットブレーカーがこれを防ぎます。
- 優れた自己修復は選択的かつ限定的であり、攻撃的ではありません。