什么是Hystrix?
Hystrix是一個庫湿故,它通過添加延遲容忍和容錯邏輯來幫助您控制這些分布式服務(wù)之間的交互阿趁。
Hystrix的設(shè)計目的如下:
- 為通過第三方客戶端庫訪問的依賴項(通常通過網(wǎng)絡(luò))提供保護和控制延遲 和故障。
- 停止復(fù)雜分布式系統(tǒng)中的級聯(lián)故障坛猪。
- 故障快速恢復(fù)脖阵。
- 在可能的情況下,后退并優(yōu)雅地降級墅茉。
- 啟用近實時監(jiān)視命黔、警報和操作控制。
Hystrix解決了什么問題?
復(fù)雜分布式體系結(jié)構(gòu)中的應(yīng)用程序有幾十個依賴項就斤,每個依賴項在某個時候都不可避免地會失敗悍募。如果主機應(yīng)用程序沒有從這些外部故障中隔離出來,那么它就有可能與這些外部故障一起宕機战转。
例如搜立,對于一個依賴于30個服務(wù)的應(yīng)用程序,其中每個服務(wù)都有99.99%的正常運行時間槐秧,您可以這樣期望:99.9930 = 99.7%的正常運行時間(10億個請求的0.3%)= 300萬個故障(2小時以上停機/月)啄踊,即使所有依賴項都具有良好的正常運行時間。現(xiàn)實通常更糟,即使當所有依賴項都運行良好時刁标,0.01%的停機時間對幾十個服務(wù)中的每個服務(wù)的總體影響也相當于一個月潛在的停機時間,如果您不為整個系統(tǒng)服務(wù)設(shè)計彈性)颠通。
當一切正常時,請求流可以是這樣的:
當許多后端系統(tǒng)之一成為潛在膀懈,它可以阻止整個用戶請求:
在高并發(fā)下顿锰,一個后端依賴項出現(xiàn)問題,可能會導(dǎo)致所有服務(wù)器上的所有資源在幾秒鐘內(nèi)飽和启搂。應(yīng)用程序中通過網(wǎng)絡(luò)或客戶機庫到達可能導(dǎo)致網(wǎng)絡(luò)請求的每個點都是潛在故障的來源硼控。比故障更糟的是,這些應(yīng)用程序還可能導(dǎo)致服務(wù)之間的延遲增加胳赌,從而備份隊列牢撼、線程和其他系統(tǒng)資源,從而導(dǎo)致系統(tǒng)中出現(xiàn)更多級聯(lián)故障疑苫。
當通過第三方客戶機執(zhí)行網(wǎng)絡(luò)訪問時熏版,這些問題會變得更加嚴重纷责,因為第三方客戶機是一個黑盒子,其中隱藏了實現(xiàn)細節(jié)撼短,并且可以隨時更改再膳,而且每個客戶機庫的網(wǎng)絡(luò)或資源配置都不一樣,而且常常難以監(jiān)控和更改曲横。更糟糕的是傳遞依賴關(guān)系喂柒,它在應(yīng)用程序沒有顯式調(diào)用的情況下執(zhí)行潛在的昂貴或容易出錯的網(wǎng)絡(luò)調(diào)用。網(wǎng)絡(luò)連接失敗或降級胜榔。服務(wù)和服務(wù)器失敗或變慢胳喷。新的庫或服務(wù)部署會更改行為或性能特征∝仓客戶端庫有bug吭露。所有這些都表示需要隔離和管理的故障和延遲,這樣單個故障依賴項就不會導(dǎo)致整個應(yīng)用程序或系統(tǒng)崩潰尊惰。
Hystrix的設(shè)計原則是什么?
Hystrix的工作原理是:
1.防止任何單個依賴項耗盡所有容器(例如Tomcat)的用戶線程讲竿。減少負載,快速失敗弄屡,而不是排隊题禀。
2.在可行的情況下提供回退以保護用戶免受失敗。
3.使用隔離技術(shù)(如隔板膀捷、泳道和斷路器模式)來限制任何一個依賴項的影響迈嘹。
4.通過近乎實時的指標優(yōu)化發(fā)現(xiàn)時間,通過配置更改的低延遲傳播和支持Hystrix的大多數(shù)方面的動態(tài)屬性更改(允許您使用低延遲反饋循環(huán)進行實時操作修改)全庸,監(jiān)視和警報優(yōu)化恢復(fù)時間秀仲。
5.防止整個依賴客戶端執(zhí)行中的失敗,而不僅僅是網(wǎng)絡(luò)流量中的失敗壶笼。
Hystrix是如何實現(xiàn)其目標的?
Hystrix是這樣做的:
- 將對外部系統(tǒng)(或“依賴項”)的所有調(diào)用封裝在一個HystrixCommand或HystrixObservableCommand對象中神僵,該對象通常在單獨的線程中執(zhí)行(這是命令模式的一個例子)。
- 超時調(diào)用所花費的時間超過您定義的閾值覆劈。有一個默認值保礼,但是對于大多數(shù)依賴項,您可以通過“屬性”自定義設(shè)置這些超時责语,以便它們比每個依賴項測量到的99.5%的性能稍微高一些炮障。
- 為每個依賴項維護一個小線程池(或信號量);如果它滿了,針對該依賴項的請求將立即被拒絕坤候,而不是排隊铝阐。
- 度量成功、失敗(客戶機拋出的異常)铐拐、超時和線程拒絕徘键。
- 斷開斷路器,在一段時間內(nèi)停止對特定服務(wù)的所有請求遍蟋,如果服務(wù)的錯誤率超過閾值吹害,則手動或自動停止。
- 當請求失敗虚青、被拒絕它呀、超時或短路時執(zhí)行回退邏輯。
- 幾乎實時地監(jiān)視度量和配置更改棒厘。
當您使用Hystrix來包裝每個底層依賴項時纵穿,如上面的關(guān)系圖所示的體系結(jié)構(gòu)會發(fā)生類似下面的關(guān)系圖的變化。每個依賴項彼此隔離奢人,當延遲發(fā)生時受資源限制谓媒,資源可能會飽和,當依賴項中出現(xiàn)任何類型的故障時何乎,由回退邏輯決定響應(yīng):