斷路器(Curcuit Breaker)模式


在分布式環境下,特別是微服務結構的分布式系統中, 一個軟件系統調用另外一個遠程系統是非常普遍的。這種遠程調用的被調用方可能是另外一個進程,或者是跨網路的另外一台主機, 這種遠程的調用和進程的內部調用最大的區別是,遠程調用可能會失敗,或者掛起而沒有任何回應,直到超時。更壞的情況是, 如果有多個調用者對同一個掛起的服務進行調用,那么就很有可能的是一個服務的超時等待迅速蔓延到整個分布式系統,引起連鎖反應, 從而消耗掉整個分布式系統大量資源。最終可能導致系統癱瘓。

斷路器(Circuit Breaker)模式就是為了防止在分布式系統中出現這種瀑布似的連鎖反應導致的災難。

一旦某個電器出問題,為了防止災難,電路的保險絲就會熔斷。斷路器類似於電路的保險絲, 實現思路非常簡單,可以將需要保護的遠程服務嗲用封裝起來,在內部監聽失敗次數, 一旦失敗次數達到某閥值后,所有后續對該服務的調用,斷路器截獲后都直接返回錯誤到調用方,而不會繼續調用已經出問題的服務, 從而達到保護調用方的目的, 整個系統也就不會出現因為超時而產生的瀑布式連鎖反應。

1. 基本模式

上圖是斷路器(Curcuit Breaker)的結構,它有兩個基本狀態(close和open)和一個基本trip動作:

close狀態下, client向supplier發起的服務請求, 直接無阻礙通過斷路器, supplier的返回值接直接由斷路器交回給client.

open狀態下,client向supplier發起的服務請求后,斷路器不會將請求轉到supplier, 而是直接返回client, client和supplier之間的通路是斷的

trip: 在close狀態下,如果supplier持續超時報錯, 達到規定的閥值后,斷路器就發生trip, 之后斷路器狀態就會從close進入open.

 2. 擴展模式

基本的斷路器模式下,保證了斷路器在open狀態時,保護supplier不會被調用, 但我們還需要額外的措施可以在supplier恢復服務后,可以重置斷路器。一種可行的辦法是斷路器定期探測supplier的服務是否恢復, 一但恢復, 就將狀態設置成close。斷路器進行重試時的狀態為半開(half-open)狀態。

3. 斷路器的使用場合:

一個supplier一般很穩定,如果一旦故障發生后, 檢查和恢復需要的時間比較長,通常無法短時間內快速修復的,那么這種服務比較適合采用斷路器模式。否則很可能導致ping-pong效應。

3. 斷路器不適合的場合:

 為了防止一個應用程序試圖調用一個遠程服務或訪問共享資源,如果​​該操作是極有可能失敗, 這種模式可能不適合。 

對於處理中的應用程序訪問本地專用資源,例如在存儲器內數據結構。在這種環境下通常也不適合,使用斷路器只會增加系統開銷。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM