はじめに
ネットワーク接続のタイムアウトは、OSS SDK ユーザーが SDK を使用してファイルをアップロードするときに発生しうる問題です。 ネットワーク接続のタイムアウトが発生した場合、ConnectionTimeOut エラーが報告され、ユーザーエクスペリエンスに悪影響を及ぼします。
トラブルシューティング
この問題は再現できないため、OSS SDK のネットワーク接続タイムアウト問題を分析および解決するため、考えられる原因を以下で説明します。
- ネットワーク環境
次のネットワークリンクを分析します。
携帯電話 / PC ---通信事業者ネットワーク--- OSS サーバー
ユーザーのネットワークは、通信事業者ネットワークのエッジノードにある可能性があります。 そのため、通信事業者ネットワークに送信された要求は失敗する可能性が高くなります。 CDN エッジノードを使用して高速化することで、携帯電話および PC の通信事業者ネットワークへの依存を減らすことができます。 ネットワークリンクは次のとおりです。
携帯電話 / PC -- 最寄りの CDN エッジノード -- 通信事業者ネットワーク -- OSS サーバー
それでも問題が解決せず、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
エラーメッセージから、次のことがわかります。
- クライアントが 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 のデータ転送を高速化します。