我在Azure Functions中运行以下代码(代码来自Stack Overflow here),大部分时间都按照预期下载大文件。但是,有时它只是停止向文件添加数据,而不会再次启动。文件越大,发生的次数越多。我没有任何错误,没有。有没有什么方法可以在没有进展的10秒钟之后再次唤醒过程,或者以其他方式来关注这个过程?
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 :(得分:0)
目前,功能应用程序存在短暂的空闲超时,因此如果他们在下一个请求中没有获得5分钟的请求,则将卸载服务器。
所以,你发生了这个问题:
有时它会停止向文件添加数据,而不会再次启动。文件越大,发生的次数越多。
您还可以在https://docs.microsoft.com/en-us/azure/azure-functions/functions-best-practices#avoid-large-long-running-functions找到有关Azure功能最佳做法的建议。
因此,您可以尝试使用WebJobs作为解决方法,并在Azure应用服务的应用设置中启用始终开启配置。
如有任何疑问,请随时告诉我。