限制 Azure Webjobs 一次处理的 blob 数量

Limit number of blobs processed at one time by Azure Webjobs

我有一个 Azure Webjob,可以将大型 CSV(500 MB 到 10+ GB)复制到 SQL Azure table。我每天都会收到一个新的 CSV,我只保留 1 个月的记录,因为将它们保存在 SQL 中很昂贵,所以它们非常不稳定。

为了让他们开始,我批量上传了上个月的数据(约 200 GB),我看到同时处理了所有 30 个 CSV 文件。这会导致上传中出现非常疯狂的备份,如图所示:

我有大约 5 个页面看起来像这样计算所有重试次数。 如果我一次上传 2 个,一切都很好!但是从 运行 次可以看出,有些可能需要 14 个小时才能完成。

我想做的是批量上传 30 个 CSV,让 Webjob 一次只处理其中的 3 个文件,然后一旦一个完成,就开始下一个。使用当前的 SDK 可以吗?

是的,绝对有可能。

假设您在此处使用的模式是使用计划或按需 WebJobs 在队列中弹出一条消息,然后不断 运行ning WebJob 处理队列中的消息并然后你可以使用 JobHost.Queues.BatchSize 属性 来限制一次可以处理的队列消息的数量。 H

static void Main()
{
    JobHostConfiguration config = new JobHostConfiguration();

    //AzCopy cannot be invoked multiple times in the same host
    //process, so read and process one message at a time
    config.Queues.BatchSize = 1;
    var host = new JobHost(config);
    host.RunAndBlock();
}

如果您想看看实际效果如何,请随时克隆我最近发布的关于如何使用 WebJobs 和 AzCopy 创建您自己的 Blob 备份服务的 GitHub 存储库。我遇到了与您面临的相同问题,即我无法 运行 一次处理太多工作。

https://github.com/markjbrown/AzCopyBackup

希望对您有所帮助。

编辑,我差点忘了。虽然您可以更改上面的 BatchSize 属性,但您还可以利用拥有多个 VM 的主机并处理这些作业,这基本上允许您将其扩展为多个独立的并行进程。您可能会发现您可以增加 VM 的数量并非常快速地处理数据,而不必使用 BatchSize 来限制它。