hystrix的線程池+服務+接口劃分以及資源池的容量大小控制

資源隔離袁滥,兩種策略,線程池隔離灾螃,信號量隔離

對資源隔離這一塊東西题翻,做稍微更加深入一些的講解,告訴你腰鬼,除了可以選擇隔離策略以外嵌赠,對你選擇的隔離策略,可以做一定的細粒度的一些控制

1熄赡、execution.isolation.strategy

指定了HystrixCommand.run()的資源隔離策略姜挺,THREAD或者SEMAPHORE,一種是基于線程池彼硫,一種是信號量

線程池機制炊豪,每個command運行在一個線程中凌箕,限流是通過線程池的大小來控制的

信號量機制,command是運行在調用線程中词渤,但是通過信號量的容量來進行限流

如何在線程池和信號量之間做選擇牵舱?

默認的策略就是線程池

線程池其實最大的好處就是對于網絡訪問請求,如果有超時的話缺虐,可以避免調用線程阻塞住

而使用信號量的場景芜壁,通常是針對超大并發(fā)量的場景下,每個服務實例每秒都幾百的QPS志笼,那么此時你用線程池的話沿盅,線程一般不會太多把篓,可能撐不住那么高的并發(fā)纫溃,如果要撐住,可能要耗費大量的線程資源韧掩,那么就是用信號量紊浩,來進行限流保護

一般用信號量常見于那種基于純內存的一些業(yè)務邏輯服務,而不涉及到任何網絡訪問請求

netflix有100+的command運行在40+的線程池中疗锐,只有少數command是不運行在線程池中的坊谁,就是從純內存中獲取一些元數據,或者是對多個command包裝起來的facacde command滑臊,是用信號量限流的

// to use thread isolation
HystrixCommandProperties.Setter()
.withExecutionIsolationStrategy(ExecutionIsolationStrategy.THREAD)
// to use semaphore isolation
HystrixCommandProperties.Setter()
.withExecutionIsolationStrategy(ExecutionIsolationStrategy.SEMAPHORE)

2口芍、command名稱和command組

線程池隔離,依賴服務->接口->線程池雇卷,如何來劃分

你的每個command鬓椭,都可以設置一個自己的名稱,同時可以設置一個自己的組

private static final Setter cachedSetter =
Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"))
.andCommandKey(HystrixCommandKey.Factory.asKey("HelloWorld"));

public CommandHelloWorld(String name) {
super(cachedSetter);
this.name = name;
}

command group关划,是一個非常重要的概念小染,默認情況下,因為就是通過command group來定義一個線程池的贮折,而且還會通過command group來聚合一些監(jiān)控和報警信息

同一個command group中的請求裤翩,都會進入同一個線程池中

3、command線程池

threadpool key代表了一個HystrixThreadPool调榄,用來進行統一監(jiān)控踊赠,統計,緩存

默認的threadpool key就是command group名稱

每個command都會跟它的threadpool key對應的thread pool綁定在一起

如果不想直接用command group每庆,也可以手動設置thread pool name

public CommandHelloWorld(String name) {
super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"))
.andCommandKey(HystrixCommandKey.Factory.asKey("HelloWorld"))
.andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("HelloWorldPool")));
this.name = name;
}

command threadpool -> command group -> command key

command key筐带,代表了一類command,一般來說扣孟,代表了底層的依賴服務的一個接口

command group烫堤,代表了某一個底層的依賴服務,合理,一個依賴服務可能會暴露出來多個接口鸽斟,每個接口就是一個command key

command group拔创,在邏輯上去組織起來一堆command key的調用,統計信息富蓄,成功次數剩燥,timeout超時次數,失敗次數立倍,可以看到某一個服務整體的一些訪問情況

command group灭红,一般來說,推薦是根據一個服務去劃分出一個線程池口注,command key默認都是屬于同一個線程池的

比如說你以一個服務為粒度变擒,估算出來這個服務每秒的所有接口加起來的整體QPS在100左右

你調用那個服務的當前服務,部署了10個服務實例寝志,每個服務實例上娇斑,其實用這個command group對應這個服務,給一個線程池材部,量大概在10個左右毫缆,就可以了,你對整個服務的整體的訪問QPS大概在每秒100左右

一般來說乐导,command group是用來在邏輯上組合一堆command的

舉個例子苦丁,對于一個服務中的某個功能模塊來說,希望將這個功能模塊內的所有command放在一個group中物臂,那么在監(jiān)控和報警的時候可以放一起看

command group旺拉,對應了一個服務,但是這個服務暴露出來的幾個接口鹦聪,訪問量很不一樣账阻,差異非常之大

你可能就希望在這個服務command group內部,包含的對應多個接口的command key泽本,做一些細粒度的資源隔離

對同一個服務的不同接口淘太,都使用不同的線程池

command key -> command group

command key -> 自己的threadpool key

邏輯上來說,多個command key屬于一個command group规丽,在做統計的時候蒲牧,會放在一起統計

每個command key有自己的線程池,每個接口有自己的線程池赌莺,去做資源隔離和限流

