如何确保一次只允许一个Azure Functions事件网格触发器实例运行?

问题描述

我在Linux消费计划上有几个使用Python的事件网格触发器,它们在Azure存储中创建新的Blob时执行。如果在同一时间或大约同一时间创建blob,则可能有多个函数实例同时运行。例如,我有两个事件触发器,用于查找以以下格式创建的Blob:
触发器1

  "subjectBeginsWith": "/blobServices/default/containers/client1","subjectEndsWith": ".txt"

触发2

  "subjectBeginsWith": "/blobServices/default/containers/client2","subjectEndsWith": ".txt"

如果同时创建两个Blob,我希望限制Azure Functions一次仅运行一个应用程序(与哪个应用程序无关),以防止出现内存问题。这种情况很少见,因此我正在考虑使用预览设置WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT一次仅允许一次调用运行。这项工作还是有更好的方法?

我还有一个问题,每个客户可能在大约同一时间创建多个Blob,而我只关心每天是否处理一个Blob。例如,客户端1一天可以创建以下文件:

client1/file1_20201024.txt
client1/file2_20201024.txt
client1/file3_20201024.txt

我只关心是否每天创建一个文件。我可以在代码中创建特殊的异常处理,以查看工作是否完成,然后返回Python脚本,但我想知道事件网格中是否有内置设置来处理此类情况。也就是说,如果在一分钟内创建了三个Blob,则只能创建一个事件,而不是三个。

解决方法

问题1: 您应该使用存储队列事件处理程序(而不是azure函数)将事件推送到队列,然后将其上拉one at the time。请注意,在使用多个VM的情况下,您可以使用租用的Blob技术来控制多个VM的并发性,请参见here的更多详细信息。

问题2: Azure事件网格中没有满足您所描述需求的内置功能,因此必须在订阅者逻辑中对其进行处理。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...