Hytrix看起來很簡單,貌似使用默認配置就行,但實際使用起來坑多多,稍不留意,就會入坑。併發
好比這個coresize,默認是10,日常看起來是ok的,但一旦面臨高併發,就會爆掉高併發
如圖所示,用戶請求都會被包裝成一個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
有了coresize固然有maximumsize了,通常coresize = maximumsize,只有當你設置allowMaximumSizeToDivergeFromCoreSize=true時才起做用spa
線程池的隊列配置,若是線程超過線程池大小coresize,會進入該隊列排隊。默認是-1,就是SynchronousQueue,若是設置爲正值,會使用LinkedBlockingQueue。該配置不可修改,若是修改,必需要重啓應用纔會生效。線程
隊列的拒絕門檻。即便在隊列中排隊的線程未達到最大值,只要超過了這個閥值,請求線程都會被丟棄掉,因此maxQueueSize某種意義是沒用的code
線程在隊列中的存活事件,默認值是1(應該是1s),須要allowMaximumSizeToDivergeFromCoreSize=trueblog
設置maximumSize和keepAliveTimeMinutes是否起做用,默認是false,就是不起做用隊列
你們都知道斷路器會跳閘,但究竟是如何跳閘呢?是失敗多少次麼?那麼是否是還須要一個時間值,來判斷多長時間失敗多少次。有點相似於一個滑動窗口:事件
]
@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(){....}
各參數說明以下:
表示在10s中必須發生的連續調用次數閥值。好比這個值是20,那麼及時在10s的時間窗口中所有19個請求失敗了,也不會觸發熔斷。
錯誤閥值,超過這個閥值會觸發熔斷,全部的請求都會打到fallback上
發生熔斷後,熔斷器會睡眠多長時間後,纔會再次嘗試訪問對方服務
窗口大小,默認10s
桶的個數,必須被timeInMilliseconds整除。好比numBuckets=2,那麼 timeInMilliseconds/numBuckets = 5,就是在5秒內Hystrix展開監控