我有一个 Azure 函数,用于调用托管在 VM 上的 Web 服务。由于存在此依赖关系,因此同时运行的 Azure 函数实例不得超过 8 个(VM 只有 8 个核心,每次调用 Web 服务都使用一个核心)。如果生成的实例超过 8 个,则 Web 服务调用将开始备份,触发 Azure 函数的队列中的项将开始超时,并且消息将被丢弃。但是,我还希望尽可能多地利用可用资源来最大化队列的处理,因此我希望每当队列中有 8 个或更多项时,始终运行 8 个 Azure 函数实例。
为了完成所需的限制,我已将 Azure 函数计划设置为在应用服务计划而不是消耗计划上运行,并在 Azure 函数服务的 host.json 中设置了以下值:
{
"queues": {
"batchSize": 1,
"newBatchThreshold": 7
}
}
从理论上讲,只要运行 7 个或更少的函数实例,就会再取消 1 条消息的排队,直到有 8 条消息正在处理。我现在正在运行它,它似乎正在工作,但我在 host.json 文档或 WebJobs SDK 文档中找不到任何说明是否可以batchSize
小于newBatchThreshold
的任何地方。我只知道建议newBatchThreshold
是batchSize
的一半(这显然不是我正在做的事情)。
我的问题是:这种配置可以吗?还是有更好的方法来实现我的限制目标?
是的,这完全没问题。每个标志都有一个精确的(尽管有点令人困惑的)语义,任何组合都是有效的,并且将遵循记录的语义。
请注意,使用消耗 Azure 函数时,最终可能会扩展到多个实例,每个实例都有这些限制。如果要避免这种情况,请尝试将WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT
设置为 1,每个 https://github.com/Azure/azure-webjobs-sdk-script/wiki/Configuration-Settings