記一次feign的問題排查(短路、線程池、隊列)

昨天開了一百個線程采用feign去請求第三方項目,結果報錯,出現了短路,大概是下面這樣的。(feign整合了hystrix并且自動打開了熔斷器)

Hystrix circuit short-circuited and is OPEN

。。。。。

百度了一下,幾乎沒人碰到這個問題,于是去谷歌了,發現還真有人碰到這個問題。引起這個問題的原因是在一個滾動窗口內,失敗了二十個(默認),就會發生短路,短路時間默認為5秒,5秒之內拒絕所有的請求,之后開始運行。然后解決辦法如下:

設置熔斷器失敗的個數,默認為20個,這里我給了1000個,只有超過1000個才會發生短路。hystrix詳細具體的配置信息可以谷歌一下,hystrix的配置。

hystrix.command.default.circuitBreaker.requestVolumeThreshold=1000

沒錯,當我設置完成之后,沒有出現短路的情況,但是出現了

hystrix could not be queued for execution and no fallback available.

exo me? 不能隊列執行?又去谷歌了一下,發現是feign線程池的問題,因為feign默認的線程池大小為10個,我卻用了一百個線程,下面是github大佬的回答。


去官方文檔看了下,解決辦法是設置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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容