Hystrix介紹

開(kāi)篇

?對(duì)Hystrix耳聞已久甸私,最近剛好想在項(xiàng)目中使用這個(gè)神器就順帶研究了一把帆赢,很多細(xì)節(jié)來(lái)不及深入研究只能把宏觀上的各個(gè)概念講解一下颈抚,這個(gè)介紹的素材大都來(lái)自github上的Hystrix官網(wǎng)蝌借。

?所謂一圖勝千言衙传,但凡能夠用圖片來(lái)表示而且能夠表示清楚的嘱支,就不多用文字描述了蚓胸,看圖肯定比看文字要讓人來(lái)的更爽一些。當(dāng)然我還是非常建議去github上的Hystrix官方wiki去看原汁原味的文檔除师,在參考文獻(xiàn)部分已經(jīng)給出了鏈接沛膳。

?最后提一點(diǎn),就是在Hystrix的實(shí)現(xiàn)當(dāng)中大量使用了RxJava的開(kāi)源包的技術(shù)馍盟,這個(gè)技術(shù)之前沒(méi)怎么研究過(guò)于置,所以后面的很多源碼的分析更多側(cè)重過(guò)程分析而不會(huì)深入細(xì)節(jié),有興趣的可以自己深入研究下贞岭,我就準(zhǔn)備哪天得空好好去研究一下八毯,畢竟RxJava這個(gè)東西號(hào)稱是一個(gè)通過(guò)使用可觀察序列來(lái)編寫(xiě)異步和基于事件的程序的庫(kù)。


Hystrix的設(shè)計(jì)理念

  • Give protection from and control over latency and failure from dependencies accessed (typically over the network) via third-party client libraries.
    給依賴于第三方庫(kù)的應(yīng)用程序提供給保護(hù)
  • Stop cascading failures in a complex distributed system.
    在復(fù)雜的分布式系統(tǒng)當(dāng)中避免級(jí)聯(lián)失敗
  • Fail fast and rapidly recover.
    快速失敗并且快速恢復(fù)
  • Fallback and gracefully degrade when possible.
    在可能的情況下提供回退和優(yōu)雅降級(jí)的能力
  • Enable near real-time monitoring, alerting, and operational control.
    通過(guò)近乎實(shí)時(shí)的指標(biāo)瞄桨,監(jiān)控和警報(bào)來(lái)優(yōu)化發(fā)現(xiàn)故障的時(shí)間话速。


Hystrix提供的能力

?hystrix的出現(xiàn)即為解決雪崩效應(yīng),它通過(guò)四個(gè)方面的機(jī)制來(lái)解決這個(gè)問(wèn)題

  • 隔離(線程池隔離和信號(hào)量隔離):限制調(diào)用分布式服務(wù)的資源使用芯侥,某一個(gè)調(diào)用的服務(wù)出現(xiàn)問(wèn)題不會(huì)影響其他服務(wù)調(diào)用泊交。
  • 優(yōu)雅的降級(jí)機(jī)制:超時(shí)降級(jí)、資源不足時(shí)(線程或信號(hào)量)降級(jí)柱查,降級(jí)后可以配合降級(jí)接口返回托底數(shù)據(jù)廓俭。
  • 熔斷:當(dāng)失敗率達(dá)到閥值自動(dòng)觸發(fā)降級(jí)(如因網(wǎng)絡(luò)故障/超時(shí)造成的失敗率高),熔斷器觸發(fā)的快速失敗會(huì)進(jìn)行快速恢復(fù)唉工。
  • 緩存:提供了請(qǐng)求緩存研乒、請(qǐng)求合并實(shí)現(xiàn)。
  • 支持實(shí)時(shí)監(jiān)控淋硝、報(bào)警雹熬、控制


Hystrix-隔離

隔離

