【发布时间】:2021-02-23 23:13:49
【问题描述】:
我在 Linux 消费计划上有一个 Azure Function 应用,它有两个队列触发器。两个队列触发器都将batchSize 参数设置为1,因为它们每个都可以使用大约 500 MB 的内存,而且我不想超过 1.5GB 的内存限制,所以只允许它们接收一条消息一次。
如果我想允许这两个队列触发器同时运行,但不希望它们超出此范围,将 functionAppScaleLimit 设置为 2 是否足以实现这一目标?
编辑:添加新示例,感谢@Hury Shen 为这些示例提供框架
更多详情请查看下方@Hury Shen 的回答。我已经测试了三个队列触发场景。都使用以下图例:
没有functionAppScaleLimit的QueueTrigger
QueueTrigger 将functionAppScaleLimit 设置为2
将functionAppScaleLimit 设置为1 的QueueTrigger
目前,我想我会坚持使用最后一个示例,但将来如果我升级到高级计划,我想我可以安全地将我的 functionAppScaleLimit 设置为 2 或 3。我还将测试两个队列触发器,它们使用 functionAppScaleLimit 或 2 监听不同的存储队列,但我怀疑对我来说最安全的做法是在该场景中为每个队列触发器创建单独的 Azure Function 应用程序。
编辑 2:在一个函数应用中添加两个队列触发器的示例
以下是在一个 Azure 函数中使用两个队列触发器时的结果,这些触发器正在侦听两个不同的存储队列。这是两个队列触发器的图例:
两个队列触发器同时运行,functionAppScaleLimit 设置为 2
两个队列触发器同时运行,functionAppScaleLimit 设置为 1
在两个队列触发器同时运行且functionAppScaleLimit 设置为2 的示例中,规模限制似乎不起作用。微软的人可以解释一下吗?官方文档 (https://docs.microsoft.com/en-us/azure/azure-functions/functions-scale#limit-scale-out) 中并没有警告该设置处于预览模式,但我们可以清楚地看到,当限制设置为 2 时,Azure Function 正在扩展到 4 个实例。在以下示例中,它看起来限制得到尊重,但功能不是我想要的,我们仍然看到@Hury Shen 的回答中存在等待。
结论
若要使用队列触发器限制 Azure Functions 中的并发和控制缩放,必须将 Azure Functions 限制为每个函数应用使用一个队列触发器,并使用 batchSize 和 functionAppScaleLimit 设置。如果您使用多个队列触发器,您将遇到可能导致超时的竞争条件和等待。
【问题讨论】:
标签: azure azure-functions azure-function-app azure-queues