2016-11-29 69 views
0

我有以下代码在Azure函数中运行(代码来自堆栈溢出here),大部分时间都按照它应该下载的大文件。但是,有时它只是停止向文件添加数据,并且从不再次启动。文件越大,发生的次数越多。我没有得到任何错误,什么都没有。在没有进步的情况下,例如10秒后,还是有其他方式来唤醒整个过程,或者有其他方式来关注过程?天青下载node.js超时

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

您是否尝试将块大小从4MB减少到1MB? –

+0

不是1 MB具体。不过,我以512 KB的块大小开始,并且它给出了与上面提到的相同的偶尔超时 –

+0

Hi @GauravMantri - 我将块更改为1MB,它确实使它更好。但是,现在一个大文件仍然超时,所以问题没有消失。但它确实改善了它。块大小和可能的超时之间的连接是什么? –

回答

0

目前,Function应用程序有一个短暂的空闲超时时间,所以如果下一个请求5分钟内没有收到请求,服务器将被卸载。

所以,你出现了问题:

有时它只是停止将数据添加到文件中,从来没有再次启动。文件越大,发生的次数越多。

您还可以在https://docs.microsoft.com/en-us/azure/azure-functions/functions-best-practices#avoid-large-long-running-functions找到有关Azure功能最佳实践的建议。

因此,您可以尝试使用WebJobs作为解决方法,并在Azure App Service的应用程序设置中启用始终开启配置。

任何进一步的关注,请随时让我知道。

+0

嗨@加里 - 非常有趣的5分钟。但是,似乎我的下载功能在5分钟过去之前停止工作。有什么方法可以监视进程的活动,如果在30秒内没有发生任何事情,请重新发送块的请求或重新开始下载文件?另外,如果没有错误响应,我怎么会错误地记录像这样的超时? –