问题描述
我有一个具有多个队列触发器的功能应用程序,并且正在尝试通过将functionAppScaleLimit
设置为1
来限制并发性。经过测试之后,我超时了,因为两个队列触发器将在大约同一时间执行,但是只有一个触发器可以工作,而另一个等待。
例如,我有两个队列触发器:QueueTrigger1
和QueueTrigger2
,当在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)上。