?Hystrix的隔離主要是為每個(gè)依賴組件提供一個(gè)隔離的線程環(huán)境,提供兩種模式的隔離:

    1. 線程池隔離模式:使用一個(gè)線程池來(lái)存儲(chǔ)當(dāng)前的請(qǐng)求谣膳,線程池對(duì)請(qǐng)求作處理竿报,設(shè)置任務(wù)返回處理超時(shí)時(shí)間,堆積的請(qǐng)求堆積入線程池隊(duì)列继谚。這種方式需要為每個(gè)依賴的服務(wù)申請(qǐng)線程池烈菌,有一定的資源消耗,好處是可以應(yīng)對(duì)突發(fā)流量(流量洪峰來(lái)臨時(shí),處理不完可將數(shù)據(jù)存儲(chǔ)到線程池隊(duì)里慢慢處理)
    1. 信號(hào)量隔離模式:使用一個(gè)原子計(jì)數(shù)器(或信號(hào)量)來(lái)記錄當(dāng)前有多少個(gè)線程在運(yùn)行僧界,請(qǐng)求來(lái)先判斷計(jì)數(shù)器的數(shù)值侨嘀,若超過(guò)設(shè)置的最大線程個(gè)數(shù)則丟棄改類型的新請(qǐng)求,若不超過(guò)則執(zhí)行計(jì)數(shù)操作請(qǐng)求來(lái)計(jì)數(shù)器+1捂襟,請(qǐng)求返回計(jì)數(shù)器-1咬腕。這種方式是嚴(yán)格的控制線程且立即返回模式,無(wú)法應(yīng)對(duì)突發(fā)流量(流量洪峰來(lái)臨時(shí)葬荷,處理的線程超過(guò)數(shù)量涨共,其他的請(qǐng)求會(huì)直接返回,不繼續(xù)去請(qǐng)求依賴的服務(wù))
線程池隔離 信號(hào)量隔離
線程 與調(diào)用線程不相同線程 與調(diào)用線程相同
開(kāi)銷 排隊(duì)宠漩、調(diào)度举反、上下文開(kāi)銷等 無(wú)線程切換,開(kāi)銷低
異步 支持 不支持
并發(fā)支持 支持(最大線程池大邪怯酢) 支持(最大信號(hào)量上限)


Hystrix-熔斷器

熔斷器

?Hystrix的熔斷器其實(shí)可以理解為就是一個(gè)統(tǒng)計(jì)中心火鼻,統(tǒng)計(jì)一定時(shí)間窗口內(nèi)訪問(wèn)次數(shù),成功次數(shù)雕崩,失敗次數(shù)等數(shù)值判定是否發(fā)生熔斷魁索。發(fā)生電路熔斷的過(guò)程如下:

    1. 假設(shè)電路上的音量達(dá)到一定閾值(HystrixCommandProperties.circuitBreakerRequestVolumeThreshold)
    1. 并假設(shè)錯(cuò)誤百分比超過(guò)閾值錯(cuò)誤百分比(HystrixCommandProperties.circuitBreakerErrorThresholdPercentage)
    1. 然后斷路器從CLOSED轉(zhuǎn)換到OPEN。
    1. 它是開(kāi)放的盼铁,它使所有針對(duì)該斷路器的請(qǐng)求短路粗蔚。
    1. 經(jīng)過(guò)一段時(shí)間(HystrixCommandProperties.circuitBreakerSleepWindowInMilliseconds),下一個(gè)單個(gè)請(qǐng)求是通過(guò)(這是HALF-OPEN狀態(tài))饶火。 如果請(qǐng)求失敗鹏控,斷路器將在睡眠窗口持續(xù)時(shí)間內(nèi)返回到OPEN狀態(tài)。 如果請(qǐng)求成功肤寝,斷路器將轉(zhuǎn)換到CLOSED当辐,邏輯1.重新接管。


Hystrix工作流程

