问题描述
我在Linux消费计划上有一个Azure Function应用,该应用具有两个队列触发器。两个队列触发器的batchSize
参数都设置为1
,因为它们每个都可以使用大约500 MB的内存,并且我不想超过1.5GB的内存限制,因此只应允许一次只收到一条消息。
如果我想允许这两个队列触发器同时运行,但是又不想让它们超出范围,是否将functionAppScaleLimit
设置为2
足以实现这一目标?
编辑:添加了新示例,感谢@Hury Shen提供了这些示例的框架
有关更多详细信息,请参见下面的@Hury Shen答案。我已经测试了三种队列触发方案。全部使用以下图例:
没有functionAppScaleLimit
的QueueTrigger
将functionAppScaleLimit
设置为2
的QueueTrigger
将functionAppScaleLimit
设置为1
的QueueTrigger
就目前而言,我认为我会坚持使用最后一个示例,但是将来,我认为如果升级,我可以将functionAppScaleLimit
设置为2
或3
保费计划。我还将测试两个队列触发器,它们使用functionAppScaleLimit
的{{1}}侦听不同的存储队列,但是我怀疑最安全的做法是为每个队列触发器创建单独的Azure Function应用在这种情况下。
以下是在一个Azure函数中使用两个队列触发器在两个不同的存储队列上侦听的结果。这是两个队列触发器的图例:
两个队列触发器均在2
设置为2的情况下同时运行
两个队列触发器在functionAppScaleLimit
设置为1的情况下同时运行
在两个队列触发器同时运行且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每个函数应用使用一个队列触发器,并使用2
和batchSize
设置。如果您使用多个队列触发器,则会遇到比赛条件和等待,这可能导致超时。
解决方法
是的,您只需要将functionAppScaleLimit
设置为2
。但是您需要了解一些有关消费计划的机制。我将batchSize
设置为1
,并将functionAppScaleLimit
设置为2
(我在{功能应用程序的应用程序设置”(而非设置WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT
,它们是相同的)。我用下面的代码进行测试:
2
然后将消息添加到队列中,我发送了10条消息:functionAppScaleLimit
,import 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'))
,111
,222
,333
,{{1} },444
,555
,666
,777
,我一一发送。该功能已成功触发,几分钟后,我们可以在“ 监视器”中看到日志。点击“ 显示器”中的其中一个日志,我们可以看到日志显示为:
我在上方屏幕截图的右侧使用了四个红色框,分别将四个日志分别命名为“ s1 ”,“ s2 ”,“ s3 ”,“ s4 ”(步骤1-4)。并总结excel中的日志,以供您参考:
我将单元格从“ 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
是:如果您希望同时启用两个实例,我们将无法确定。如果您只希望两个实例处理消息,则答案是肯定的。