問題描述
最近上了一版需求,其中有一個接口因為後端的計算量超級巨大,導致接口時間要達到七八秒才能返回對應結果。
上了生產環境以後,請求總是失敗。
測試環境是好好的...
查看控制枱請求發送的報文相關信息如下:
筆者看一下報文,發現請求的狀態從開始的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 // 給予接口足夠的時間
})
這樣設置以後,發現,問題解決
第一張圖是失敗的超時取消的請求,再附上一張成功的不超時的請求