安裝 可以通過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 位址都是唯一的。原因查詢 通過檢視群集日誌發現,最初的報...