Hystrix快速入門(3) Hystrix資源隔離策略(線程、信號量)

1. 為什么要進(jìn)行資源隔離

比如我們現(xiàn)在有3個業(yè)務(wù)調(diào)用分別是查詢訂單藤违、查詢商品浪腐、查詢用戶,且這三個業(yè)務(wù)請求都是依賴第三方服務(wù)-訂單服務(wù)顿乒、商品服務(wù)议街、用戶服務(wù)。三個服務(wù)均是通過RPC調(diào)用璧榄。當(dāng)依賴的訂單服務(wù)變慢了特漩,而這個時候后續(xù)有大量的查詢訂單請求過來,那么容器中的線程數(shù)量則會持續(xù)增加直致CPU資源耗盡到100%犹菱,整個服務(wù)對外不可用拾稳,集群環(huán)境下就是雪崩。所以腊脱,有必要將多個依賴服務(wù)的調(diào)用分別隔離到各自自己的資源池內(nèi)访得,不對其他服務(wù)造成影響。如下圖

image.png

*

2. 兩種隔離方式

2.1 線程隔離

適用場景適合絕大多數(shù)的場景陕凹,對依賴服務(wù)的網(wǎng)絡(luò)調(diào)用timeout悍抑,TPS要求高的,這種問題

執(zhí)行依賴代碼的線程與請求線程(比如Tomcat線程)分離杜耙,請求線程可以自由控制離開的時間搜骡,這也是我們通常說的異步編程,Hystrix是結(jié)合RxJava來實(shí)現(xiàn)的異步編程佑女。通過為每個包裹了HystrixCommand的API接口設(shè)置獨(dú)立的记靡、固定大小的線程池(hystrix.threadpool.default.coreSize)來控制并發(fā)訪問量谈竿,當(dāng)線程飽和的時候可以拒絕服務(wù)(走fallback方法),防止依賴問題擴(kuò)散摸吠。

線上建議線程池不要設(shè)置過大空凸,否則大量堵塞線程有可能會拖慢服務(wù)器。

2.1.1 線程池隔離的優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

  • 一個依賴調(diào)用可以給予一個線程池寸痢,這個依賴的異常不會影響其他的依賴呀洲。
  • 使用線程可以完全隔離業(yè)務(wù)代碼,請求線程可以快速返回啼止。
  • 可以完全模擬異步調(diào)用道逗,方便異步編程。

缺點(diǎn)

  • 使用線程池的缺點(diǎn)主要是增加了計(jì)算的開銷献烦。每一個依賴調(diào)用都會涉及到隊(duì)列滓窍,調(diào)度,上下文切換仿荆,而這些操作都有可能在不同的線程中執(zhí)行贰您。
2.1.2 線程池隔離相關(guān)參數(shù)

讓我們來逐個介紹下@HystrixCommand注解的各個參數(shù):

1:commandKey:配置全局唯一標(biāo)識服務(wù)的名稱,比如拢操,庫存系統(tǒng)有一個獲取庫存服務(wù)锦亦,那么就可以為這個服務(wù)起一個名字來唯一識別該服務(wù),如果不配置令境,則默認(rèn)是@HystrixCommand注解修飾的函數(shù)的函數(shù)名杠园。

2:groupKey:一個比較重要的注解,配置全局唯一標(biāo)識服務(wù)分組的名稱舔庶,比如抛蚁,庫存系統(tǒng)就是一個服務(wù)分組。通過設(shè)置分組惕橙,Hystrix會根據(jù)組來組織和統(tǒng)計(jì)命令的告瞧甩、儀表盤等信息。Hystrix命令默認(rèn)的線程劃分也是根據(jù)命令組來實(shí)現(xiàn)弥鹦。默認(rèn)情況下肚逸,Hystrix會讓相同組名的命令使用同一個線程池,所以我們需要在創(chuàng)建Hystrix命令時為其指定命令組來實(shí)現(xiàn)默認(rèn)的線程池劃分彬坏。此外朦促,Hystrix還提供了通過設(shè)置threadPoolKey來對線程池進(jìn)行設(shè)置。建議最好設(shè)置該參數(shù)栓始,使用threadPoolKey來控制線程池組务冕。
例如有如下代碼:

image.png

image.png

dashboard為:
image.png

說明:
findById - HystrixCommandKey(默認(rèn)為Controller下的方法名)
MovieController - HystrixThreadPoolKey(不配置的情況下就是commandGroupKey,HystrixCommandGroupKey默認(rèn)為類名)

3:threadPoolKey:對線程池進(jìn)行設(shè)定幻赚,細(xì)粒度的配置禀忆,相當(dāng)于對單個服務(wù)的線程池信息進(jìn)行設(shè)置臊旭,也可多個服務(wù)設(shè)置同一個threadPoolKey構(gòu)成線程組。

4:fallbackMethod:@HystrixCommand注解修飾的函數(shù)的回調(diào)函數(shù)油湖,@HystrixCommand修飾的函數(shù)必須和這個回調(diào)函數(shù)定義在同一個類中巍扛,因?yàn)槎x在了同一個類中,所以fackback method可以是public/private均可乏德。

