引起這個問題的原因是在一個滾動窗口內,失敗了二十個(默認),就會發生短路,短路時間默認為5秒,5秒之內拒絕所有的請求,之后開始運行。
解決辦法如下:
1.設置熔斷器失敗的個數,默認為20個,這里我給了1000個,只有超過1000個才會發生短路。
hystrix詳細具體的配置信息可以谷歌一下,hystrix的配置。
hystrix.command.default.circuitBreaker.requestVolumeThreshold=1000
設置完成之后,沒有出現短路的情況,但出現了
hystrix could not be queued for execution and no fallback available.
2.這是feign線程池的問題,因為feign默認的線程池大小為10個,而本次測試使用了100個線程
解決辦法是設置feign的核心線程池的數量。下面那個maxQueueSize可以不用設置,默認為-1,使用的是SynchronousQueue。
#hystrix.threadpool.default.maxQueueSize=1000
3.設置完成之后,又出現了time-out。
解決辦法:設置斷路器的超時
#斷路器超時設置和請求的超時
hystrix.command.default.execution.timeout.enabled=true hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=300000 ribbon.ConnectTimeout=300000 ribbon.ReadTimeout=300000
出現timeout的原因:
請求是100個線程去訪問,我們知道CPU的線程是上下文切換的,有些線程遲遲得不到執行權,就一直掛在那里了,一直掛,一直掛,直到滿足了斷路器的timeout,然后就被拋出異常了。
后面采用了fallback,發現會拒絕執行fallback,原因也是線程太少,設置一下回退的線程數量就好了。
#設置回退的最大線程數 hystrix.command.default.fallback.isolation.semaphore.maxConcurrentRequests=50