SpringCloud Feign 之 超時重試次數探究


SpringCloud Feign 之 超時重試次數探究

上篇文章,我們對Feign的fallback有一個初步的體驗,在這里我們回顧一下,Fallback主要是用來解決依賴的服務不可用或者調用服務失敗或超時,使用默認的返回值。實際應用中, 在Fallback之前,需要對服務配置重試機制,當多次重試服務,還是服務不可用的情況下,就觸發Fallback。

這里,我們對重試機制配置以及重試次數進行一次探究。

Feign的超時

Feign接口調用分兩層,Ribbon(負載均衡)和Hystrix(熔斷器)的調用,因此Feign的超時時間就是

ribbon的超時時間和Hystrix的超時時間的結合(不是簡單相加)。

##hystrix的超時時間
hystrix:
  command:
    default:
      execution:
        timeout:
          enabled: true
        isolation:
          thread:
            timeoutInMilliseconds: 60000
##Ribbon超時
ribbon:
  ConnectTimeout: 20000  #毫秒    連接超時時間
  ReadTimeout: 20000     #毫秒      邏輯處理超時時間

正常情況下,因為Ribbon有重試機制,所以Ribb的超時時間是 < Hystrix熔斷的超時。

Feign的重試

Feign的重試機制在源碼中默認關閉的,因為Ribbon的重試機制和Fiegn原來的重試機制沖突,所以在一般情況下,Feign的重試機制指的就是Ribbon的重試機制,本文也是如此。

Ribbon超時重試
##Ribbon超時重試配置
ribbon:
  ConnectTimeout: 20000  #毫秒    連接超時時間
  ReadTimeout: 20000     #毫秒      邏輯處理超時時間
  OkToRetryOnAllOperations: true    # 是否對所有操作都進行重試
  MaxAutoRetries: 2     # 對當前實例的最大重試次數(請求服務超時6s則會再請求一次)
  MaxAutoRetriesNextServer: 1     # 切換實例的最大重試次數(如果還失敗就切換下

Ribbon超時重試次數(總的請求次數):(MaxAutoRetries+1)*(MaxAutoRetriesNextServer+1)

如果Ribbon沒有配置重試時間和次數,默認1S超時,默認重試1次

重試次數驗證
  • 設置超時時間2S,在demo中sleep 3S,會發現請求了6次。

  • 不配置重試時間和次數,sleep 3S,重試1次,一共請求2次。

    根據測試結果,可看出結論正確。總的請求次數):(MaxAutoRetries+1)*(MaxAutoRetriesNextServer+1)

其他
  • 如果重試期間,調用時間超過了 Hystrix熔斷的超時時間,便會立即熔斷,進行FallBack。

    根據上面描述可大致計算出Hystrix可以參考的超時時間,來保持可以使用到重試機制。

    hystrix超時時間的計算:(MaxAutoRetries+1)*(MaxAutoRetriesNextServer+1) * (ConnectTimeout+ReadTimeout) 。

  • 當ribbon超時后且hystrix沒有超時,就會使用到重試機制。

  • 默認情況下,GET方式請求無論是連接異常還是讀取異常,都會進行重試,非GET方式請求,只有連接異常時,才會進行重試(從其他博文學習到,暫未驗證)

  • demo地址:https://github.com/lanxuan826/sample-library/tree/master/feigndemo-fallback


免責聲明!

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



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