使用消费计划上的队列触发器和functionAppScaleLimit的Azure Functions缩放和并发性

问题描述

我在Linux消费计划上有一个Azure Function应用,该应用具有两个队列触发器。两个队列触发器的batchSize参数都设置为1,因为它们每个都可以使用大约500 MB的内存,并且我不想超过1.5GB的内存限制,因此只应允许一次只收到一条消息。

如果我想允许这两个队列触发器同时运行,但是又不想让它们超出范围,是否将functionAppScaleLimit设置为2足以实现这一目标?

编辑:添加了新示例,感谢@Hury Shen提供了这些示例的框架

有关更多详细信息,请参见下面的@Hury Shen答案。我已经测试了三种队列触发方案。全部使用以下图例:

enter image description here

没有functionAppScaleLimit的QueueTrigger

enter image description here

functionAppScaleLimit设置为2的QueueTrigger

enter image description here

functionAppScaleLimit设置为1的QueueTrigger

enter image description here

就目前而言,我认为我会坚持使用最后一个示例,但是将来,我认为如果升级,我可以将functionAppScaleLimit设置为23保费计划。我还将测试两个队列触发器,它们使用functionAppScaleLimit的{​​{1}}侦听不同的存储队列,但是我怀疑最安全的做法是为每个队列触发器创建单独的Azure Function应用在这种情况下。

编辑2:在一个功能应用中为两个队列触发器添加示例

以下是在一个Azure函数中使用两个队列触发器在两个不同的存储队列上侦听的结果。这是两个队列触发器的图例:

enter image description here

两个队列触发器均在2设置为2的情况下同时运行

enter image description here

两个队列触发器在functionAppScaleLimit设置为1的情况下同时运行

enter image description here

在两个队列触发器同时运行且functionAppScaleLimit设置为functionAppScaleLimit的示例中,规模限制似乎不起作用。微软的人可以解释一下吗?官方文档(https://docs.microsoft.com/en-us/azure/azure-functions/functions-scale#limit-scale-out)中没有警告说此设置处于预览模式,但是当限制设置为2时,我们可以清楚地看到Azure函数正在扩展到4个实例。 ,似乎限制已得到遵守,但功能不是我想要的,我们仍然看到@Hury Shen的答案中存在着等待。

结论
若要限制具有队列触发器的Azure Functions中的并发性和控件缩放,必须限制Azure Function每个函数应用使用一个队列触发器,并使用2batchSize设置。如果您使用多个队列触发器,则会遇到比赛条件和等待,这可能导致超时。

解决方法

是的,您只需要将functionAppScaleLimit设置为2。但是您需要了解一些有关消费计划的机制。我将batchSize设置为1,并将functionAppScaleLimit设置为2(我在{功能应用程序的应用程序设置”(而非设置WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT,它们是相同的)。我用下面的代码进行测试:

2

然后将消息添加到队列中,我发送了10条消息:functionAppScaleLimitimport logging import azure.functions as func import time def main(msg: func.QueueMessage) -> None: logging.info('=========sleep start') time.sleep(30) logging.info('=========sleep end') logging.info('Python queue trigger function processed a queue item: %s',msg.get_body().decode('utf-8')) 111222333,{{1} },444555666777,我一一发送。该功能已成功触发,几分钟后,我们可以在“ 监视器”中看到日志。点击“ 显示器”中的其中一个日志,我们可以看到日志显示为: enter image description here

我在上方屏幕截图的右侧使用了四个红色框,分别将四个日志分别命名为“ s1 ”,“ s2 ”,“ s3 ”,“ s4 ”(步骤1-4)。并总结excel中的日志,以供您参考: enter image description here

我将单元格从“ s2 ”更改为“ s4 ”,因为这段时间是指函数任务的执行时间。

根据excel的屏幕截图,我们可以推断出以下几点

1。。实例的最大数量只能扩展为2,因为我们发现它在excel表的每一行中不超过两个黄色单元格。 因此,该函数不能扩展到您在问题中提到的2个实例。

2。。您要允许这两个队列触发器同时运行,因此可以实施。 但是实例将通过消耗机制进行扩展。简单来说,当一个函数实例被一条消息触发但尚未完成任务,而现在又出现另一条消息时,它将无法执行确保使用另一个实例。第二条消息可能正在第一个实例上等待。 我们无法控制是否启用了另一个实例

=============================== 更新 ======== =====================

由于我不太清楚您的描述,因此不确定您要收听多少存储队列,以及在您身边创建了多少功能应用程序和QueueTrigger函数。我将测试结果总结如下,供您参考:

1。。关于您关于888的问题,我认为如果我们选择高级计划,则实例也将使用相同的消费计划机制进行扩展。

2。。如果您需要监听两个存储队列,我们​​当然应该创建两个QueueTrigger函数来监听每个存储队列。

3。。如果您只需要听一个存储队列,我将测试三种情况(我将三种情况下的最大规模实例设置为2):

A)在一个功能应用程序中创建一个 QueueTrigger函数,以监听一个存储队列。这就是我在原始答案中所测试的内容,excel表向我们显示了实例将通过消耗计划机制进行扩展,而我们无法控制它。

B)在一个函数应用中创建两个 QueueTrigger函数,以监听相同存储队列。结果与情况A几乎相同,我们无法控制使用多少实例来处理消息。

C)创建两个功能应用程序,并在每个功能应用程序中创建 a QueueTrigger功能,以收听相同 >存储队列。结果也与情况A和情况B类似,区别在于最大实例数可以缩放到4,因为我创建了两个函数应用程序(它们都可以缩放到2个实例)。

总而言之,我认为这三种情况都是相似的。尽管我们选择第3种情况,但要创建两个具有一个QueueTrigger函数的函数应用程序。 我们也不能确保立即处理第二条消息,仍然可以将其处理为第一例,并等待第一例完成处理第一条消息。

因此,本文中您当前问题的答案 999 是:如果您希望同时启用两个实例,我们将无法确定。如果您只希望两个实例处理消息,则答案是肯定的。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...