問題描述
最近上了一版需求,其中有一個介面因為後端的計算量超級巨大,導致介面時間要達到七八秒才能返回對應結果。
上了生產環境以後,請求總是失敗。
測試環境是好好的...
檢視控制檯請求傳送的報文相關資訊如下:
筆者看一下報文,發現請求的狀態從開始的pending
等待到最後的canceled
取消。
點開請求的Timing
皮膚檢視,發現請求卡在Connection Star
的Initial 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 // 給予介面足夠的時間
})
這樣設定以後,發現,問題解決
第一張圖是失敗的超時取消的請求,再附上一張成功的不超時的請求