- 追加された行はこの色です。
- 削除された行はこの色です。
「[[マイクロソフト系技術情報 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の実装例が多い。
-ラッパーでも良いと思うが、[[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]]的な実装例もある。
-ケースバイケース(オーバースペックにならないようにする)
***実装箇所 [#e81e1274]
「障害回復力のある一時的な障害処理ポリシー」を実現する上で、
-クライアント実装
--所詮、クライアント側実装ではある。
--サーバ実装で担保スべきところもありそうだ。
-サーバ実装~
サーバ実装も考えると、やはり、Pollyダケでは完結しない。
--Device FlowやCIBAの[[slow_downなど>CIBA(Client Initiated Backchannel Authentication)#z70c2acf]]は、サーバーが指示する。
--[[API Gateway]]に流量制御してくれる機能があるのでコレを使用するのも手。
***利用シーン [#m0f30387]
-Pollyって機能的に足りてるんだろうけど、結局、
--書き直す。
--ユースケース毎にラッパを作成する。
-機能的に十分、足りてるんだろうけど、
--結局、書き直す。
--若しくは、ユースケース毎にラッパを作成する。
>ことになる気がする。
-なんとなく、
>この全ポリシーを組み合わす機会が少ない
>ので、ありがたみが少ない気がする。
>ので、ありがたみが少ない(その割に複雑な)気がする。
-冒頭にも書いた「ユースケース毎にラッパ」に該当する、~
-ケースバイケース(オーバースペックにならないようにすべき)
--冒頭にも書いた「ユースケース毎にラッパ」に該当する、~
[[HttpClient>HttpClientの類の使い方]]をシングルトンにしている様な実装箇所を、~
[[HttpClientFactory>HttpClientの類の使い方#o8484df8]]にして、Polly統合するのが現実的か。
***クライアント実装 [#e81e1274]
-所詮、クライアント側実装ではある。
-[[サーバ実装>#r62bae50]]で担保スべきところもありそうだ。
--MAXは、クリーン・アーキテクチャ化だが、[[段階>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#g2119f30]]がある。
***サーバ実装 [#r62bae50]
サーバ実装も考えると、やはり、Pollyダケでは完結しない。
--また、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]]