Initial connection超時介面無法正常請求Status canceled

水冗水孚發表於2023-01-08

問題描述

最近上了一版需求,其中有一個介面因為後端的計算量超級巨大,導致介面時間要達到七八秒才能返回對應結果。

上了生產環境以後,請求總是失敗。

測試環境是好好的...

檢視控制檯請求傳送的報文相關資訊如下:

筆者看一下報文,發現請求的狀態從開始的pending等待到最後的canceled取消。

點開請求的Timing皮膚檢視,發現請求卡在Connection StarInitial connection地方不往下走了。

Initial connection是建立TCP連線的意思,筆者不禁思索,為啥好好的請求,TCP連線連不上了啊,也是一臉懵。

於是,筆者去百度如何解決Initial connection過慢失敗問題,發現網上的帖子眾說紛紜,如:可能是一個域名下掛著兩個ip、如:可能是域名解析DNS問題之類的等...

與此同時,後端同事也在看如何最佳化自己的介面,讓介面返回快速一些...

前後端就這樣各自研究了一下午。

解決方案

其實一開始方向就錯了,不應該看Initial connection超時就認為是什麼環境域名導致TCP連線不上(公司測試環境是ip生產環境是域名),導致TCP連線不上的原因有很多。

其中有一點就是前端限制了超時時間,導致了TCP沒時間去進行連線、去進行三次握手四次揮手,所以最終的解決方案是:

前端放開超時時間axios中的timeout超時時間限制

既然這個請求會達到七八秒,那麼這個就將超時時間設定為16秒,這樣的話,時間足夠用了。

import axios from "axios";
const http = axios.create({
    timeout: 16000 // 給予介面足夠的時間
})

這樣設定以後,發現,問題解決

第一張圖是失敗的超時取消的請求,再附上一張成功的不超時的請求

相關文章