如何扩展 Azure Webjobs

Posted

技术标签:

【中文标题】如何扩展 Azure Webjobs【英文标题】:How to Scale Azure Webjobs 【发布时间】:2016-10-10 22:55:47 【问题描述】:

我知道 webjob 可以随 webapp 扩展,即如果我的 webapp 在 5 个实例上运行,那么 webjobs 也将在 5 个实例上运行。 我只是想知道是否有办法在网站的每个实例中拥有多个 webjob 实例。

注意:我的 JobHostConfiguration.QueuesConfiguration.BatchSize = 32 的值已经达到最大值。

现在,我的 webapp 在 1 个实例上运行。 Webjobs 正在同时处理 32 个。 我的目标是同时处理 3*32 = 96。

实现此目标的一种可能方法是部署相同的 webjobs 3 次(为 webJobName 属性设置不同的名称),但我不确定这是否是一个好习惯。请指出适当的文档。

    config.Queues.NewBatchThreshold 表示什么?

    config.Queues.NewBatchThreshold 的默认值是多少?

    对于队列处理,config.Queues.NewBatchThreshold 的推荐值应该是多少?

【问题讨论】:

【参考方案1】:

从https://github.com/Azure/azure-webjobs-sdk/issues/628复制乔恩的答案:

NewBatchThreshold 是 SDK 刷新批次之前要在批次中处理的消息数。

例如,如果您的批处理大小为 20,NewBatchThreshold 为 5,则 SDK 每次会从队列中抓取 20 条消息,将它们传递给您的代码,让您一一处理,然后当它下降到最后 5 条未处理的消息(所以你已经处理了 15 条)它将抓取接下来的 20 条。See here 在“并行执行”下

默认情况下,NewBatchThreshold 是 BatchSize (see source code) 的一半,这就是为什么批量大小为 1 时您看到的值为 0。

请注意,根据我刚刚打开的 this issue,我们想让这不那么令人困惑。

【讨论】:

第一个问题呢?如果我的业务需要处理超过 32 个,有没有办法在单个实例中处理更多?如何同时运行 96 个或更多。寻找一些描述扩展最佳实践的好文档 并行运行的最大作业数最终为NewBatchThreshold+BatchSize。因此,通过将NewBatchThreshold 设置为更大的数字,就可以实现这一点。 @ArifulHaque 我认为扩展的最佳实践是拥有超过 1 个 webjob(网站)实例......施加具有单个实例的约束可能违反了最佳实践。在任何情况下,如果您实现了多个执行相同操作的队列触发函数,您可能可以实现 BatchSize > 32。 @David - BatchSize 适用于 webjob 进程本身还是每个队列触发的函数? @Matt 它在进程中全局设置(您不能为不同的功能设置不同的限制),但它单独适用于每个队列触发的功能。即它们彼此独立运行。

以上是关于如何扩展 Azure Webjobs的主要内容,如果未能解决你的问题,请参考以下文章

如何将消息添加到 azure webjobs 队列

Azure webjobs - Unity - 如何将范围内的依赖项注入其他类

在 azure 上发布网站时,webjobs 被删除

Azure WebJobs SDK TimerTrigger 函数未运行

Azure WebJobs 在监控多个队列时如何对消息进行优先级排序?

Azure 服务总线:Microsoft.Azure.WebJobs.Script.HostDisposedException:主机已释放,无法使用