Polly簡介 1 故障處理策略

2021-09-07 16:21:00 字數 3495 閱讀 6803

安裝 可以通過nuget實現快速安裝: install-package polly

基本用法

乙個簡單的示例如下:

varpolicy = policy

.handle()    //

定義所處理的故障

.retry();    //

故障的處理方法

policy.execute(() => dosomething());    //

應用策略

從上面的例子中我們可以看出,使用該策略一般包括三個步驟:

定義所處理的故障

定義故障的處理方法

應用策略

上述**在功能上和下面的**等價:

for(inti= 0;i< 2;i++)

catch(dividebyzeroexception)

} 雖然這個例子比較簡單,帶來的優越性並不明顯,但它以一種比較規範的方式定義了異常的處理策略,一來帶來了更好的體驗,帶來了更好的**可讀性,另外,隨著異常策略的複雜,它所帶來的對**的簡化就更加明顯了。下面就稍微詳細一點的深入介紹一下:

定義錯誤(故障)

常見故障定義方式是指定委託執行過程**現的特定異常,polly中支援異常處理方式如下:

// 處理指定異常

policy.handle();

// 處理有條件的指定異常

policy.handle(ex => ex.number== 1205);

// 處理多種異常

policy.handle()

.or();

// 處理多種有條件的異常

policy.handle(ex => ex.number== 1205)

.or(ex => ex.paramname== "example");

也支援異常的聚合:

policy.handle()

.or();

另外,也支援通過返回值判斷是否故障:

// 指定錯誤的返回值

policy.handleresult(ret => ret <= 0);

故障處理策略:重試

常見的處理策略是重試,polly庫中內建了各種常用的重試策略:

// 重試1次

policy.handle().retry();

// 重試多次

policy.handle().retry(3);

// 無限重試

policy.handle().retryforever();

也支援retry時增加一些額外的行為:

policy.handle().retry(3, (err, countdown, context) =>

); 也支援等待並重試:

// 等待並重試

policy.handle().waitandretry(3, _ => timespan.fromseconds(3));

故障處理策略:回退(fallback)

fallback策略是在遇到故障是指定乙個預設的返回值,

policy.handle().fallback(3);

policy.handle().fallback(() => 3);

當然,遇到沒有返回值的也可以指定故障時的處理方法,

policy.handle().fallback(() => );

使用fallback時,異常**獲,返回預設的返回結果。

ps: 帶引數的fallback處理方式貌似在5.0之後發生了變化,成了本文所示的方式,以前是fallback

故障處理策略:斷路保護(circuit breaker)

circuit breaker也是一種比較常見的處理策略,它可以指定一定時間內最大的故障發生次數,當超過了該故障次數時,在該時間段內,不再執行policy內的委託。下面以乙個簡單的示例演示下該策略的功能:

staticvoidtestpolicy()

catch(polly.circuitbreaker.brokencircuitexceptione)

catch(timeoutexception)}}

staticintindex= 0;

staticintdosomething()

");thrownewtimeoutexception();

} 執行結果如下:

dosomething 0

timeout

dosomething 1

timeout

dosomething 2

timeout

the circuit is now open and is not allowing calls.

the circuit is now open and is not allowing calls.

可以看到,前面3次都能執行委託dosomething,但出錯次數到達3次後,已經進入斷路保護章台,後面兩次呼叫直接返回brokencircuitexception。直到達到保護時間超時後,對策略的呼叫才會再次執行dosomething委託。

這種策略在呼叫遠端服務時非常實用,當一定時間內的呼叫都出錯時,往往可以認為服務提供者已經不可用,後續呼叫完全可以直接失敗,以避免重試的開銷。直到一定時間後才需要再次重試。

相對其它處理策略,circuitbreaker是乙個比較複雜的策略,它是有狀態的,可以通過circuitstate屬性獲取:

varstate = circuitbreaker.circuitstate;

它有四種狀態:

除了超時和策略執行失敗的這種自動方式外,也可以手動控制它的狀態:

// 手動開啟

(且保持

)乙個斷路器

–例如手動隔離

downstream

的服務circuitbreaker.isolate();

// 重置乙個斷路器回

closed

的狀態,可再次接受

actions

的執行circuitbreaker.reset();

故障封裝策略(policywrap)

我們可以通過policywrap的方式,封裝出乙個更加強大的策略:

va***llback = policy.handle().fallback(100);

varretry = policy.handle().retry(2);

varretryandfallback = fallback.wrap(retry);

這個策略就是將retry和fallback組合起來,形成乙個retry and fallback的策略,也可以寫成如下形式:

policy.wrap(fallback, retry);

當執行這個新策略時:

retryandfallback.execute(dosomething);

等價於執行:

fallback.execute(()=> retry.execute(dosomething));

Polly 故障處理策略

polly故障處理策略,記錄 不詳細解釋了 using polly using polly.retry using system using system.collections.generic using system.threading namespace pollydemo console.w...

Polly 彈性和瞬態故障處理庫

polly是一種.net彈性和瞬態故障處理庫,允許我們以非常順暢和執行緒安全的方式來執諸如行重試,斷路,超時,故障恢復等策略。polly針對對.net 4.0,net 4.5和.net standard 1.1以及.net core實現 可以實現熔斷與降級機制 private async taskg...

window集群故障處理1

平台 window server2016上的集群,由一組域控與兩個集群節點組成。故障 ip位址資源,集群位址被用占用,導致集群不可用。如下圖 群集ip位址資源 群集 ip 位址 無法聯機,因為已在網路上檢測到重複 ip 位址。請確保所有 ip 位址都是唯一的。原因查詢 通過檢視群集日誌發現,最初的報...