我有一个azure存储队列,其上有超过100,000个队列项。完成每个项目的平均处理时间约为1分钟(如WebJob仪表板中所报告)。
我已将webJob的最大批量大小设置为32,如下所示:
JobHostConfiguration config = new JobHostConfiguration();
config.Queues.BatchSize = 32;
var host = new JobHost(config);
// The following code ensures that the WebJob will be running continuously
host.RunAndBlock();
如果我将其设置为高于32,则webjob不会启动并且一直在翻转(等待重启和启动),因此我假设32是最大批量大小。
但是,我的应用服务计划运行时具有很低的4%CPU利用率。我已根据CPU使用情况启用了自动缩放。
我想要做的是弄清楚如何让web作业并行执行更多任务,以便在需要时可以开始使用更多的CPU使用量,并希望使其自动扩展然后处理更多。我可以使用哪些杠杆来使我的WebJob更好地利用我的App Service Plan实例?
答案 0 :(得分:10)
请注意,BatchSize
最大值为32是Azure Queues强加的限制,WebJobs SDK无法控制。单个队列侦听器一次最多只能拉出32条消息,因为这是所有队列允许的。这就是为什么当你的工作设置大于32时你的工作没有正常启动的原因 - 如果你检查你的错误日志,你会看到一个错误就是这样。
但是,还有第二个配置旋钮,它与您可以配置的并行吞吐量相关。见config.Queues.NewBatchThreshold
。未明确设置时,此值默认为BatchSize
的一半。基本上,此设置是控制何时获取新批次的阈值。因此,如果增加此值(例如将其设置为100),将并行处理更多队列消息。如果设置为100,当正在处理的邮件数量低于100时,将获取新批次。
您还可以通过将作业扩展到多个实例来进一步提高吞吐量。我建议先尝试NewBatchThreshold设置,然后看看它的位置。
答案 1 :(得分:5)
This comment解释了这种情况:
// Azure Queues currently limits the number of messages retrieved to 32. We enforce this constraint here because
// the runtime error message the user would receive from the SDK otherwise is not as helpful.
private const int MaxBatchSize = 32;
有关此内容的更多信息,请访问https://azure.microsoft.com/en-us/documentation/articles/storage-dotnet-how-to-use-queues/:
有两种方法可以自定义队列中的消息检索。首先,您可以获得一批消息(最多32 )。 [等等...]
这就是这个限制的来源。但是,我认为WebJobs SDK理论上可以同时处理多个队列批次,因此它不必受此存储队列限制的约束。您应该在https://github.com/Azure/azure-webjobs-sdk/issues上提出一些建议,以便进一步讨论可以做些什么。但就目前而言,这确实是限制。