導入
ネットワークや外部APIは一時的に失敗します。「NuGetという発想」の回で手作りしたリトライを、Pollyは宣言的な数行で実現します。さらに「失敗が続いたら一定時間呼び出しを止める」サーキットブレーカーなど、回復性(レジリエンス)の定番パターンを備えています。
図解
flowchart LR
CALL["外部API呼び出し"] --> POL["Pollyポリシー"]
POL -->|成功| OK["結果"]
POL -->|一時失敗| RETRY["待って再試行(Retry)"]
RETRY --> POL
POL -->|失敗が続く| CB["サーキットを開く<br/>しばらく即座に失敗"]
進め方
- スターター
119-polly/starter.zipを展開し、PollyLesson.slnを開く(Polly導入済み) Program.csのTODO(リトライポリシー)を埋める- わざと数回失敗させ、最終的に成功することを確認する
学ぶこと
using Polly;
// 「HttpRequestExceptionが起きたら、1秒→2秒→3秒 と待って最大3回やり直す」
var retry = Policy
.Handle<HttpRequestException>()
.WaitAndRetry(3, attempt => TimeSpan.FromSeconds(attempt));
// ポリシーで処理を包んで実行する。中身の失敗は自動でリトライされる
string result = retry.Execute(() => CallApi());
Console.WriteLine(result);
Policy.Handle<例外>()で「どの失敗に反応するか」、WaitAndRetryで「何回・どれだけ待つか」を宣言するExecute(() => ...)で処理を包むだけ。リトライの制御コードはアプリから消える- リトライ以外にもサーキットブレーカー / タイムアウト / フォールバックがあり、組み合わせられる
- 新しいPolly(v8)では
ResiliencePipelineという新APIも使える。考え方は同じ(宣言的に回復性を定義する)
期待される出力
1回目失敗、リトライします...
2回目失敗、リトライします...
成功: データ取得OK
まとめ
- Pollyはリトライ・サーキットブレーカーなど回復性パターンを宣言的に書ける
Handle<例外>().WaitAndRetry(...)+Executeが基本形- 手書きの
try/catchループを、テスト済みの部品に置き換えられる
次回: CSVの読み書きを安全に行うCsvHelperです。
テンプレート構成(教材制作用メモ)
119-polly/
├── starter.zip # Polly導入済み / 失敗を模擬するCallApi / Program.cs(TODO入り)
└── solution/Program.cs