[轉].NET 開源項目 Polly 介紹

今天介紹一個 .NET 開源庫:Polly,它是支持 .NET Core 的,目前在 GitHub 的 Star 數量已經接近 5 千,它是一個強大且實用的 .NET 庫。

Polly 介紹

官方對 Polly 的介紹是這樣的:

Polly is a .NET resilience and transient-fault-handling library that allows developers to express policies such as Retry, Circuit Breaker, Timeout, Bulkhead Isolation, and Fallback in a fluent and thread-safe manner.

翻譯過來大概意思是:Polly 是一個 .NET 彈性和瞬態故障處理庫,允許開發人員以 Fluent 和線程安全的方式來實現重試、斷路、超時、隔離和回退策略。

這個描述有點抽象,我們一起來理解一下。

首先這里的說的瞬態故障包含了程序發生的異常和出現不符合開發者預期的結果。所謂瞬態故障,就是說故障不是必然會發生的,而是偶然可能會發生的,比如網絡偶爾會突然出現不穩定或無法訪問這種故障。至于彈性,就是指應對故障 Polly 的處理策略具有多樣性和靈活性,它的各種策略可以靈活地定義和組合。

下面來演示一個例子,大家就更清楚了。

故障處理策略示例

安慣例,創建一個空的 Console 項目,和安裝 NuGet 包:

Install-Package Polly

?

Polly 的異常處理策略的基本用法可以分為三個步驟,步驟說明包含在下面代碼中:

static void Main(string[] args)
{Policy// 1. 指定要處理什么異常.Handle<HttpRequestException>()// ? ?或者指定需要處理什么樣的錯誤返回.OrResult<HttpResponseMessage>(r => r.StatusCode == HttpStatusCode.BadGateway)// 2. 指定重試次數和重試策略.Retry(3, (exception, retryCount, context) =>{Console.WriteLine($"開始第 {retryCount} 次重試:");})// 3. 執行具體任務.Execute(ExecuteMockRequest);Console.WriteLine("程序結束,按任意鍵退出。");Console.ReadKey();
}static HttpResponseMessage ExecuteMockRequest()
{// 模擬網絡請求Console.WriteLine("正在執行網絡請求...");Thread.Sleep(3000);// 模擬網絡錯誤return new HttpResponseMessage(HttpStatusCode.BadGateway);
}

?

從例子中可以看到,Polly 的 API 支持流式(Fluent)調用,使用起來很方便。這個示例對錯誤處理的策略很簡單,當發生請求異常或網絡錯誤時,就重試 3 次。我們可以從下面的運行結果圖看到這個策略的執行過程:

下面具體來看 Polly 支持的各種故障處理策略。

Polly 的七種策略

Polly 可以實現重試、斷路、超時、隔離、回退和緩存策略,下面給出這些策略的應用場景說明和基本使用方法。

重試(Retry)

出現故障自動重試,這個是很常見的場景,上面也已經給出例子了,這里不再細述。

斷路(Circuit-breaker)

當系統遇到嚴重問題時,快速回饋失敗比讓用戶/調用者等待要好,限制系統出錯的體量,有助于系統恢復。比如,當我們去調一個第三方的 API,有很長一段時間 API 都沒有響應,可能對方服務器癱瘓了。如果我們的系統還不停地重試,不僅會加重系統的負擔,還會可能導致系統其它任務受影響。所以,當系統出錯的次數超過了指定的閾值,就要中斷當前線路,等待一段時間后再繼續。

下面是一個基本的斷路策略的使用方式:

Policy.Handle<SomeException>().CircuitBreaker(2, TimeSpan.FromMinutes(1));

?

這句代碼設定的策略是,當系統出現兩次某個異常時,就停下來,等待 1 分鐘后再繼續。這是基本的用法,你還可以在斷路時定義中斷的回調和重啟的回調。

超時(Timeout)

當系統超過一定時間的等待,我們就幾乎可以判斷不可能會有成功的結果。比如平時一個網絡請求瞬間就完成了,如果有一次網絡請求超過了 30 秒還沒完成,我們就知道這次大概率是不會返回成功的結果了。因此,我們需要設置系統的超時時間,避免系統長時間做無謂的等待。

