https://www.jianshu.com/p/f7fb59f43485git
昨天開了一百個線程採用feign去請求第三方項目,結果報錯,出現了短路,大概是下面這樣的。(feign整合了hystrix而且自動打開了熔斷器)github
Hystrix circuit short-circuited and is OPENui
。。。。。spa
百度了一下,幾乎沒人碰到這個問題,因而去谷歌了,發現還真有人碰到這個問題。引發這個問題的緣由是在一個滾動窗口內,失敗了二十個(默認),就會發生短路,短路時間默認爲5秒,5秒以內拒絕全部的請求,以後開始運行。而後解決辦法以下:線程
設置熔斷器失敗的個數,默認爲20個,這裏我給了1000個,只有超過1000個纔會發生短路。hystrix詳細具體的配置信息能夠谷歌一下,hystrix的配置。orm
hystrix.command.default.circuitBreaker.requestVolumeThreshold=1000隊列
沒錯,當我設置完成以後,沒有出現短路的狀況,可是出現了ci
hystrix could not be queued for execution and no fallback available.文檔
exo me? 不能隊列執行?又去谷歌了一下,發現是feign線程池的問題,由於feign默認的線程池大小爲10個,我卻用了一百個線程,下面是github大佬的回答。it
去官方文檔看了下,解決辦法是設置feign的核心線程池的數量。下面那個maxQueueSize能夠不用設置,默認爲-1,使用的是SynchronousQueue。
hystrix.threadpool.default.coreSize=100
#hystrix.threadpool.default.maxQueueSize=1000
設置完成以後,又出現了一個問題,沒錯,又是time-out。
對於這個問題很好解決,設置斷路器的超時,前面寫過一篇在有道雲筆記裏面。爲了偷懶仍是複製一下代碼吧
#斷路器超時設置和請求的超時
hystrix.command.default.execution.timeout.enabled=true
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=300000
ribbon.ConnectTimeout=300000
ribbon.ReadTimeout=300000
如今就解決了。
緣由:出現timeout的問題,基於個人理論,固然只是基於個人空想。
由於我請求的是一百個線程去訪問,咱們知道CPU的線程是上下文切換的,有些線程遲遲得不到執行權,就一直掛在那裏了,一直掛,一直掛,直到知足了斷路器的timeout,而後就被拋出異常了,這個線程也是很可憐QAQ。
後面採用了fallback,發現會拒絕執行fallback,緣由也是線程太少,設置一下回退的線程數量就行了。
#設置回退的最大線程數
hystrix.command.default.fallback.isolation.semaphore.maxConcurrentRequests=50
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
zuul組件封裝了feign,重改了feign的默認配置,因此相同狀況下不會出現
Hystrix circuit short-circuited and is OPEN 等到問題