Hystrix是什么?
在分布式系統中,每個服務都可能會調用很多其他服務,被調用的那些服務就是依賴服務,有的時候某些依賴服務出現故障也是很常見的。
Hystrix 可以讓我們在分布式系統中對服務間的調用進行控制,加入一些調用延遲或者依賴故障的容錯機制。Hystrix 通過將依賴服務進行資源隔離,進而阻止某個依賴服務出現故障時在整個系統所有的依賴服務調用中進行蔓延;同時Hystrix 還提供故障時的 fallback 降級機制。
總而言之,Hystrix 通過這些方法幫助我們提升分布式系統的可用性和穩定性。
Hystrix 的設計原則
-
對依賴服務調用時出現的調用延遲和調用失敗進行控制和容錯保護。
-
在復雜的分布式系統中,阻止某一個依賴服務的故障在整個系統中蔓延。比如某一個服務故障了,導致其它服務也跟着故障。
-
提供 fail-fast(快速失敗)和快速恢復的支持。
-
提供 fallback 優雅降級的支持。
-
支持近實時的監控、報警以及運維操作。
舉個例子:
有一個分布式系統,服務A依賴於服務B,服務B依賴於服務C/D/E。在這樣一個成熟的系統內,比如說最多可能只有100個線程資源。正常情況下,40個線程並發調用服務C,各30個線程並發調用 D/E。
調用服務 C,只需要 20ms,現在因為服務C故障了,比如延遲,或者掛了,此時線程會吊住2s左右。40個線程全部被卡住,由於請求不斷涌入,其它的線程也用來調用服務 C,同樣也會被卡住。這樣導致服務B的線程資源被耗盡,無法接收新的請求,甚至可能因為大量線程不斷的運轉,導致自己宕機。服務A也掛了。
Hystrix可以對其進行資源隔離,比如限制服務B只有40個線程調用服務C。當此40個線程被hang住時,其它60個線程依然能正常調用工作。從而確保整個系統不會被拖垮。
Hystrix 更加細節的設計原則
-
阻止任何一個依賴服務耗盡所有的資源,比如 tomcat 中的所有線程資源。
-
避免請求排隊和積壓,采用限流和 fail fast 來控制故障。
-
提供 fallback 降級機制來應對故障。
-
使用資源隔離技術,比如 bulkhead(艙壁隔離技術)、swimlane(泳道技術)、circuit breaker(斷路技術)來限制任何一個依賴服務的故障的影響。
-
通過近實時的統計/監控/報警功能,來提高故障發現的速度。
-
通過近實時的屬性和配置熱修改功能,來提高故障處理和恢復的速度。
-
保護依賴服務調用的所有故障情況,而不僅僅只是網絡故障情況。