hystrix.png
Hystrix是什么
在分布式環(huán)境中蛹头,服務(wù)間依賴調(diào)用必然會(huì)有一些失敗嫩痰。Hystrix是Netflix開源的一個(gè)Java庫遵堵,通過添加延遲容忍和容錯(cuò)邏輯晚伙,幫助你控制這些分布式服務(wù)之間的交互。Hystrix通過隔離服務(wù)之間的訪問點(diǎn)拷窜、停止級(jí)聯(lián)失敗和提供回退選項(xiàng)來實(shí)現(xiàn)這一點(diǎn)开皿,所有這些都可以提高系統(tǒng)的整體伸縮性和穩(wěn)定性。
Hystrix的設(shè)計(jì)目標(biāo)
- 客戶端通過對(duì)下游服務(wù)調(diào)用的延遲和故障進(jìn)行隔離與控制篮昧;
- 在復(fù)雜的分布式系統(tǒng)中阻止級(jí)聯(lián)故障赋荆;
- 快速失敗,快速恢復(fù)懊昨;
- 回退窄潭,盡可能優(yōu)雅地降級(jí);
- 啟用近實(shí)時(shí)監(jiān)控疚颊、警報(bào)和操作控制狈孔。
Hystrix作用描述
復(fù)雜分布式體系結(jié)構(gòu)中的應(yīng)用程序有許多依賴項(xiàng)信认,每個(gè)依賴項(xiàng)在某些時(shí)候都不可避免地會(huì)失敗材义。如果程序沒有引入外部故障隔離措施,那么它有可能被下游拖垮嫁赏。
正常情況下
image.png
當(dāng)其中有一個(gè)系統(tǒng)有延遲時(shí)其掂,它可能阻塞整個(gè)用戶請(qǐng)求
image.png
在高流量的情況下,一個(gè)后端依賴項(xiàng)的延遲可能導(dǎo)致所有服務(wù)器上的所有資源在數(shù)秒內(nèi)飽和(PS:意味著后續(xù)再有請(qǐng)求將無法立即提供服務(wù))
image.png
舉例說明:
對(duì)于一個(gè)依賴于30個(gè)服務(wù)的應(yīng)用程序潦蝇,每個(gè)服務(wù)99.99%的時(shí)間都是正常運(yùn)行款熬,程序健康期望值如下:
?????99.99 ^ 30 = 99.7% 可用
?????也就是說100個(gè)請(qǐng)求3個(gè)會(huì)失敗
?????換種說法 365 * 0.003 / 12 * 24 = 2.19 每個(gè)月有2個(gè)小時(shí)服務(wù)是不可用的
現(xiàn)實(shí)通常更糟糕!
Hystrix設(shè)計(jì)原則是什么
- 防止任何單個(gè)依賴項(xiàng)耗盡所有容器(如Jetty)工作線程攘乒。
- 甩掉包袱贤牛,快速失敗而不是排隊(duì)。
- 在任何可行的地方提供回退则酝,以保護(hù)用戶不受失敗的影響殉簸。
- 使用隔離技術(shù)(如隔離板、泳道和斷路器模式)來限制任何一個(gè)依-
賴項(xiàng)的影響。 - 通過近實(shí)時(shí)的度量般卑、監(jiān)視和警報(bào)來優(yōu)化發(fā)現(xiàn)時(shí)間武鲁。
- 通過配置的低延遲傳播來優(yōu)化恢復(fù)時(shí)間。
- 支持對(duì)Hystrix的大多數(shù)方面的動(dòng)態(tài)屬性更改蝠检,允許使用低延遲反饋- 循環(huán)進(jìn)行實(shí)時(shí)操作修改沐鼠。
- 避免在整個(gè)依賴客戶端執(zhí)行中出現(xiàn)故障,而不僅僅是在網(wǎng)絡(luò)流量中叹谁。
Hystrix是如何實(shí)現(xiàn)它的目標(biāo)的
- 用一個(gè)HystrixCommand 或者 HystrixObservableCommand (這是命令模式的一個(gè)例子)包裝所有的對(duì)外部系統(tǒng)(或者依賴)的調(diào)用饲梭,典型地它們?cè)谝粋€(gè)單獨(dú)的線程中執(zhí)行
2.調(diào)用超時(shí)時(shí)間比你自己定義的閾值要長。有一個(gè)默認(rèn)值本慕,對(duì)于大多數(shù)的依賴項(xiàng)你是可以自定義超時(shí)時(shí)間的排拷。 - 為每個(gè)依賴項(xiàng)維護(hù)一個(gè)小的線程池(或信號(hào)量);如果線程池滿了锅尘,那么該依賴性將會(huì)立即拒絕請(qǐng)求监氢,而不是排隊(duì)。
- 調(diào)用的結(jié)果有這么幾種:成功藤违、失斃烁(客戶端拋出異常)、超時(shí)顿乒、拒絕议街。
- 在一段時(shí)間內(nèi),如果服務(wù)的錯(cuò)誤百分比超過了一個(gè)閾值璧榄,就會(huì)觸發(fā)一個(gè)斷路器來停止對(duì)特定服務(wù)的所有請(qǐng)求特漩,無論是手動(dòng)的還是自動(dòng)的。
- 當(dāng)請(qǐng)求失敗骨杂、被拒絕涂身、超時(shí)或短路時(shí),執(zhí)行回退邏輯搓蚪。
近實(shí)時(shí)監(jiān)控指標(biāo)和配置變化蛤售。
當(dāng)使用Hystrix來包裝每個(gè)依賴項(xiàng)時(shí),上圖中的架構(gòu)會(huì)發(fā)生變化妒潭,每個(gè)依賴項(xiàng)相互隔離悴能,當(dāng)延遲發(fā)生時(shí),它會(huì)被限制在資源中雳灾,并包含回退邏輯漠酿,該邏輯決定了在依賴項(xiàng)中發(fā)生任何類型的故障時(shí)應(yīng)作出何種響應(yīng),如下圖所示:
image.png