本文介紹如何處理在使用OSS SDK時可能出現的網路逾時問題。
問題現象
OSS SDK在使用過程中出現的較典型的問題是使用SDK連網過程中出現逾時,且在上傳過程中提示ConnectionTimeOut的錯誤,比較影響使用者使用體驗。
問題排查
由於該問題無法複現,現列舉以下可能的原因進行逐一排查,以解決OSS SDK的網路逾時問題。
- 網路環境
分析網路路徑:
手機/PC --- 電訊廠商網路 --- OSS Server
使用者所在的網路環境可能處在電訊廠商網路邊緣節點,向電訊廠商網路請求成功率比較低。可以利用CDN的邊緣加速節點,減少手機/PC網路對電訊廠商網路的依賴。具體鏈路如下:
手機/PC -- CDN就近節點 -- 電訊廠商網路 -- OSS Server
如果問題沒有完全解決,仍有ConnectionTimeOut的錯誤提示,請查看網路設定的分析。
- 網路設定
以下代碼為具體的逾時錯誤資訊:
"ConnectionTimeoutError&errormsg=Failed to upload some parts with error: ConnectionTimeoutError: Connect timeout for 60000ms, PUT https://***.oss-cn-hangzhou.aliyuncs.com/***/***/***.mp4?partNumber=2&uploadId=*** -2 (connected: false, keepalive socket: false)headers: {} part_num: 2
從錯誤資訊中可以得出如下結論 :
- 超過60s沒有收到伺服器的返回資訊而中斷連線。
- 分析CDN提供的日誌,逾時的主要原因是分區還沒上傳成功,串連就已經斷開。
- 如果上傳的檔案較大,在弱網路環境下,用戶端/PC端發送的請求遲遲得不到OSS伺服器的響應。
綜合以上分析過程,現推薦以下幾種解決方案:
- 上傳方式採用分區斷點上傳,每個分區的大小不超過1MB。
- 添加重傳機制,保證某一個分區上傳失敗後還可以繼續上傳。
- 增大逾時時間。
//js sdk 分區斷點上傳範例程式碼 let retryCount = 0; let retryCountMax = 3; ... const uploadFile = function uploadFile(client) { if (!uploadFileClient || Object.keys(uploadFileClient).length === 0) { uploadFileClient = client; } ... console.log(`${file.name} => ${key}`); const options = { progress, partSize: 1000 * 1024,//設定分區大小 timeout: 120000,//設定逾時時間 }; if (currentCheckpoint) { options.checkpoint = currentCheckpoint; } return uploadFileClient.multipartUpload(key, file, options).then((res) => { console.log('upload success: %j', res); currentCheckpoint = null; uploadFileClient = null; }).catch((err) => { if (uploadFileClient && uploadFileClient.isCancel()) { console.log('stop-upload!'); } else { console.error(err); //retry if (retryCount < retryCountMax){ retryCount++; console.error("retryCount : " + retryCount); uploadFile(''); } } }); };
總結
如果通過標準OSS訪問網域名稱(例如oss-cn-hangzhou.aliyuncs.com)訪問OSS的資料,且這是通過電訊廠商網路對OSS進行訪問,由於網路環境的複雜性,例如在一些弱網路環境下或網路不穩定的情況,就會在上傳過程中遇到ConnectionTimeOut的網路錯誤。可以嘗試通過以下方式來解決:
- 採用分區斷點上傳,每個分區的大小不要超過1MB,也不要小於100KB。 說明 OSS伺服器不接受小於100KB大小的分區。
- 添加重傳機制,保證某一個分區上傳失敗後還可以繼續上傳。 說明 Android/iOS SDK中已經預設開啟, 不需要額外配置。
- 增大逾時時間。
- 通過CDN全站加速服務來提升OSS傳輸。