Azure Functions functionAppScaleLimit的1不能正常工作以限制队列触发器上的并发

问题描述

我有一个具有多个队列触发器的功能应用程序,并且正在尝试通过将functionAppScaleLimit设置为1来限制并发性。经过测试之后,我超时了,因为两个队列触发器将在大约同一时间执行,但是只有一个触发器可以工作,而另一个等待。

例如,我有两个队列触发器:QueueTrigger1QueueTrigger2,当在Azure存储的两个单独位置创建blob时执行。我只希望一个队列触发器能够一次运行。我已经将batchSize参数设置为1,因此一次只处理一条消息。每个队列触发器最多可能需要8分钟才能使脚本完成执行。如果两个触发器大约在同一时间执行,则一个将完成,另一个将超时,然后成功完成后重试。

这是来自QueueTrigger1的示例日志:
2020-10-26 07:37:49.201 Executing 'Functions.QueueTrigger1' (Reason='New queue message detected on 'etl-queue-items-1'.',Id=<queue-trigger-1-id>)
//processes work in Python
2020-10-26 07:45:49.472 Executed 'Functions.QueueTrigger1' (Succeeded,Id=<queue-trigger-1-id>,Duration=480291ms)

还有QueueTrigger2
2020-10-26 07:37:56.922 Executing 'Functions.QueueTrigger2' (Reason='New queue message detected on 'etl-queue-items-2'.',Id=<queue-trigger-2-id>)
//8 minutes later
2020-10-26 07:45:49.439 Python queue trigger function processed a queue item:
//attempts to process work in Python
2020-10-26 07:47:56.927 Timeout value of 00:10:00 exceeded by function 'Functions.QueueTrigger2' (Id: '<queue-trigger-2-id>'). Initiating cancellation.
2020-10-26 07:47:56.987 Executed '{functionName}' ({status},Id={invocationId},Duration={executionDuration}ms)
2020-10-26 07:47:56.987 Executed 'Functions.QueueTrigger2' (Failed,Id=<queue-trigger-2-id><queue-trigger-2-id>,Duration=600043ms)

QueueTrigger2上开始执行任何工作之前,将10分钟的限制限制了,这似乎是不公平的。如何确保每个队列触发器独立运行,以确保不会超过1.5GB的内存限制并且不必依赖重试?

编辑:我正在使用Linux消费计划,因此我的functionTimeout仅限于10分钟。

解决方法

您已经将functionAppScaleLimit设置为1,您应该做的另一件事是在 host.json 文件中将batch size设置为1根据此document

如果要最小化队列触发的并行执行 在功能应用程序中,您可以将批量大小设置为1。 设置仅在功能应用程序运行时才消除并发性 在单个虚拟机(VM)上。

相关问答

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