下面是超時策略的一個基本用法:

Policy.Timeout(30, onTimeout: (context, timespan, task) =>
{// do something
});

?

這里設置了超時時間不能超過 30 秒,否則就認為是錯誤的結果,并執行回調。

隔離(Bulkhead Isolation)

當系統的一處出現故障時,可能促發多個失敗的調用,很容易耗盡主機的資源(如 CPU)。下游系統出現故障可能導致上游的故障的調用,甚至可能蔓延到導致系統崩潰。所以要將可控的操作限制在一個固定大小的資源池中,以隔離有潛在可能相互影響的操作。

下面是隔離策略的一個基本用法:

Policy.Bulkhead(12, context =>
{// do something
});

?

這個策略是最多允許 12 個線程并發執行,如果執行被拒絕,則執行回調。

回退(Fallback)

有些錯誤無法避免,就要有備用的方案。這個就像瀏覽器不支持一些新的 CSS 特性就要額外引用一個 polyfill 一樣。一般情況,當無法避免的錯誤發生時,我們要有一個合理的返回來代替失敗。

比如很常見的一個場景是,當用戶沒有上傳頭像時,我們就給他一個默認頭像,這種策略可以這樣定義:

Policy.Handle<Whatever>().Fallback<UserAvatar>(() => UserAvatar.GetRandomAvatar())

?

緩存(Cache)

一般我們會把頻繁使用且不會怎么變化的資源緩存起來,以提高系統的響應速度。如果不對緩存資源的調用進行封裝,那么我們調用的時候就要先判斷緩存中有沒有這個資源,有的話就從緩存返回,否則就從資源存儲的地方(比如數據庫)獲取后緩存起來,再返回,而且有時還要考慮緩存過期和如何更新緩存的問題。Polly 提供了緩存策略的支持,使得問題變得簡單。

var memoryCacheProvider = new MemoryCacheProvider(myMemoryCache);
var cachePolicy = Policy.Cache(memoryCacheProvider, TimeSpan.FromMinutes(5));
TResult result = cachePolicy.Execute(context => getFoo(), new Context("FooKey"));

?

這是官方的一個使用示例用法,它定義了緩存 5 分鐘過期的策略,然后把這個策略應用在指定的 Key(即?FooKey)上。

這一塊內容值得用一整篇的內容來講,下次有機會再詳細講講 Polly 的緩存策略。

策略包(Policy Wrap)

一種操作會有多種不同的故障,而不同的故障處理需要不同的策略。這些不同的策略必須包在一起,作為一個策略包,才能應用在同一種操作上。這就是文章開頭說的 Polly 的彈性,即各種不同的策略能夠靈活地組合起來。

策略包的基本用法是這樣的:

var policyWrap = Policy.Wrap(fallback, cache, retry, breaker, timeout, bulkhead);
policyWrap.Execute(...);

?

先是把預先定義好的多種不同的策略包在一起,作為一個整體策略,然后應用在同一個操作上。

總結

本文先是對 Polly 做了一個簡單介紹,通過一個例子讓大家知道了 Polly 的基本用法和步驟,然后分別介紹了 Polly 的七種策略。其實 Polly 遠比本文講的要強大,但由于篇幅的限制和精力有限,只能籠統地給大家做個介紹,更多的應用場景還需要結合實際的例子才能講清楚。要深入研究,可以前往查看 Polly 的 GitHub 主頁和 Wiki 文檔。

參考:

https://github.com/App-vNext/Polly

https://github.com/App-vNext/Polly/wiki

?


---------------------
作者:ahilll
來源:CSDN
原文:https://blog.csdn.net/ahilll/article/details/82908811
版權聲明:本文為作者原創文章,轉載請附上博文鏈接!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/285664.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/285664.shtml
英文地址,請注明出處:http://en.pswp.cn/news/285664.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