5:commandProperties:配置該命令的一些參數(shù),如executionIsolationStrategy配置執(zhí)行隔離策略吠昭,默認(rèn)是使用線程隔離喊括,此處我們配置為THREAD,即線程池隔離矢棚。參見:com.netflix.hystrix.HystrixCommandProperties中各個參數(shù)的定義郑什。

6:threadPoolProperties:線程池相關(guān)參數(shù)設(shè)置,具體可以設(shè)置哪些參數(shù)請見:com.netflix.hystrix.HystrixThreadPoolProperties

7:ignoreExceptions:調(diào)用服務(wù)時蒲肋,除了HystrixBadRequestException之外蘑拯,其他@HystrixCommand修飾的函數(shù)拋出的異常均會被Hystrix認(rèn)為命令執(zhí)行失敗而觸發(fā)服務(wù)降級的處理邏輯(調(diào)用fallbackMethod指定的回調(diào)函數(shù)),所以當(dāng)需要在命令執(zhí)行中拋出不觸發(fā)降級的異常時來使用它兜粘,通過這個參數(shù)指定申窘,哪些異常拋出時不觸發(fā)降級(不去調(diào)用fallbackMethod),而是將異常向上拋出孔轴。

8:observableExecutionMode:定義hystrix observable command的模式剃法;

9:raiseHystrixExceptions:任何不可忽略的異常都包含在HystrixRuntimeException中;

10:defaultFallback:默認(rèn)的回調(diào)函數(shù)路鹰,該函數(shù)的函數(shù)體不能有入?yún)⒋蓿祷刂殿愋团c@HystrixCommand修飾的函數(shù)體的返回值一致。如果指定了fallbackMethod晋柱,則fallbackMethod優(yōu)先級更高优构。

2.2 信號量隔離

用于隔離本地代碼或可快速返回的遠(yuǎn)程調(diào)用(如memcached,redis)可以直接使用信號量隔離,降低線程隔離的上下文切換開銷雁竞。
線程隔離會帶來線程開銷钦椭,有些場景(比如無網(wǎng)絡(luò)請求場景)可能會因?yàn)橛瞄_銷換隔離得不償失,為此hystrix提供了信號量隔離浓领。

主要適用場景: 并發(fā)需求不大的依賴調(diào)用(因?yàn)槿绻l(fā)需求較大玉凯,相應(yīng)的信號量的數(shù)量就要設(shè)置得夠大,因?yàn)門omcat線程與處理線程為同一個線程联贩,那么這個依賴調(diào)用就會占用過多的Tomcat線程資源漫仆,有可能會影響到其他服務(wù)的接收)

和線程池隔離類似,同一個HystrixCommandGroupKey共用一個信號量(默認(rèn)為類名)

public class CommandUsingSemaphoreIsolation extends HystrixCommand<String> {
    private final int id;
    public CommandUsingSemaphoreIsolation(int id) {
        super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"))
                // since we're doing an in-memory cache lookup we choose SEMAPHORE isolation
                .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
                        .withExecutionIsolationStrategy(ExecutionIsolationStrategy.SEMAPHORE)));
        this.id = id;
    }
    @Override
    protected String run() {
        // a real implementation would retrieve data from in memory data structure
        return "ValueFromHashMap_" + id;
   }
}
    

2.3 線程池隔離與信號量隔離區(qū)別

官方圖示:


image.png

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末泪幌,一起剝皮案震驚了整個濱河市盲厌,隨后出現(xiàn)的幾起案子署照,更是在濱河造成了極大的恐慌,老刑警劉巖吗浩,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件建芙,死亡現(xiàn)場離奇詭異,居然都是意外死亡懂扼,警方通過查閱死者的電腦和手機(jī)禁荸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來阀湿,“玉大人赶熟,你說我怎么就攤上這事∠葑欤” “怎么了映砖?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長灾挨。 經(jīng)常有香客問我邑退,道長,這世上最難降的妖魔是什么劳澄? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任地技,我火速辦了婚禮,結(jié)果婚禮上浴骂,老公的妹妹穿的比我還像新娘乓土。我一直安慰自己,他們只是感情好溯警,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布趣苏。 她就那樣靜靜地躺著,像睡著了一般梯轻。 火紅的嫁衣襯著肌膚如雪食磕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天喳挑,我揣著相機(jī)與錄音彬伦,去河邊找鬼。 笑死伊诵,一個胖子當(dāng)著我的面吹牛单绑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播曹宴,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼搂橙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了笛坦?” 一聲冷哼從身側(cè)響起区转,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤苔巨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后废离,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體侄泽,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年蜻韭,在試婚紗的時候發(fā)現(xiàn)自己被綠了悼尾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡肖方,死狀恐怖诀豁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情窥妇,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布娩践,位于F島的核電站活翩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏翻伺。R本人自食惡果不足惜材泄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吨岭。 院中可真熱鬧拉宗,春花似錦、人聲如沸辣辫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽急灭。三九已至姐浮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間葬馋,已是汗流浹背卖鲤。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留畴嘶,地道東北人蛋逾。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像窗悯,于是被迫代替她去往敵國和親区匣。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評論 2 349

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