但是對于thread pool資源隔離來說冰抢,可能是希望能夠拆分的更加一致一些,比如在一個功能模塊內艘狭,對不同的請求可以使用不同的thread pool

command group一般來說挎扰,可以是對應一個服務翠订,多個command key對應這個服務的多個接口,多個接口的調用共享同一個線程池

如果說你的command key遵倦,要用自己的線程池尽超,可以定義自己的threadpool key,就ok了

4梧躺、coreSize

設置線程池的大小似谁,默認是10

HystrixThreadPoolProperties.Setter()
.withCoreSize(int value)

一般來說,用這個默認的10個線程大小就夠了

5掠哥、queueSizeRejectionThreshold

控制queue滿后reject的threshold巩踏,因為maxQueueSize不允許熱修改,因此提供這個參數可以熱修改续搀,控制隊列的最大大小

HystrixCommand在提交到線程池之前塞琼,其實會先進入一個隊列中,這個隊列滿了之后目代,才會reject

默認值是5

HystrixThreadPoolProperties.Setter()
.withQueueSizeRejectionThreshold(int value)

6屈梁、execution.isolation.semaphore.maxConcurrentRequests

設置使用SEMAPHORE隔離策略的時候,允許訪問的最大并發(fā)量榛了,超過這個最大并發(fā)量,請求直接被reject

這個并發(fā)量的設置煞抬,跟線程池大小的設置霜大,應該是類似的,但是基于信號量的話革答,性能會好很多战坤,而且hystrix框架本身的開銷會小很多

默認值是10,設置的小一些残拐,否則因為信號量是基于調用線程去執(zhí)行command的途茫,而且不能從timeout中抽離,因此一旦設置的太大溪食,而且有延時發(fā)生囊卜,可能瞬間導致tomcat本身的線程資源本占滿

HystrixCommandProperties.Setter()
.withExecutionIsolationSemaphoreMaxConcurrentRequests(int value)

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市错沃,隨后出現的幾起案子栅组,更是在濱河造成了極大的恐慌,老刑警劉巖枢析,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玉掸,死亡現場離奇詭異,居然都是意外死亡醒叁,警方通過查閱死者的電腦和手機司浪,發(fā)現死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門泊业,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人啊易,你說我怎么就攤上這事脱吱。” “怎么了认罩?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵箱蝠,是天一觀的道長。 經常有香客問我垦垂,道長宦搬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任劫拗,我火速辦了婚禮间校,結果婚禮上,老公的妹妹穿的比我還像新娘页慷。我一直安慰自己憔足,他們只是感情好,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布酒繁。 她就那樣靜靜地躺著滓彰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪州袒。 梳的紋絲不亂的頭發(fā)上揭绑,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機與錄音郎哭,去河邊找鬼他匪。 笑死,一個胖子當著我的面吹牛夸研,可吹牛的內容都是我干的邦蜜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼亥至,長吁一口氣:“原來是場噩夢啊……” “哼悼沈!你這毒婦竟也來了?” 一聲冷哼從身側響起抬闯,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤井辆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后溶握,有當地人在樹林里發(fā)現了一具尸體杯缺,經...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年睡榆,在試婚紗的時候發(fā)現自己被綠了萍肆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袍榆。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖塘揣,靈堂內的尸體忽然破棺而出包雀,到底是詐尸還是另有隱情,我是刑警寧澤亲铡,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布才写,位于F島的核電站,受9級特大地震影響奖蔓,放射性物質發(fā)生泄漏赞草。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一吆鹤、第九天 我趴在偏房一處隱蔽的房頂上張望厨疙。 院中可真熱鬧,春花似錦疑务、人聲如沸沾凄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽撒蟀。三九已至,卻和暖如春廊镜,著一層夾襖步出監(jiān)牢的瞬間牙肝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工嗤朴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人虫溜。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓雹姊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親衡楞。 傳聞我的和親對象是個殘疾皇子吱雏,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內容

  • 0 Github 資源隔離兩種策略 線程池隔離 信號量隔離 對于資源隔離,做更加深入一些的講解瘾境,除了可以選擇隔離策...
    JavaEdge閱讀 886評論 0 0
  • Hystrix 隔離策略細粒度控制 Hystrix 實現資源隔離歧杏,有兩種策略: 線程池隔離 信號量隔離 對資源隔離...
    kevin0016閱讀 1,106評論 0 5
  • 在不知道拖延癥這個詞的時候,就已經犯病了迷守,最近愈發(fā)強烈犬绒。 昨天下午計劃整理衣柜,中午吃完飯開始磨嘰兑凿,先是去朋友家嘮...
    晨一文閱讀 224評論 1 3
  • 家庭由我們每個個人組成凯力,國家由全部的家庭組成茵瘾。每個個人的家庭教育與國家的命運是聯系在一起的。如果我們把家庭教育做好...
    悟本文化閱讀 209評論 0 4
  • 我加入簡書啦咐鹤。 從今天開始努力工作向上吧拗秘,每天都要打卡哦。 第一個目標是讓《惡棍法師》能夠簽約成功祈惶,不過已經投稿了...
    花煙13閱讀 114評論 0 0