はじめに

ネットワーク接続のタイムアウトは、OSS SDK ユーザーが SDK を使用してファイルをアップロードするときに発生しうる問題です。 ネットワーク接続のタイムアウトが発生した場合、ConnectionTimeOut エラーが報告され、ユーザーエクスペリエンスに悪影響を及ぼします。

トラブルシューティング

この問題は再現できないため、OSS SDK のネットワーク接続タイムアウト問題を分析および解決するため、考えられる原因を以下で説明します。

  1. ネットワーク環境

    次のネットワークリンクを分析します。

    携帯電話 / PC ---通信事業者ネットワーク--- OSS サーバー

    ユーザーのネットワークは、通信事業者ネットワークのエッジノードにある可能性があります。 そのため、通信事業者ネットワークに送信された要求は失敗する可能性が高くなります。 CDN エッジノードを使用して高速化することで、携帯電話および PC の通信事業者ネットワークへの依存を減らすことができます。 ネットワークリンクは次のとおりです。

    携帯電話 / PC -- 最寄りの CDN エッジノード -- 通信事業者ネットワーク -- OSS サーバー

    それでも問題が解決せず、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

    エラーメッセージから、次のことがわかります。

    • クライアントが 60 秒以内にサーバーから応答を受け取っていない。
    • CDN ログによると、パーツが完全にアップロードされる前にネットワーク接続が切断されているため、タイムアウトの問題が発生しています。
    • 通信状況が悪い場合、アップロードするファイルが大きすぎると、クライアントの PC は OSS サーバーからの応答を長時間受信することができません。

    上記の分析に基づき、次の解決策を推奨します。

    • マルチパートアップロード方式でファイルをアップロードし、最大パーツサイズを 1 MB に制限します。
    • アップロードに失敗したパーツを再アップロードするため、再開可能なメカニズムを追加します。
    • タイムアウトまでの時間を長くします。
    // Code example of multipart upload in 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, // Set the part size.
        Timeout: 120000, // Set the timeout period.
      };
      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 データにアクセスすると、そのアクセスは通信事業者ネットワークを介して実行されます。 この場合、複合ネットワーク環境 (不安定なネットワークや劣悪なネットワーク状況など) が原因で、アップロード中に ConnectionTimeOut エラーが発生することがあります。 次の解決策を試してみてください。

  • マルチパートアップロード方式でファイルをアップロードし、パーツサイズを 100 KB から 1 MB の範囲に制限します。
    OSS サーバーは 100 KB 未満のパーツを受信しません。
  • アップロードに失敗したパーツを再アップロードするため、再開可能なメカニズムを追加します。
    このメカニズムは Android および iOS SDK では、既定では有効になっているため、設定は不要です。
  • タイムアウトまでの時間を長くします。
  • CDN アクセラレーションサービスを使用し、OSS のデータ転送を高速化します。