什么是Hystrix?
????在分布式環(huán)境中绘雁,不可避免地會(huì)有許多服務(wù)依賴(lài)項(xiàng)失敗。Hystrix是一個(gè)庫(kù)援所,通過(guò)添加延遲容忍和容錯(cuò)邏輯庐舟,幫助您控制這些分布式服務(wù)之間的交互。Hystrix通過(guò)隔離服務(wù)之間的訪問(wèn)點(diǎn)住拭、停止跨服務(wù)的級(jí)聯(lián)故障并提供回退選項(xiàng)來(lái)實(shí)現(xiàn)這一點(diǎn)挪略,所有這些都可以提高系統(tǒng)的總體彈性。
Hystrix是干什么用的滔岳?
? ? 1 保護(hù)和控制調(diào)用第三方客戶(hù)端庫(kù)的依賴(lài)(通常是通過(guò)網(wǎng)絡(luò))的延遲和失敗杠娱。
? ? 2 防止復(fù)雜分布式系統(tǒng)中的級(jí)聯(lián)故障。
? ? 3 快速失敗和快速恢復(fù)澈蟆。
? ? 4?回退(配置回退方法)并盡可能優(yōu)雅降級(jí)墨辛。
? ? 5?啟用近實(shí)時(shí)監(jiān)視、警報(bào)和操作控制趴俘。
下面講述一個(gè)級(jí)聯(lián)故障的例子睹簇。
? ? 可以看到 App Container服務(wù)調(diào)用了很多的第三方服務(wù)奏赘,當(dāng)服務(wù)都可用的情況下沒(méi)什么問(wèn)題。
但是當(dāng)一個(gè)依賴(lài)的I第三方服務(wù)網(wǎng)絡(luò)調(diào)用延時(shí)或者服務(wù)掛掉的情況下會(huì)導(dǎo)致調(diào)用方用戶(hù)線程阻塞太惠。
????在高流量的情況下磨淌,單個(gè)后端依賴(lài)項(xiàng)(dependency I)的潛在影響可能會(huì)導(dǎo)致所有服務(wù)器(調(diào)用方)上的所有資源在幾秒鐘內(nèi)飽和。
????應(yīng)用程序中通過(guò)網(wǎng)絡(luò)或進(jìn)入客戶(hù)端庫(kù)可能導(dǎo)致網(wǎng)絡(luò)請(qǐng)求的每一點(diǎn)都是潛在故障的根源凿渊。比故障更糟糕的是梁只,這些應(yīng)用程序還會(huì)導(dǎo)致服務(wù)之間的延遲增加,導(dǎo)致更多的級(jí)聯(lián)故障埃脏。
那么豪豬(hystrix)是如何做的呢搪锣?
? ? 1 將對(duì)外部系統(tǒng)(或“依賴(lài)項(xiàng)”)的所有調(diào)用包裝在HystrixCommand或HystrixObservableCommand對(duì)象中,該對(duì)象通常在單獨(dú)的線程中執(zhí)行(這是命令模式的一個(gè)示例)彩掐。
? ? ?2? 超時(shí)調(diào)用的時(shí)間長(zhǎng)于您定義的閾值构舟。有一個(gè)默認(rèn)值,但是對(duì)于大多數(shù)依賴(lài)項(xiàng)堵幽,您可以通過(guò)“屬性”自定義設(shè)置這些超時(shí)狗超,以便它們比每個(gè)依賴(lài)項(xiàng)的99.5%的性能略高。
? ? ?3??為每個(gè)依賴(lài)項(xiàng)維護(hù)一個(gè)小的線程池(或信號(hào)量);如果它已經(jīng)滿了朴下,針對(duì)該依賴(lài)項(xiàng)的請(qǐng)求將立即被拒絕努咐,而不是排隊(duì)。
? ? ?4? 記錄成功殴胧、失敗(客戶(hù)端拋出的異常)渗稍、超時(shí)和線程拒絕。
? ? ?5? 如果服務(wù)的錯(cuò)誤百分比超過(guò)閾值溃肪,可以自動(dòng)或者手動(dòng)的斷開(kāi)斷路器免胃,以在一段時(shí)間內(nèi)停止對(duì)特定服務(wù)的所有請(qǐng)求音五。
? ? ?6? 在請(qǐng)求失敗惫撰、被拒絕、超時(shí)或短路時(shí)執(zhí)行回退邏輯躺涝。
? ? ?7?幾乎實(shí)時(shí)地監(jiān)視度量和配置更改厨钻。
????當(dāng)您使用Hystrix包裝每個(gè)底層依賴(lài)項(xiàng)時(shí),上面圖中所示的體系結(jié)構(gòu)將發(fā)生變化坚嗜,將變成下面的圖夯膀。每個(gè)依賴(lài)項(xiàng)都是相互隔離的,當(dāng)延遲發(fā)生時(shí)苍蔬,分配給被調(diào)用方的資源項(xiàng)(線程池)的資源將會(huì)飽和诱建,將會(huì)觸發(fā)斷路器并調(diào)用預(yù)先設(shè)定的回調(diào)函數(shù),使得不影響調(diào)用方碟绑,并在當(dāng)被調(diào)用方恢復(fù)后會(huì)關(guān)閉短路器俺猿。
下面看看Hystrix的實(shí)現(xiàn)邏輯
? ??
流程如下:
?1? 構(gòu)造一個(gè)HystrixCommand或HystrixObservableCommand對(duì)象
?2??執(zhí)行命令
?3?是否緩存了響應(yīng)
?4 電路打開(kāi)了嗎
5?線程池/隊(duì)列/信號(hào)量是否已滿
6 執(zhí)行HystrixObservableCommand.construct()或HystrixCommand.run()
7?計(jì)算電路健康
8 執(zhí)行回退函數(shù)
9?返回成功響應(yīng)
Circuit Breaker(斷路器)邏輯:
電路開(kāi)閉的條件如下:
1?假設(shè)電路的請(qǐng)求音量滿足域值?HystrixCommandProperties.circuitBreakerRequestVolumeThreshold()
2?假設(shè)誤差百分比超過(guò)閾值誤差百分比?
? ? ? HystrixCommandProperties.circuitBreakerErrorThresholdPercentage()
3?斷路器從閉合過(guò)渡到打開(kāi)
4.?當(dāng)它是開(kāi)著的茎匠,它短路了所有對(duì)斷路器的要求。
5.過(guò)了一段時(shí)間(HystrixCommandProperties.circuitBreakerSleepWindowInMilliseconds())
短路器處于半開(kāi)狀態(tài)押袍,此時(shí)允許1個(gè)請(qǐng)求通過(guò)執(zhí)行诵冒,當(dāng)請(qǐng)求執(zhí)行成功,則短路器從打開(kāi)到閉合谊惭,若此時(shí)請(qǐng)求還是失敗汽馋,則繼續(xù)阻斷所有請(qǐng)求。
參考:https://github.com/Netflix/Hystrix/wiki/How-it-Works#flow1