「 劉一哥GIS」CSDN專業技術博文專欄目錄索引

劉一哥GIS 個人簡介&#xff1a;劉一哥&#xff0c;多年研究地圖學、地理信息系統、遙感、攝影測量和GPS等應用&#xff0c;精通ArcGIS等軟件的應用&#xff0c;精通多門編程語言&#xff0c;擅長GIS二次開發和數據庫系統開發&#xff0c;具有豐富的行業經驗&#xff0c;致力于…

memcached 和 redis 的區別與選擇

沒有必要過多的關注性能。由于Redis只使用單核&#xff0c;而Memcached可以使用多核&#xff0c;所以在比較上&#xff0c;平均每一個核上Redis在存儲小數據時比Memcached性能更高。而在100k以上的數據中&#xff0c;Memcached性能要高于Redis&#xff0c;雖然Redis最近也在存儲…

C語言試題九十之實現輸入一行字符,分別統計出其中英文字母、空格、數字和其他字符的個數。

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 輸入一行字…

數據庫備份需要注意的

2019獨角獸企業重金招聘Python工程師標準>>> 1、PHPMYADMIN無法導出大數據表的 如果你的數據庫中有上百個數據表&#xff0c;并且有很多數據表記錄都超過了1G&#xff0c;還有很多INNODB數據表&#xff0c;這個時候用PHPMYADMIN導出&#xff0c;你就會發現恢復后可能…

在 .NET 6 中使用 dotnet format 格式化代碼

我不得不承認&#xff0c;在 code review 的時候&#xff0c;我花費了很多時間來研究 C# 的代碼格式問題&#xff0c;這是沒有太大意義的工作&#xff0c;我應該專注于其他事情&#xff0c;而不是觀察同事是否忘記格式化代碼&#xff0c;或者是使用了其他不同規則的代碼編輯器。…

【天工Godwork精品教程】任務一:創建工程(導入相片、編輯相機參數、導入POS)

無人機航測精品專欄鏈接:《無人機航空攝影測量精品教程》 【天工Godwork精品教程】任務一:創建工程(導入相片、編輯相機參數、導入POS) 【天工Godwork精品教程】任務二:導入控制點、POS權重設置、自由空三 【天工Godwork精品教程】任務三:刺像控點、空三平差、精度優化調…

[轉]數據庫事務ACID特性

ACID特性 數據庫管理系統中事務(transaction)的四個特性&#xff08;分析時根據首字母縮寫依次解釋&#xff09;&#xff1a;原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔離性&#xff08;Isolation&#xff09;、持久性&#xff…

dotnet-exec 0.4.0 released

dotnet-exec 0.4.0 releasedIntrodotnet-exec 是一個 C# 程序的命令行小工具&#xff0c;可以用來運行一些簡單的 C# 程序而無需創建項目文件&#xff0c;而且可以自定義項目的入口方法&#xff0c;支持但不限于 Main 方法Install/Updatedotnet-exec 是一個 dotnet tool&#x…

【天工Godwork精品教程】任務二:導入控制點、POS權重設置、連接點分布檢查、自由空三

無人機航測精品專欄鏈接:《無人機航空攝影測量精品教程》 【天工Godwork精品教程】任務一:創建工程(導入相片、編輯相機參數、導入POS) 【天工Godwork精品教程】任務二:導入控制點、POS權重設置、自由空三 【天工Godwork精品教程】任務三:刺像控點、空三平差、精度優化調…

C語言試題九十二之輸入數據有多行,第一行是一個整數n,表示測試用例的個數,后面跟著n行 ,每行包括一個由字母和數字組成的字符串

? ?作者簡介:大家好我是碼莎拉蒂,CSDN博客專家?????? ??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款模擬面試、刷題神器?? 點擊跳轉進入網站 1、題目 輸入 輸入數據有多行,第一行是一個整數n,表示測試用例的個數,后面跟著n行,每行包括一…

Spring中Bean的實例化

