線程池切換帶來的超時問題
上圖有什么問題:
Controller的Hystrx線程池已經到了超時時間,而FeignClient的Hystrx線程池還沒到超時時間。
場景:
- Controller 拋出運行超時異常,進入熔斷回退方法。
- FeignClient 由於是單獨的線程池並且超時時間還沒到,所以繼續執行,占用20-1的線程。
問題:
- 其他的請求進入,調用FeignClient ,FeignClient 線程池應為超時時間未到來,線程已經沾滿,進入等待中?(設置了等待隊列並且斷路器沒有開啟的情況下)。
- Controller的Hystrx線程池在等待中已經到了超時時間,Controller繼續失敗,FeignClient 線程還在運行。
- 惡性循環。。。。
如下圖:
注意事項:
自定義的Hystrix線程池超時時間不要大於Feign的超時時間。
該問題在:hystrix運行原理官方文檔 注意事項中 :
請注意,沒有任何方式可以強制終止一個潛在[latent]的線程的運行,Hystrix能夠做的最好的方式是讓JVM拋出一個InterruptedException異常,如果你的任務被Hystrix所包裝,並不意味着會拋出一個InterruptedExceptions異常,該線程在Hystrix的線程池內會進行執行,雖然在客戶端已經接收到了TimeoutException異常,這個行為能夠滲透到Hystrix的線程池中,[though the load is 'correctly shed'],絕大多數的Http Client不會將這一行為視為InterruptedExceptions,所以,請確保正確配置連接或者讀取/寫入的超時時間。