Hystrix多個線程池切換執行超時帶來的問題(圖解)


 

線程池切換帶來的超時問題


1571298992110-276.png

上圖有什么問題:

Controller的Hystrx線程池已經到了超時時間,而FeignClient的Hystrx線程池還沒到超時時間。

場景:

  • Controller 拋出運行超時異常,進入熔斷回退方法。
  • FeignClient 由於是單獨的線程池並且超時時間還沒到,所以繼續執行,占用20-1的線程。

問題:

  • 其他的請求進入,調用FeignClient ,FeignClient 線程池應為超時時間未到來,線程已經沾滿,進入等待中?(設置了等待隊列並且斷路器沒有開啟的情況下)。
  • Controller的Hystrx線程池在等待中已經到了超時時間,Controller繼續失敗,FeignClient 線程還在運行。
  • 惡性循環。。。。

如下圖:

1571299000374-477.png

注意事項:

自定義的Hystrix線程池超時時間不要大於Feign的超時時間。

 

該問題在:hystrix運行原理官方文檔 注意事項中 :

 

請注意,沒有任何方式可以強制終止一個潛在[latent]的線程的運行,Hystrix能夠做的最好的方式是讓JVM拋出一個InterruptedException異常,如果你的任務被Hystrix所包裝,並不意味着會拋出一個InterruptedExceptions異常,該線程在Hystrix的線程池內會進行執行,雖然在客戶端已經接收到了TimeoutException異常,這個行為能夠滲透到Hystrix的線程池中,[though the load is 'correctly shed'],絕大多數的Http Client不會將這一行為視為InterruptedExceptions,所以,請確保正確配置連接或者讀取/寫入的超時時間。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM