Spring Cloud 的 Hystrix 更多參數配置信息

1、背景

在複雜的分佈式 架構 的應用程序有很多的依賴,都會不可避免地在某些時候失敗。高併發的依賴失敗時如果沒有隔離措施,當前應用服務就有被拖垮的風險。

例如:一個依賴30個SOA服務的系統,每個服務99.99%可用。
99.99%的30次方 ≈ 99.7%
0.3% 意味着一億次請求 會有 3,000,00次失敗
換算成時間大約每月有2個小時服務不穩定.
隨着服務依賴數量的變多,服務不穩定的概率會成指數性提高.

解決問題方案:對依賴做隔離,Hystrix就是處理依賴隔離的框架,同時也是可以幫我們做依賴服務的治理和監控.

2、原理

1)Hystrix使用命令模式HystrixCommand(Command)包裝依賴調用邏輯,每個命令在單獨線程中/信號 授權 下執行

一般情況下,Hystrix 會爲 Command 分配專門的線程池,池中的線程數量是固定的,這也是一個保護機制,假設你依賴很多個服務,你不希望對其中一個服務的調用消耗過多的線程以致於其他服務都沒線程調用了。默認這個線程池的大小是10,即併發執行的命令最多只能有是個了,超過這個數量的調用就得排隊,如果隊伍太長了(默認超過5),Hystrix就立刻走 fallback 或者拋異常。

根據你的具體需要,你可能會想要調整某個Command的線程池大小,例如你對某個依賴的調用平均響應時間爲200ms,而峯值的QPS是200,那麼這個併發至少就是 0.2 x 200 = 40 (Little's Law),考慮到一定的寬鬆度,這個線程池的大小設置爲60可能比較合適.


2)提供熔斷器組件,可以自動運行或手動調用,停止當前依賴一段時間(10秒),熔斷器默認 錯誤 率閾值爲50%,超過將自動運行。

斷路器機制默認是啓用的,但是編程接口默認幾乎不需要關心這個,機制和前面講的也差不多,Hystrix會統計命令調用,看其中失敗的比例,默認當超過50%失敗後,開啓斷路器,那之後一段時間的命令調用直接返回失敗(或者走fallback),5秒之後,Hystrix再嘗試關閉斷路器,看看請求是否能正常響應。




3)可配置依賴調用 超時 時間,超時時間一般設爲比99.5%平均時間略高即可.當調用超時時,直接返回或執行fallback邏輯。

4)爲每個依賴提供一個小的線程池(或信號),如果線程池已滿調用將被立即拒絕,默認不採用排隊.加速失敗判定時間。

5)依賴調用結果分:成功,失敗(拋出 異常 ),超時,線程拒絕,短路。 請求失敗(異常,拒絕,超時,短路)時執行fallback(降級)邏輯。

6)提供近實時依賴的統計和監控

7) 支持異步執行。支持併發請求緩存。自動批處理失敗請求。


3、Hystrix參數說明
https://github.com/Netflix/Hystrix/wiki/Configuration


Command Properties
Execution
控制HystrixCommand.run()的執行策略
execution.isolation.strategy 執行隔離策略
THREAD  每次在一個線程中執行,併發請求數限制於線程池的線程數
SEMAPHORE 在調用線程中執行,併發請求數限制於semaphore信號量的值
Thread是默認推薦的選擇。
execution.isolation.thread.timeoutInMilliseconds
超時時間,默認1000ms
execution.timeout.enabled
是否開啓超時,默認true
execution.isolation.thread.interruptOnTimeout
當超時的時候是否中斷(interrupt) HystrixCommand.run()執行
 
Fallback
設置當fallback降級發生時的策略
Circuit Breaker
配置熔斷的策略
circuitBreaker.enabled
是否開啓熔斷,默認true
circuitBreaker.requestVolumeThreshold
設置一個滑動窗口內觸發熔斷的最少請求量,默認20。例如,如果這個值是20,一個滑動窗口內只有19個請求時,即使19個請求都失敗了也不會觸發熔斷。
circuitBreaker.sleepWindowInMilliseconds
設置觸發熔斷後,拒絕請求後多長時間開始嘗試再次執行。默認5000ms。
circuitBreaker.errorThresholdPercentage
設置觸發熔斷的錯誤比例。默認50,即50%。
circuitBreaker.forceOpen
是否強制開啓熔斷
circuitBreaker.forceClosed
是否強制關閉熔斷
Metrics
設置關於HystrixCommand執行需要的統計信息
metrics.rollingStats.timeInMilliseconds
設置滑動窗口的統計時間。熔斷器使用這個時間。
默認10s
metrics.rollingStats.numBuckets
設置滑動統計的桶數量。默認10。metrics.rollingStats.timeInMilliseconds必須能被這個值整除。
metrics.rollingPercentile.enabled
設置執行時間是否被跟蹤,並且計算各個百分比,50%,90%等的時間。默認true。
 
Request Context
設置HystrixCommand使用的HystrixRequestContext相關的屬性.
requestCache.enabled
設置是否緩存請求,request-scope內緩存。默認true
requestLog.enabled
設置HystrixCommand執行和事件是否打印到HystrixRequestLog中。
ThreadPool Properties
配置HystrixCommand使用的線程池的屬性。
大多數情況下默認的10個線程都是值得建議的。
coreSize
設置線程池的core size,這是最大的併發執行數量。默認10
maxQueueSize
最大隊列長度。設置BlockingQueue的最大長度。默認-1。
如果設置成-1,就會使用SynchronizeQueue。
如果其他正整數就會使用LinkedBlockingQueue。
queueSizeRejectionThreshold
設置拒絕請求的臨界值。只有maxQueueSize爲-1時纔有效。
設置設個值的原因是maxQueueSize值運行時不能改變,我們可以通過修改這個變量動態修改允許排隊的長度。默認5
keepAliveTimeMinutes
設置keep-live時間。默認1分鐘
這個一般用不到因爲默認corePoolSize和maxPoolSize是一樣的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章