什么是熔斷器
熔斷器扑眉,原本是電路中在電器發(fā)生短路時的防止電路過載的開關裝置纸泄,它切斷發(fā)生短路的電路,從而防止因電路過載導致的發(fā)熱起火等災難的發(fā)生腰素。同樣的聘裁,在為服務中也可能出現(xiàn)類似電路中短路的事故發(fā)生,所以為了防止類似的災難的發(fā)生弓千,Hystrix(微服中的熔斷器)為此而被設計出來衡便。
官方的定義
以下是官方對hystrix的定義:
In a distributed environment, inevitably some of the many service dependencies will fail. Hystrix is a library that helps you control the interactions between these distributed services by adding latency tolerance and fault tolerance logic. Hystrix does this by isolating points of access between the services, stopping cascading failures across them, and providing fallback options, all of which improve your system’s overall resiliency.
以下是我的翻譯:
在分布式環(huán)境中,服務之間的調用不可避免地會失斞蠓谩(網(wǎng)絡原因镣陕、服務器異常等 )。Hystrix是一個在分布式環(huán)境中通過增加延遲性和容錯來幫助你控制這些服務之間的交互姻政。Hystrix是通過隔離服務之間的訪問呆抑,阻止服務間的連鎖故障,并提供可選項配置扶歪,所有這些旨在提高您微服系統(tǒng)的整體彈性理肺。
(以上僅表示我個人的翻譯,如果有高見歡迎評論)
Hystrix的歷史
Hystrix是由Netflix Api團隊的一個開始于2011年提高服務彈性的項目演變而來的善镰,在2012年Hystrix不斷的發(fā)展和成熟妹萨,在Netflix團隊中也有越來越多的項目使用到Hystrix.如今,在Netflix每天有成千上萬的線程分離和數(shù)百億的信號分離的調用是通過Hystrix完成的炫欺。也因此系統(tǒng)的正常運行時間和彈性得到了顯著的提高乎完。
Hystrix被設計用來做什么?
- 提供保護和控制過度的延遲和依賴失敗品洛。
- 在復雜的分布式系統(tǒng)中防止級聯(lián)失敗树姨。
- 使失敗快速結束和快速恢復(Fail fast and rapidly recover)摩桶。
- 回退和盡可能優(yōu)雅的降級。
- 提供短近乎實時的監(jiān)控帽揪、警報和操作控制硝清。
Hystrix可以解決什么問題?
在官方文檔的介紹中舉了一個這樣的例子转晰,假設一個應用依賴30個微服務芦拿,并且這30個微服的正常運行時間高達99.99%(這對于一個微服來說表現(xiàn)已經(jīng)很不錯了)。這樣的情況下查邢,我們能得到這樣的結論:
- 99.99的30次方 = 99.7% 正常運行時間
- 如果有10億次請求則有3,000,000次的失敗請求
- 即使所依賴的30個服務都表現(xiàn)很棒蔗崎,每個月還是有2小時的停機時間
這是在我們假設的依賴的服務表現(xiàn)很棒的情況下,還是會有每月2小時的宕機扰藕,在實際的生產(chǎn)環(huán)境中情況肯定要比這個更糟糕缓苛,尤其對于一些金融或是對服務穩(wěn)定要求較高的行業(yè),這樣的情況是不能允許的邓深。由此可見Hystrix在微服中的重要作用未桥。
如果所有的服務時健康的那么請求的流程如下圖:
在流程圖中一個關于用戶的請求依賴A H I P四個服務,如果這4個服務中有個服務請求超時了庐完,那么這將會導致整個用戶請求的阻塞钢属,如果在一秒內有50個以上的這樣的請求執(zhí)行,那么以為意味著會有50個以上的請求在這秒時阻塞的,這將消耗大量的線程门躯。如下圖所示:
對于高訪問量的服務來說淆党,這個問題會導致,服務的資源在短時間內被耗盡讶凉。
當涉及到與第三方后臺進行交互時染乌,這些情況會變得更加糟糕。
網(wǎng)絡連接失敗或降級懂讯、服務的失敗或變慢荷憋、配置或是性能的優(yōu)化導致的服務的重新部署、客服端庫的bug,所有的這些失敗或是延遲的問題都需要被隔離和管理從而防止因某個單一的錯誤拖垮整個微服系統(tǒng)褐望。
Hystrix是依據(jù)怎樣的設計原則勒庄?
- 防止微服中某個單一服務,消耗掉容器(如 tomcat)的所有用戶線程瘫里。
- 減少負載和快速失敗而不是排隊实蔽。
- 采用隔離技術(如bulkhead, swimlane,和斷路器模式)來限制任何一個依賴性的影響谨读。
- 通過實時指標局装、監(jiān)視和警報來優(yōu)化發(fā)現(xiàn)時間。
- 在打多算方面支持動態(tài)特性改變和配置變化的低延遲傳播從而達到優(yōu)化回復時間的目的,所以Hytrix允許您以低延遲反饋循環(huán)進行實時操作修改.
- 保護整個依賴客戶端執(zhí)行中的失敗铐尚,而不僅僅是在網(wǎng)絡流量中拨脉。
Hystrix是如何實現(xiàn)這些目標的?
- Hystrix 在 HystrixCommand 和 HystrixObservableCommand類 中包裝所有的對依賴服務的調用宣增,這些調用通常在一個單獨線程中執(zhí)行玫膀。(Hystrix在這用的是“命令模式”的設計模式)
- 調用時間超過我們設置的超時時間才會被認定為超時,當然超時時間有默認值统舀,但是對于大多數(shù)依賴項匆骗,您可以通過“屬性”來自定義這些超時值,以使它們比每個依賴項的實測99.5%百分點性能略高誉简。
- 為每個依賴維護一個小的線程池(或信號量);
如果它變滿了,發(fā)往這個依賴關系的請求將被立即拒絕而不是排隊盟广。 - 衡量成功闷串,失敗(客戶端拋出的異常)筋量,超時和線程拒絕烹吵。
- 跳閘斷路器可以在一段時間內停止對特定服務的所有請求,無論是手動還是自動桨武,如果服務的錯誤百分比超過閾值肋拔。
- 當請求失敗被拒絕、超時或短路時執(zhí)行備用邏輯呀酸。
- 近乎實時的監(jiān)控指標和配置的更改凉蜂。
如下如圖調用外部的依賴服務必須通過包裝的command,然后通過command實現(xiàn)真正的調用。
Hystrix工作的流程
下圖顯示了通過Hystrix向依賴服務發(fā)出請求的流程
總結
這篇文章其實大部分是依據(jù)官方文檔對Hystrix的介紹來寫的性誉,當中有我個人的理解窿吩,也可以把它作為官方介紹的中文版翻譯來看。文章中如有錯誤的地方歡迎留言错览,如果覺得這篇文章對您有用纫雁,歡迎點贊。
參考
Hystrix官方文檔介紹 https://github.com/Netflix/Hystrix/wiki