接上一篇:《Hystrix介紹》html
下面這幅圖至關重要git
稍微解釋一下上面的流程:github
第一步是構造一個HystrixCommand或HystrixObservableCommand對象來表示對依賴項的請求。例如:緩存
HystrixCommand command = new HystrixCommand(arg1, arg2); HystrixObservableCommand command = new HystrixObservableCommand(arg1, arg2);
你能夠用下列四種中的任意一種方式執行命令:併發
execute()方法是同步執行的,它是調用queue().get()異步
queue()方法是異步執行的,它調用的是toObservable().toBlocking().toFuture()性能
因此最終每一個HystrixCommand都是一個Observable的實現ui
若是請求在緩存中可用,而且該請求對應的響應在緩存中也是可用的,那麼緩存的這個響應將當即以一個Observable的形式被返回spa
當你執行命令的時候,Hystrix檢查斷路器是不是開着的。若是是開着的,那麼Hystrix不會執行命令,而是路由到第8步執行回退邏輯。若是是關着的,將執行第5步,繼續檢查容量是否可用。線程
若是這個命令所關聯的線程池和隊列(或者信號量)是否滿了,若是是,那麼Hystrix不會執行命令,而是當即路由到第8不執行回退邏輯
咱們知道對依賴的調用請求都是封裝成HystrixCommand或者HystrixObservableCommand執行的,而真正執行的邏輯是寫在HystrixObservableCommand.construct()或者HystrixCommand.run()中的:
若是在執行run()或者construct()方法超時,那麼線程將拋出一個TimeoutException。
Hystrix報告成功、失敗、拒絕、超時給斷路器,斷路器維護一組計算統計的計數器。
斷路器用這些統計數據來決定何時應該「跳閘」,此時後續全部的請求都會被短路,直到一個恢復週期耗盡之後在第一次檢查某些健康檢查以後纔會打開電路。
(PS:想象一下生活中的漏電保護器,電壓太高時會自動跳閘,跳閘之後就沒電了,家用電器都用不了了,以後你能夠本身不去合上,固然前提是你不能再用那些大功率電器了,因而來電了)
當命令執行失敗時,Hystrix試圖恢復到您的fallback:當run()或者construct()拋出異常;當因爲斷路器跳閘致使命令被短路;當命令的線程池或隊列容量滿了;或者當命令執行超時。
在HystrixCommand的狀況下,爲了提供回退邏輯,你能夠實現HystrixCommand.getfallback(),它返回一個單一的回退值。
對於HystrixObservableCommand(),爲了提供回退邏輯,你須要實現hystrixobservablecomman.resumewithfallback(),它會返回一個Observable,這個Observable可能返回一個回退值或者多個值。
若是你沒有實現一個fallback方法,或者fallback它本身拋了一個異常,此時Hystrix仍然會返回一個Observable,可是這個Observable什麼都不會推送並當即發送一個onError通知。經過這個onError通知,形成命令失敗的異常會傳回給調用者。
若是Hystrix命令成功,它會返回響應給調用者,或者返回一個Observable。這取決於在第2步的時候你是若是調用命令的。
下圖顯示了HystrixCommand或HystrixObservableCommand是如何與HystrixCircuitBreaker交互的,以及它的邏輯和決策流程,包括斷路器中計數器的行爲。
上面的流程能夠這樣描述:
Hystrix使用隔板模式來隔離彼此的依賴關係,並限制對其中任何一個的併發訪問。
Hystrix使用獨立的、每一個依賴項的線程池做爲約束任何給定依賴項的一種方式,所以底層執行的延遲只會使該池中的可用線程飽和。
你能夠用信號量(或者計數器)來限制對任意依賴項併發調用的數量,代替用線程池的大小。
HystrixCommand 和 HystrixObservableCommand 在兩個地方支持用信號量: