「[[マイクロソフト系技術情報 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]]的な実装例もある。

***実装箇所 [#e81e1274]
「障害回復力のある一時的な障害処理ポリシー」を実現する上で、
「障害回復力のある一時的な障害処理ポリシー」を実現する際の実装箇所。

-クライアント実装
--所詮、クライアント側実装ではある。
--サーバ実装で担保スべきところもありそうだ。

-サーバ実装~
サーバ実装も考えると、やはり、Pollyダケでは完結しない。
クライアント実装ダケでは完結しない。

--[[クラウド設計パターンの調整(絞り弁)>クラウド設計パターン#r5f048d8]]

--Device FlowやCIBAの[[slow_downなど>CIBA(Client Initiated Backchannel Authentication)#z70c2acf]]は、サーバーが指示する。

--[[API Gateway]]に流量制御してくれる機能があるのでコレを使用するのも手。

***利用シーン [#m0f30387]


-機能的に十分、足りてるんだろうけど、
--結局、書き直す。
--若しくは、ユースケース毎にラッパを作成する。

>ことになる気がする。

-なんとなく、
>この全ポリシーを組み合わす機会が少ない

>ので、ありがたみが少ない(その割に複雑な)気がする。

-ケースバイケース(オーバースペックにならないようにすべき)

--冒頭にも書いた「ユースケース毎にラッパ」に該当する、~
[[HttpClient>HttpClientの類の使い方]]をシングルトンにしている様な実装箇所を、~
[[HttpClientFactory>HttpClientの類の使い方#o8484df8]]にして、Polly統合するのが現実的か。

--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]]がある。

--また、Pollyのような、クライアント実装だけではなく、~
サーバ実装で担保スべきところもありそう。

*参考 [#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]]
Tags: [[:.NET開発]], [[:通信技術]], [[:.NET Standard]], [[:.NET Core]], [[:ASP.NET]], [[:ASP.NET Web API]], [[:クラウド系開発]]


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS