Introdução
O timeout de conexão de rede é um problema comum enfrentado por usuários do OSS SDK ao fazer upload de arquivos. Nessas situações, o sistema reporta um erro ConnectionTimeOut, o que impacta negativamente a experiência do usuário.
Solução de problemas
Como esse problema não se reproduz facilmente, analise as possíveis causas descritas abaixo para diagnosticar e resolver o timeout de conexão de rede no OSS SDK.
-
Ambiente de rede
Analise o seguinte enlace de rede:
Celular/PC --- Rede da operadora --- Servidor OSS
Sua conexão pode estar em um nó de borda da rede da operadora. Consequentemente, as requisições enviadas têm maior probabilidade de falhar. Use nós de borda do CDN para aceleração e reduza a dependência de celulares e PCs em relação à rede da operadora. O enlace de rede fica da seguinte forma:
Celular/PC -- Nó de borda CDN mais próximo -- Rede da operadora -- Servidor OSS
Caso o problema persista e o erro ConnectionTimeOut continue ocorrendo, leia a análise a seguir.
-
Configuração de rede
O código abaixo apresenta a mensagem de erro de timeout detalhada:
"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: 2A mensagem de erro permite tirar as seguintes conclusões:
A conexão falhou porque o cliente não recebeu resposta do servidor em 60 segundos.
Conforme os logs do CDN, o timeout ocorre devido à desconexão da rede antes do upload completo de uma parte.
Em condições de rede precárias, se o arquivo for muito grande, o cliente ou PC demora a receber respostas do servidor OSS.
Com base nessas conclusões, recomendamos as seguintes soluções:
Faça o upload de arquivos com o método multipart upload e limite o tamanho máximo da parte a 1 MB.
Implemente um mecanismo de retomada para reenviar partes com falha no upload.
Aumente o período de timeout.
// 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(''); } } }); };
Resumo
Ao acessar dados do OSS com um nome de domínio padrão (por exemplo, oss-cn-hangzhou.aliyuncs.com), o tráfego passa pela rede da operadora. Nesse cenário, ambientes de rede complexos (como instabilidade ou condições precárias) podem causar erros ConnectionTimeOut durante uploads. Experimente as seguintes soluções:
-
Use o método multipart upload para enviar arquivos e mantenha o tamanho das partes entre 100 KB e 1 MB.
NotaO servidor OSS não aceita partes menores que 100 KB.
-
Adicione um mecanismo de retomada para reenviar partes com falha no upload.
NotaEsse recurso vem ativado por padrão nos SDKs para Android e iOS; portanto, nenhuma configuração é necessária.
Aumente o período de timeout.
-
Use o serviço de aceleração CDN para otimizar a transmissão de dados no OSS.