文件从Azure存储中上传了两次.删除可能的问题



这是关于Azure存储和Azure在Microsoft Azure中功能的问题。

我在存储中有一个容器,以及计时器功能。这个想法是,每当某人将zip文件(包含JSON文件(放入容器中时,计时器函数都会将内容上传到数据库。计时器函数是否包含任何zip文件,持续检查存储空间。我之所以选择计时器函数而不是blob触发器,是因为数据库不能同时处理太多查询,以防容器收回大量zip文件。

现在,问题在于,有时该功能将两次上传到数据库,甚至在上传后我将文件删除在存储中。我不知道为什么,因为在我看来,每次我测试的文件都已成功删除。

到目前为止,我已经测试了从控制台应用程序上传的本地文件,该文件正常,因此上传本身没有错。我已经测试了在之后运行方法>我将所有Zips上传到存储空间。这也可以正常工作。当计时器函数运行并读取zip文件时,似乎发生了问题,而更多的zip文件被添加到存储中。

计时器功能:

static ConcurrentQueue<CloudBlockBlob> queue;
[FunctionName("RezippedUploadFunction")]
public static async System.Threading.Tasks.Task RunAsync([TimerTrigger("0 * * * * *")]TimerInfo myTimer, ILogger log)
{
    var storage = new Storage();
    var blobs = await storage.GetCloudBlockBlobsAsync("rezipped");
    if (blobs.Count == 0) return;
    queue = new ConcurrentQueue<CloudBlockBlob>(blobs);
    var ctasks = 30;
    var tasks = new Task[ctasks];
    for (var i = 0; i < ctasks; i++)
    {
        tasks[i] = Task.Factory.StartNew(() => UploadTaskTest());
    }
    Task.WaitAll(tasks);
    blobs.ForEach(x => Task.WaitAll(storage.HardDeleteBlobAsync(x.Name, "rezipped")));
    Thread.Sleep(1000 * 60);
    log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
}

上传方法:

static void UploadTaskTest()
{
    var finish = DateTime.Now.AddMinutes(5);
    var zip = new Zip();
    var storage = new Storage();
    CloudBlockBlob blob;
    while (queue.TryDequeue(out blob))
    {
        var stream = storage.DownloadBlobAsync(blob.Name, "rezipped");
        Task.WaitAll(stream);
        zip.UploadZip(stream.Result);
        //if (DateTime.Now > finish) break;
    }
}

其他方法:

public async Task HardDeleteBlobAsync(string name, string container)
{
    await GetContainer(container).GetBlockBlobReference(name).DeleteAsync();
}

预期的结果是,上传到存储的每个文件应仅读取并上传到数据库。实际结果是有时(这有很大变化,可能在10-100个文件中有1个(读取和上传两次文件。

我相信触发了一个以上的实例,而不是一个实例。但是我不是100%确定

另外,您可以使用事件网格来触发Azure功能。由于事件将包含仅具有上下文,这可能会帮助您决定是否处理文件或忽略该文件是否更大。该解决方案将是最佳的,并且还会降低运行该功能的成本(您可以切换到消费而不是应用程序服务计划(。

最新更新