2016-11-29 10 views
0

Azure 함수 (코드는 Stack Overflow here)에서 다음 코드를 실행하면 대용량 파일이 예상대로 다운로드됩니다. 그러나 때로는 파일에 데이터를 추가하는 것을 멈추고 다시 시작하지 못합니다. 파일이 클수록 더 자주 발생합니다. 나는 어떤 오류도, 아무것도 얻지 않는다. 프로세스가 진행되지 않고 10 초 후에 프로세스를 다시 깨우는 방법이 있습니까, 아니면 프로세스를 계속 주시 할 다른 방법이 있습니까?azure 다운로드 node.js timeout

var azure = require('azure-storage'); 
var fs = require('fs'); 

module.exports = function (context, input) { 

context.done(); 

var accessKey = 'myaccesskey'; 
var storageAccount = 'mystorageaccount'; 
var containerName = 'mycontainer'; 

var blobService = azure.createBlobService(storageAccount, accessKey); 

var recordName = "a_large_movie.mov"; 
var blobName = "standard/mov/" + recordName; 

var blobSize; 
var chunkSize = (1024 * 512) * 8; // I'm experimenting with this variable 
var startPos = 0; 
var fullPath = "D:/home/site/wwwroot/myAzureFunction/input/"; 
var blobProperties = blobService.getBlobProperties(containerName, blobName, null, function (error, blob) { 
    if (error) { 
     throw error; 
    } 
    else { 
     blobSize = blob.contentLength; 
     context.log('Registered length: ' + blobSize); 
     fullPath = fullPath + recordName; 
     console.log(fullPath); 
     doDownload(); 
    } 
} 
); 

function doDownload() { 
var stream = fs.createWriteStream(fullPath, {flags: 'a'}); 
var endPos = startPos + chunkSize; 
if (endPos > blobSize) { 
    endPos = blobSize; 
    context.log('Reached end of file endPos: ' + endPos); 
} 

context.log("Downloading " + (endPos - startPos) + " bytes starting from " + startPos + " marker."); 

blobService.getBlobToStream(
    containerName, 
    blobName, 
    stream, 
    { 
     "rangeStart": startPos, 
     "rangeEnd": endPos-1 
    }, 
    function(error) { 
     if (error) { 
      throw error; 
     } 
     else if (!error) { 
      startPos = endPos; 
      if (startPos <= blobSize - 1) { 
       doDownload(); 
      } 
     } 
    } 
); 
} 

}; 
+0

chunkSize를 4MB에서 1MB로 줄였습니까? –

+0

특별히 1MB가 아닙니다. 내가 512KB의 청크 크기로 시작했지만, 위에서 언급 한 것과 같은 가끔 타임 아웃을 주었다. –

+0

안녕하세요 @ GauravMantri - 청크를 1MB로 바꿨고 더 나아졌습니다. 그러나 지금은 큰 파일이 여전히 시간 초과되므로 문제가 해결되지 않습니다. 그러나 그것을 개선했습니다. 청크 크기와 가능한 시간 초과 사이의 연결은 무엇입니까? –

답변

0

현재 기능 애플 리케이션에 관한 짧은 유휴 시간 제한이있다, 그래서 그들은 5 분 다음 요청에 대한 요청을하지 않을 경우, 서버가 언로드됩니다.

때로는 그냥 파일에 데이터를 추가 중지하고 다시 시작되지 않습니다 :

그래서, 당신은 문제가 발생했습니다. 파일이 클수록 더 자주 발생합니다.

Azure 기능의 우수 사례에 대한 제안은 https://docs.microsoft.com/en-us/azure/azure-functions/functions-best-practices#avoid-large-long-running-functions에서 찾을 수 있습니다.

따라서 WebJobs을 해결 방법으로 사용하고 Azure App Service의 응용 프로그램 설정에서 구성을 항상 사용으로 설정하면 을 사용하도록 설정할 수 있습니다.

더 이상의 우려 사항이 있으면 언제든지 알려주세요.

+0

안녕하세요 @Gary - 5 분간 매우 재미 있습니다. 그러나 5 분이 지나기 전에 내 다운로드 기능이 작동하지 않는 것 같습니다. 활동을위한 프로세스를 모니터링 할 수있는 방법이 있습니까? 30 초 동안 아무 것도 일어나지 않으면 청크 요청을 다시 보내거나 파일 다운로드를 다시 시작하십시오. 또한 오류 응답이 없을 때이 오류와 같은 오류를 어떻게 기록합니까? –