Hystrix工作流程
    1. 構(gòu)建一個(gè)HystrixCommand或者HystrixObservableCommand 對(duì)象鲤看。
    1. 執(zhí)行Command
    1. 響應(yīng)是否有緩存缘揪?如果為該命令啟用請(qǐng)求緩存,并且如果緩存中對(duì)該請(qǐng)求的響應(yīng)可用刨摩,則此緩存響應(yīng)將立即以“可觀察”的形式返回寺晌。
    1. 熔斷器是否打開(kāi)世吨?如果電路打開(kāi)(或“跳閘”)澡刹,則Hystrix將不會(huì)執(zhí)行該命令,但會(huì)將流程路由到(8)獲取回退耘婚。如果電路關(guān)閉罢浇,則流程進(jìn)行到(5)以檢查是否有可用于運(yùn)行命令的容量。
    1. 線程池/隊(duì)列/信號(hào)量是否已經(jīng)滿負(fù)載?如果與命令相關(guān)聯(lián)的線程池和隊(duì)列(或信號(hào)量嚷闭,如果不在線程中運(yùn)行)已滿攒岛,則Hystrix將不會(huì)執(zhí)行該命令,但將立即將流程路由到(8)獲取回退胞锰。
    1. 執(zhí)行真正的命令部分灾锯,HystrixObservableCommand.construct() 或者 HystrixCommand.run(),在這里Hystrix通過(guò)您為此目的編寫(xiě)的方法調(diào)用對(duì)依賴關(guān)系的請(qǐng)求嗅榕。如果run或construct方法超出了命令的超時(shí)值顺饮,則該線程將拋出一個(gè)TimeoutException, 在這種情況下,Hystrix將響應(yīng)通過(guò)8進(jìn)行路由凌那。獲取Fallback兼雄,如果該方法不取消/中斷,它會(huì)丟棄最終返回值run()或construct()方法帽蝶。
    1. 計(jì)算Circuit 的健康赦肋,Hystrix向斷路器報(bào)告成功,失敗励稳,拒絕和超時(shí)佃乘,該斷路器維護(hù)了一系列的計(jì)算統(tǒng)計(jì)數(shù)據(jù)組。它使用這些統(tǒng)計(jì)信息來(lái)確定電路何時(shí)“跳閘”麦锯,此時(shí)短路任何后續(xù)請(qǐng)求直到恢復(fù)時(shí)間過(guò)去恕稠,在首次檢查某些健康檢查之后,它再次關(guān)閉電路扶欣。
    1. 獲取Fallback鹅巍,當(dāng)命令執(zhí)行失敗時(shí),Hystrix試圖恢復(fù)到你的回退:當(dāng)construct或run拋出異常時(shí)[6]料祠,當(dāng)命令由于電路斷開(kāi)而短路時(shí)[4]骆捧,當(dāng)命令的線程池和隊(duì)列或信號(hào)量處于容量[5],或者當(dāng)命令超過(guò)其超時(shí)長(zhǎng)度時(shí)[6]髓绽。
    1. 返回成功的響應(yīng)敛苇,如果 Hystrix command成功,如果Hystrix命令成功,它將以O(shè)bservable的形式返回對(duì)呼叫者的響應(yīng)或響應(yīng)邓夕。


參考文獻(xiàn)

hystrix工作原理-英文版
hystrix工作原理-中文版
關(guān)于RxJava的詳解

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末禽笑,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子来涨,更是在濱河造成了極大的恐慌,老刑警劉巖启盛,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蹦掐,死亡現(xiàn)場(chǎng)離奇詭異技羔,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)卧抗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)藤滥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人社裆,你說(shuō)我怎么就攤上這事拙绊。” “怎么了泳秀?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵时呀,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我晶默,道長(zhǎng)谨娜,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任磺陡,我火速辦了婚禮趴梢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘币他。我一直安慰自己坞靶,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布蝴悉。 她就那樣靜靜地躺著彰阴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拍冠。 梳的紋絲不亂的頭發(fā)上尿这,一...
    開(kāi)封第一講書(shū)人閱讀 51,578評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音庆杜,去河邊找鬼射众。 笑死,一個(gè)胖子當(dāng)著我的面吹牛晃财,可吹牛的內(nèi)容都是我干的叨橱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼断盛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼罗洗!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起钢猛,我...
    開(kāi)封第一講書(shū)人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤伙菜,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后厢洞,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體仇让,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年躺翻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了丧叽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡公你,死狀恐怖踊淳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情陕靠,我是刑警寧澤迂尝,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站剪芥,受9級(jí)特大地震影響垄开,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜税肪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一溉躲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧益兄,春花似錦锻梳、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蛔六,卻和暖如春荆永,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背国章。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工屁魏, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捉腥。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓氓拼,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親抵碟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子桃漾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容