前言
高可用相關的技術以及架構,對于大型復雜的分布式系統,是非常重要的。而高可用架構中,非常重要的一個環節,就是如何將分布式系統中的各個服務打造成高可用的服務,從而足以應對分布式系統環境中的各種各樣的問題,比如服務間的調用超時,或者服務間的調用失敗,避免整個分布式系統被某個服務的故障給拖垮。而要解決這些棘手的分布式系統可用性問題,就涉及到了高可用分布式系統中的很多重要的技術,包括資源隔離,限流與過載保護,熔斷,優雅降級,容錯,超時控制,監控運維,等等。而行業中大部分的朋友,對高可用系統架構以及相關的技術并沒有太多的了解,這也成為了你設計一個復雜的高可用系統架構,或者面試高階Java職位時的一個重要阻礙。
在行業中,實現高可用架構的非常流行和重要的框架就是Hystrix,是國外知名的視頻網站Netflix所開源的。Hystrix能夠完美的解決分布式系統架構中,打造高可用服務面臨的一系列技術難題,包括資源隔離,限流與過載保護,熔斷,優雅降級,容錯,超時控制,監控運維等等。
斷路器-Hystrix的深入了解
工作流程(參考:https://github.com/Netflix/Hystrix/wiki/How-it-Works)
1、 創建一個 HystrixCommand 或 HystrixObservableCommand 實例
第一步就是構建一個 HystrixCommand 或 HystrixObservableCommand 實例來向其它組件發出操作請求,通過構造方法來創建實例。
HystrixCommand:返回一個單響應
HystrixObservableCommand:返回一個觀察者發出的響應
2、 執行方法
這里有4個方法,前兩個只適用于 HystrixCommand 不適用于 HystrixObservableCommand
execute():阻塞型方法,返回單個結果(或者拋出異常)
queue():異步方法,返回一個 Future 對象,可以從中取出單個結果(或者拋出異常)
- observe():返回Observable 對象
toObservable():返回Observable 對象
3、 緩存判斷
檢查緩存內是否有對應指令的結果,如果有的話,將緩存的結果直接以 Observable 對象的形式返回
4、 斷路器判斷
檢查Circuit Breaker的狀態。如果Circuit Breaker的狀態為開啟狀態,Hystrix將不會執行對應指令,而是直接進入失敗處理狀態(圖中8)。如果Circuit Breaker的狀態為關閉狀態,Hystrix會繼續執行(圖5)
5、 線程池、任務隊列、信號量的檢查
確認是否有足夠的資源執行操作指令。當線程池和隊列(或者是信號量,當不使用線程池隔離模式的時候)資源滿的時候,Hystrix將不會執行對應指令并且會直接進入失敗處理狀態(圖8)
6、 HystrixObservableCommand.construct() 和 HystrixCommand.run()
如果資源充足,Hystrix將會執行操作指令。操作指令的調用最終都會到這兩個方法:
HystrixCommand.run():返回一個響應或者拋出一個異常
HystrixObservableCommand.construct():返回一個可觀測的發出響應(s)或發送一個onError通知
如果執行指令的時間超時,執行線程會拋出 TimeoutException 異常。Hystrix會拋棄結果并直接進入失敗處理狀態。如果執行指令成功,Hystrix會進行一系列的數據記錄,然后返回執行的結果。
7、 統計斷路器的健康情況
Hystrix會根據記錄的數據來計算失敗比率,一旦失敗比率達到某一閾值將自動開啟Circuit Breaker
8、 回退
如果我們在Command中實現了HystrixCommand.getFallback()方法(或HystrixObservableCommand. resumeWithFallback() 方法,Hystrix會返回對應方法的結果。如果沒有實現這些方法的話,仍然 Hystrix會返回一個空的 Observable 對象,并且可以通過 onError 來終止并處理錯誤。
調用不同的方法返回不同的結果:
execute(): 將會拋出異常
queue(): 將會返回一個Future 對象,如果調用它的get()方法將會拋出異常
- observe()和 toObservable():都會返回上述的 Observable 對象
9、 返回成功
如果Hystrix執行成功,返回的響應取決于在步驟2中調用命令。
execute():阻塞型方法,返回單個結果(或者拋出異常)
queue():異步方法,返回一個 Future 對象,可以從中取出單個結果(或者拋出異常)
- observe():返回Observable 對象
toObservable():返回Observable 對象
斷路器的工作原理
斷路器開啟或者關閉的條件:
1、 當滿足一定的閥值的時候(默認10秒內超過20個請求次數)
2、 當失敗率達到一定的時候(默認10秒內超過50%的請求失敗)
3、 到達以上閥值,斷路器將會開啟
4、 當開啟的時候,所有請求都不會進行轉發
5、 一段時間之后(默認是5秒),這個時候斷路器是半開狀態,會讓其中一個請求進行轉發。如果成功,斷路器會關閉,若失敗,繼續開啟。重復4和5。
HystrixCircuitBreaker源碼分析
如果是對Hystrix技術感興趣的話,建議可以參考下這個免費的視頻資料,這是一個基于Hystrix技術的高可用架構的項目實戰免費課程,課程都是用每日上億流量的大型電商網站中的商品詳情頁系統中的緩存服務,作為項目實戰。學習地址
文章列表