「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -戻る --[[クラウド設計パターン]] --[[HttpClientの類の使い方>HttpClientの類の使い方#e8fa9d8f]] * 目次 [#v98ce72f] #contents *概要 [#ud2f7581] -障害回復力のある一時的な障害処理ポリシーを実装する。 -スレッドセーフかつ[[Fluent Interface>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Method%20Chain%20%E3%81%A8%20Fluent%20Interface]]で表現・実装できる *詳細 [#ce88942b] 以下のようなポリシーを組み合わせて実装できる。 **機能 [#o02265e3] ***Retry [#a3ac1e10] -時間を空けて再実行する。 -[[Exponential Backoff(指数バックオフ)>#tf2880c4]]を併用する。 ***Circuit Breaker [#v7858b6b] 設定で指定した回数のエラーが連続して発生した場合、Exceptionを返す。 ***Timeout [#x2c67d83] 指定した時間が経過しても処理が終わらない場合、Exceptionを返す。 -悲観的タイムアウト --通常のタイムアウト --クライアント側なので処理を抜けるだけになる。 -楽観的タイムアウト --悲観的タイムアウトでは、処理を抜けるだけになるが、 --楽観的タイムアウトでは、CancellationTokenによるキャンセル処理を実装できる。 -参考 --Cancellation Token について調べてみる - Qiita~ https://qiita.com/TsuyoshiUshio@github/items/b2d23b37b410a2cfd330 ***Bulkhead Isolation [#hbaec99c] -並列に実行可能なリクエスト数を制限する。 -コンシューマーバルクヘッドとも呼ぶ。 -セマフォを使って 同時実行可能数を制限している。 ***Fallback [#g1f2b2cf] エラーが発生した場合に、最終的に返したい値は Fallback を使って指定する。 ***Cache [#l0817d8b] Cacheを、他の Policy と組み合わせて柔軟に処理に組み込める。 ***PolicyWrap [#p7330fec] 上記([[Retry>#a3ac1e10]], [[Circuit Breaker>#v7858b6b]], [[Timeout>#x2c67d83]], [[Bulkhead>#hbaec99c]], [[Fallback>#g1f2b2cf]])を組み合わせる。 -PolicyWrap · App-vNext/Polly Wiki~ https://github.com/App-vNext/Polly/wiki/PolicyWrap **見解 [#v08beee2] ***実装例 [#u188674d] -ラッパーでも良いと思うが、DIの実装例が多い。 -更に[[クリーン・アーキテクチャ>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%83%BB%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3]]的な実装例もある。 -ケースバイケース(オーバースペックにならないようにする) ***利用シーン [#m0f30387] -Pollyって機能的に足りてるんだろうけど、結局、 --書き直す。 --ユースケース毎にラッパを作成する。 >ことになる気がする。 -なんとなく、 >この全ポリシーを組み合わす機会が少ない >ので、ありがたみが少ない気がする。 -冒頭にも書いた「ユースケース毎にラッパ」に該当する、~ [[HttpClient>HttpClientの類の使い方]]をシングルトンにしている様な実装箇所を、~ [[HttpClientFactory>HttpClientの類の使い方#o8484df8]]にして、Polly統合するのが現実的か。 ***クライアント実装 [#e81e1274] -所詮、クライアント側実装ではある。 -[[サーバ実装>#r62bae50]]で担保スべきところもありそうだ。 ***サーバ実装 [#r62bae50] サーバ実装も考えると、やはり、Pollyダケでは完結しない。 -Device FlowやCIBAの[[slow_downなど>CIBA(Client Initiated Backchannel Authentication)#z70c2acf]]は、サーバーが指示する。 -[[API Gateway]]に流量制御してくれる機能があるのでコレを使用するのも手。 *参考 [#r94a53e4] -C# と Polly を使って回復力の高いアプリケーションを書く - しばやん雑記~ https://blog.shibayan.jp/entry/20190102/1546425897 -Azure Function v2にHttpClientFactory+Pollyを組み込み、HttpClientの再試行を実装する - Qiita~ https://qiita.com/HiroyukiSakoh/items/92d1365db6447bd64550 **NuGet [#z49816fb] -Polly~ https://www.nuget.org/packages/Polly/ -Polly.Caching.MemoryCache~ https://www.nuget.org/packages/Polly.Caching.MemoryCache/ -Polly.Caching.Memory~ https://www.nuget.org/packages/Polly.Caching.Memory/ -Polly.Caching.Distributed~ https://www.nuget.org/packages/Polly.Caching.Distributed/ **Qiita [#k9a26dea] -C#でPollyを使ったリトライ処理~ https://qiita.com/sat0tabe/items/e3656e712df4918cfdf1 -C# gRPC Polly でエラー制御を実装する~ https://qiita.com/mxProject/items/c18dafc59d8c186f59bc **Microsoft Docs [#q6d26afb] -Polly で指数バックオフを含む HTTP 呼び出しの再試行を実装する~ https://docs.microsoft.com/ja-jp/dotnet/architecture/microservices/implement-resilient-applications/implement-http-call-retries-exponential-backoff-polly -Bulkhead pattern - Cloud Design Patterns~ https://docs.microsoft.com/en-us/azure/architecture/patterns/bulkhead -Cache-Aside pattern - Cloud Design Patterns~ https://docs.microsoft.com/en-us/azure/architecture/patterns/cache-aside **[[Exponential Backoff(指数バックオフ)]] [#tf2880c4] ---- Tags: [[:通信技術]], [[:.NET開発]], [[:ASP.NET]]