全部產品
Search
文件中心

:網路逾時處理

更新時間:Feb 28, 2024

本文介紹如何處理在使用OSS SDK時可能出現的網路逾時問題。

問題現象

OSS SDK在使用過程中出現的較典型的問題是使用SDK連網過程中出現逾時,且在上傳過程中提示ConnectionTimeOut的錯誤,比較影響使用者使用體驗。

問題排查

由於該問題無法複現,現列舉以下可能的原因進行逐一排查,以解決OSS SDK的網路逾時問題。

  1. 網路環境

    分析網路路徑:

    手機/PC --- 電訊廠商網路 --- OSS Server

    使用者所在的網路環境可能處在電訊廠商網路邊緣節點,向電訊廠商網路請求成功率比較低。可以利用CDN的邊緣加速節點,減少手機/PC網路對電訊廠商網路的依賴。具體鏈路如下:

    手機/PC -- CDN就近節點 -- 電訊廠商網路 -- OSS Server

    如果問題沒有完全解決,仍有ConnectionTimeOut的錯誤提示,請查看網路設定的分析。

  2. 網路設定

    以下代碼為具體的逾時錯誤資訊:

    "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傳輸。