spring cloud hytrix熔斷策略詳解

Hytrix看起來很簡單,貌似使用默認配置就行,但實際使用起來坑多多,稍不留意,就會入坑。併發

一 線程池

coresize

好比這個coresize,默認是10,日常看起來是ok的,但一旦面臨高併發,就會爆掉高併發

clipboard.png

如圖所示,用戶請求都會被包裝成一個hytrix請求,hytrix使用ThreadPoolExecutor來管理線程池,一旦超限,就會爆掉
好比有30個rps,平均每一個請求響應時間爲0.2s,那麼須要的線程數就是30*0.2=6,而後加上一個附加值,好比說4,6+4=10
若是是100rqs,每一個響應時間0.2, 100*0.2=20,那就是至少20個線程。固然,此時請求平均響應時間應該會延長,應該根據實際狀況計算。性能

按照文檔說設置這個值過大會影響性能,但我的覺得設置成100並不會有何問題。ui

maximumSize

有了coresize固然有maximumsize了,通常coresize = maximumsize,只有當你設置allowMaximumSizeToDivergeFromCoreSize=true時才起做用spa

maxQueueSize

線程池的隊列配置,若是線程超過線程池大小coresize,會進入該隊列排隊。默認是-1,就是SynchronousQueue,若是設置爲正值,會使用LinkedBlockingQueue。該配置不可修改,若是修改,必需要重啓應用纔會生效。線程

queueSizeRejectionThreshold

隊列的拒絕門檻。即便在隊列中排隊的線程未達到最大值,只要超過了這個閥值,請求線程都會被丟棄掉,因此maxQueueSize某種意義是沒用的code

keepAliveTimeMinutes

線程在隊列中的存活事件,默認值是1(應該是1s),須要allowMaximumSizeToDivergeFromCoreSize=trueblog

allowMaximumSizeToDivergeFromCoreSize

設置maximumSize和keepAliveTimeMinutes是否起做用,默認是false,就是不起做用隊列

二 滑動窗口與閥值微調

你們都知道斷路器會跳閘,但究竟是如何跳閘呢?是失敗多少次麼?那麼是否是還須要一個時間值,來判斷多長時間失敗多少次。有點相似於一個滑動窗口:事件

clipboard.png

  1. Hystrix遇到服務錯誤時,會開啓一個10s的窗口
  2. 若是在該窗口內錯誤調用未達到閥值,那麼程序繼續
  3. 若是達到閥值,那麼斷路器會跳閘
  4. 跳閘的同時,會啓動一個新的活動窗口5s
  5. 在5s的窗口期間會嘗試將一個請求發到對方服務
  6. 若是失敗,繼續保持斷路狀態
  7. 若是成功,重啓10s的滑動窗口

]

@HystrixCommand(
    fallbackMethod = "buildFallbackLicenseList",
    threadPoolKey = "licenseByOrgThreadPool",
    threadPoolProperties = {
        @HystrixProperty(name = "coreSize", value="30"),
        @HystrixProperty(name = "maxQueueSize" value="10"),
    },
    commandPoolProperties = {
        @HystrixProperty(name="circuitBreaker.requestVolumeThreshold", value="10"),
        @HystrixProperty(name="circuitBreaker.errorThresholdPercentage", value="75"),
        @HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds", value="7000"),
        @HystrixProperty(name="metrics.rollingStats.timeInMilliseconds", value="15000"),
        @HystrixProperty(name="metrics.rollingStats.numBuckets", value="5")
    }
)
public String doSth(){....}

各參數說明以下:

circuitBreaker.requestVolumeThreshold

表示在10s中必須發生的連續調用次數閥值。好比這個值是20,那麼及時在10s的時間窗口中所有19個請求失敗了,也不會觸發熔斷。

circuitBreaker.errorThresholdPercentage

錯誤閥值,超過這個閥值會觸發熔斷,全部的請求都會打到fallback上

circuitBreaker.sleepWindowInMilliseconds

發生熔斷後,熔斷器會睡眠多長時間後,纔會再次嘗試訪問對方服務

metrics.rollingStats.timeInMilliseconds

窗口大小,默認10s

metrics.rollingStats.numBuckets

桶的個數,必須被timeInMilliseconds整除。好比numBuckets=2,那麼 timeInMilliseconds/numBuckets = 5,就是在5秒內Hystrix展開監控

相關文章
相關標籤/搜索