限制Azure Webjobs一次处理的blob数

时间:2015-03-25 04:08:22

标签: azure azure-sql-database azure-storage-blobs azure-webjobs

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

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

Webjob results

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

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

1 个答案:

答案 0 :(得分:5)

是的,绝对可能。

假设您在这里使用的模式是使用在队列上弹出消息的Scheduled或On-Demand WebJobs,然后由持续运行的WebJob拾取,该WebJob处理来自队列的消息,然后执行您可以使用的工作JobHost.Queues.BatchSize属性,用于限制一次可以处理的队列消息数。 ħ

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 repo。我遇到了同样的问题,即我不能同时运行太多的工作。

https://github.com/markjbrown/AzCopyBackup

希望这有帮助。

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