-
Notifications
You must be signed in to change notification settings - Fork 0
MS_AzureRetryDesign
- 戻る(Azureの高可用性設計)
- Azureの冗長化
- Azureの障害復旧
- AzureのDDoS対策
- Azure上でのリトライ設計・実装
下記を参照。
補足(原文はリンクのみのため、要点を補う)
クラウドでは、一時的な障害(transient fault)は正常な事象である。
サービス側のスケール調整、ノードの入れ替え、
スロットリング(Azure API Management の
レート制限や Azure SQL Database の DTU 上限)など、
設計どおりに動いていても失敗が返る場面が常にある。
したがってリトライは「例外的な保険」ではなく
標準の設計要素として組み込む必要がある。
補足(原文が概要のみのため、要点を補う)
分類 例 対応 一時的(transient) 接続タイムアウト、 429 Too Many Requests、503リトライする 恒久的 401(認証失敗)、403、404、SQL の構文エラーリトライしない(何度やっても同じ) 判定困難 500慎重に。回数を絞る 恒久的な失敗をリトライすると、障害を悪化させるだけである。
「とりあえず 3 回リトライ」という実装が最も危険。一定間隔でリトライすると、
- 復旧しかけたサービスに再び負荷が集中する、
- 多数のクライアントが同時にリトライして波を作る(Thundering Herd)、
という問題が起きる。対策は次の 2 つ。
待ち時間 = base × 2^(試行回数) ← 指数バックオフ + random(0, jitter) ← ジッター(波をずらす)リトライだけでは、相手が完全に落ちている場合に無駄な待ちが積み上がる。
一定回数失敗したらしばらく呼び出し自体をやめる(オープン)、
時間経過後に少量だけ試す(ハーフオープン)という制御を併用する。Closed(通常)──失敗が閾値超──▶ Open(即座に失敗を返す) ▲ │ 一定時間後 └────成功──── HalfOpen(試行)◀──┘詳細は クラウド アプリケーション アーキテクチャ ガイド の
クラウド デザイン パターンを参照。自前でリトライを書く前に、SDK が持つ機能を確認すること。
二重にリトライを実装すると、
- 試行回数が掛け算になり(3 × 3 = 9 回)、
- タイムアウトが想定の何倍にもなる、
という事故になる。
対象 組み込みのリトライ Azure SQL Database EF Core の EnableRetryOnFailure()(接続の回復性)、Microsoft.Data.SqlClientの接続回復性Azure SDK for .NET RetryOptions(各クライアントのClientOptions)HTTP 全般 Polly + IHttpClientFactoryPolly を使う場合も、
HttpClientのタイムアウトとリトライ回数の積が
全体のタイムアウトを超えないよう設計すること。リトライは同じ処理が複数回実行され得ることを意味する。
「タイムアウトしたが、サーバー側では成功していた」という場合、
単純なリトライは二重登録になる。
- 更新系には冪等キー(クライアント生成の一意な ID)を持たせる、
- あるいはサーバー側で重複を検出する、
といった設計が併せて必要になる。
これを欠いたリトライは、可用性を上げる代わりにデータを壊す。
- ガイドライン適用の際はフィッティングが重要な件(リトライ実装の例) - OSS コンソーシアム
https://www.osscons.jp/joww525n6-537/#_537
- 一時的な障害の処理
https://learn.microsoft.com/ja-jp/azure/architecture/best-practices/transient-faults - 再試行ガイダンス(サービス別)
https://learn.microsoft.com/ja-jp/azure/architecture/best-practices/retry-service-specific
Tags: 移行, インフラストラクチャ, クラウド, Azure
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。