本文へスキップ
BecomeCoder

C#実践コース · 第6章 代表的なNuGetパッケージとその使い方 · レッスン35

Polly ― リトライとサーキットブレーカー(ローカル実施)

ローカル実施

導入

ネットワークや外部APIは一時的に失敗します。「NuGetという発想」の回で手作りしたリトライを、Pollyは宣言的な数行で実現します。さらに「失敗が続いたら一定時間呼び出しを止める」サーキットブレーカーなど、回復性(レジリエンス)の定番パターンを備えています。

図解

flowchart LR
    CALL["外部API呼び出し"] --> POL["Pollyポリシー"]
    POL -->|成功| OK["結果"]
    POL -->|一時失敗| RETRY["待って再試行(Retry)"]
    RETRY --> POL
    POL -->|失敗が続く| CB["サーキットを開く<br/>しばらく即座に失敗"]

進め方

  1. スターター119-polly/starter.zipを展開し、PollyLesson.slnを開く(Polly導入済み)
  2. Program.csのTODO(リトライポリシー)を埋める
  3. わざと数回失敗させ、最終的に成功することを確認する
Visual StudioでPollyのリトライを実行し、数回失敗した後に成功しコンソールに結果が表示された様子
手作りのリトライが、宣言的なポリシーに置き換わる

学ぶこと

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