03_HTTP 超時,重試

1, 配置連接超時和讀取超時參數的學問

對於HTTP調用,雖然應用層走的是HTTP協議,但網絡層面始終是TCP/IP協議。TCP/IP是面向連接的協議,在傳輸數據之前需要建立連接。幾乎所有的網絡框架都會提供這麼兩個超時參數:

  1. 連接超時參數ConnectTimeout,讓用戶配置建連階段的最長等待時間;
  2. 讀取超時參數ReadTimeout,用來控制從Socket上讀取數據的最長等待時間。

連接超時參數和連接超時的誤區有這麼兩個:

  1. 連接超時配置得特別長,比如60秒。一般來說,TCP三次握手建立連接需要的時間非常短,通常在毫秒級最多到秒級,不可能需要十幾秒甚至幾十秒。如果很久都無法建連,很可能是網絡或防火牆配置的問題。這種情況下,如果幾秒連接不上,那麼可能永遠也連接不上。因此,設置特別長的連接超時意義不大,將其配置得短一些(比如1~5秒)即可。如果是純內網調用的話,這個參數可以設置得更短,在下游服務離線無法連接的時候,可以快速失敗。
  2. 排查連接超時問題,卻沒理清連的是哪裏。通常情況下,我們的服務會有多個節點,如果別的客戶端通過客戶端負載均衡技術來連接服務端,那麼客戶端和服務端會直接建立連接,此時出現連接超時大概率是服務端的問題;而如果服務端通過類似Nginx的反向代理來負載均衡,客戶端連接的其實是Nginx,而不是服務端,此時出現連接超時應該排查Nginx

讀取超時誤區:

  1. 讀取時間服務端處理和返回的時間 ,但傳輸快。可以認爲絕大部分的時間,是服務端處理業務邏輯的時間。 發生了讀取超時,網絡層面無法區分是服務端沒有把數據返回給客戶端,還是數據在網絡上耗時較久或丟包。但,因爲TCP是先建立連接後傳輸數據,對於網絡情況不是特別糟糕的服務調用,通常可以認爲出現連接超時是網絡問題或服務不在線,而出現讀取超時是服務處理超時。確切地說,讀取超時指的是,向Socket寫入數據後,我們等到Socket返回數據的超時時間,其中包含的時間或者
    說絕大部分的時間,是服務端處理業務邏輯的時間。

  2. 認爲超時時間越長任務接口成功率就越高,將讀取超時參數配置得太長。
    進行HTTP請求一般是需要獲得結果的,屬於同步調用。如果超時時間很長,在等待服務端返回數據的同時,客戶端線程(通常是Tomcat線程)也在等待,當下遊服務出現大量超時的時候,程序可能也會受到拖累創建大量線程,最終崩潰。

    對定時任務或異步任務來說,讀取超時配置得長些問題不大但面向用戶響應的請求或是微服務短平快的同步接口調用,併發量一般較大,我
    們應該設置一個較短的讀取超時時間,以防止被下游服務拖慢,通常不會設置超過30秒的讀取超時。

    你可能會說,如果把讀取超時設置爲2秒,服務端接口需要3秒,豈不是永遠都拿不到執行結果了?的確是這樣,因此設置讀取超時一定要根據
    實際情況,過長可能會讓下游抖動影響到自己,過短又可能影響成功率。甚至,有些時候我們還要根據下游服務的SLA,爲不同的服務端接口
    設置不同的客戶端讀取超時。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章