在Spring中要實例化一個Bean有幾種方法&#xff1a; 1、最常用的&#xff08;普通方法&#xff09; <bean id"myBean" class"www.com.org.MyBean" /> 使用這樣方法&#xff0c;按Spring就會使用Bean的默認構造方法&#xff0c;即通過沒有參數的構造方…

cc2530學習筆記

case KEY_CHANGE://按鍵事件 case AF_INCOMING_MSG_CMD://接收數據事件,調用函數AF_DataRequest()接收數據 case ZDO_STATE_CHANGE: //只要網絡狀態發生改變&#xff0c;就通過ZDO_STATE_CHANGE事件通知所有的任務。 //同時完成對協調器&#xff0c;路由器&#xff0c;終端的設…

【天工Godwork精品教程】任務三:刺像控點、空三平差、精度優化調整

無人機航測精品專欄鏈接:《無人機航空攝影測量精品教程》 【天工Godwork精品教程】任務一:創建工程(導入相片、編輯相機參數、導入POS) 【天工Godwork精品教程】任務二:導入控制點、POS權重設置、自由空三 【天工Godwork精品教程】任務三:刺像控點、空三平差、精度優化調…

.NET in China - What's New in .NET

點擊藍字關注我們編輯&#xff1a;Alan Wang排版&#xff1a;Rani Sun活動介紹去年11月&#xff0c;.NET 6 的發布&#xff0c;為我們帶來了 .NET 多平臺應用 UI&#xff08;.NET MAUI&#xff09;。就在前不久&#xff0c;.NET MAUI 已正式發布。未來&#xff0c;作為 .NET 7 …

Android之網絡請求提示Cleartext HTTP traffic to dev*******.com not permitted

1、問題 請求服務端網絡錯誤提示錯誤如下 Cleartext HTTP traffic to dev*******.com not permitted2、解決辦法 Android9.0 默認是禁止所有的http,AndroidManifest.xml添加如下 android:usesCleartextTraffic="true"同時在res目錄新建文件夾xml,放入network_se…

[轉].NET 開源項目 Anet 介紹

使用 Anet 有一段時間了&#xff0c;已經在我的個人網站&#xff08;如 bookist.cc&#xff09;投入使用&#xff0c;目前沒有發現什么大問題&#xff0c;所以才敢寫篇文章向大家介紹。 GitHub 地址&#xff1a; https://github.com/anet-team/anet Anet 是一個 .NET Core 通用…

【天工Godwork精品教程】任務四:EOS正射影像DOM生成,DOM精編

無人機航測精品專欄鏈接:《無人機航空攝影測量精品教程》 【天工Godwork精品教程】任務一:創建工程(導入相片、編輯相機參數、導入POS) 【天工Godwork精品教程】任務二:導入控制點、POS權重設置、自由空三 【天工Godwork精品教程】任務三:刺像控點、空三平差、精度優化調…

強烈推薦國內幾款優秀的開源電商系統

一、背景需求 我玩得好的朋友剛創業&#xff0c;搞電商最一塊&#xff0c;想做個全套的電商框架系統&#xff0c;希望支持公眾號、小程序、H5、pc后臺管理等功能&#xff0c;創業初期資金非常緊張&#xff0c;請開發人員做成本太高&#xff0c;然后就咨詢我&#xff0c;有沒有最…

Maui的學習之路(二)--設置

Maui的學習之路&#xff08;二&#xff09; -- 設置上一篇我們做了Maui的基本介紹&#xff0c;理論上這一篇應該會創建第一個Maui的應用&#xff0c;以便對此進行詳細的評估&#xff0c;并逐步深入。如果你需要進行Maui首個應用的創建&#xff0c;那么歡迎訪問.NET MAUI 創建移…

今天,Java編程周末提高班(第一期)正式結束

Java編程周末提高班&#xff08;第一期&#xff09;&#xff0c;走過了近兩個月歷程&#xff0c;一共同擁有68人次學生周末到老師家進行Java學習與交流。近距離的和一群年輕的學習接觸&#xff0c;收獲非常多&#xff0c;特別是對以后教學的改進。在學習的閑暇。大家自己做飯&a…