问题描述
还有其他几个主题,但是没有一个解决方案,也没有一个与Python函数有关的主题。
背景:
- EventGrid触发的Python Azure函数 当将Blob上传到给定的存储帐户时,
- 仅创建了EventGrid消息
- 函数接收消息,从消息URL下载blob并执行“填充”
- 该功能可以运行几秒钟/分钟(大斑点时最多可以运行120秒)
问题示例:
- 使用正确的存储帐户将4个文件上传到blob容器
- 该函数通过4条独立的EventGrid消息成功触发了4次
- 函数从每封邮件中的URL下载blob,执行“填充”
- 〜55秒后,又有4条EventGrid消息再次触发该函数(对于相同的4个文件!)
- 一切重复
多次发生,导致4个文件执行12个函数:
- 以及函数执行的“工作”中相应的输出!
将2500个文件上传到存储帐户时,这太荒谬了!
似乎我需要调整EventGrid重试时间。但我在门户网站中看不到此设置:
如何防止这种行为?
编辑1:然后,今天...上传的16个文件没有问题...为什么EventGrid会不一致地触发此功能?
编辑2:今天再次……无缘无故,一个小时后……尽管没有更多文件上传到存储帐户,EventGrid触发了更多触发器。 / p>
以下是16个正在上传到存储帐户的文件的EventGrid统计信息。
- 在某些情况下,两次重试之间大约需要1个小时,您可以清楚地看到所有数字。
- 对我来说很随意
编辑3:对于任何有兴趣的人...
- 正在发生的事情是:存储帐户中的两个事件触发了EventGrid,用于 SINGLE 文件上传。
- 这将生成两个EventGrid模式(一个用于"Microsoft.Storage.BlobCreated event",一个用于"Microsoft.Storage.BlobCreated event (Data Lake Storage Gen2)"
- 由于EventGrid消息的
data.url
参数不同(xxx.blob.core.windows.net
与xxx.dfs.core.windows.net
),我的函数失败了(因为它使用BlobClient.from_blob_url
- 更多内容。
解决方法
基于doc,订阅者(例如EventGridTrigger函数)需要在 30秒之内将响应发送回AEG,否则消息将排队等待重试。 / p>
请注意,当在3分钟内成功接收到来自传递目标端点(订户)的AEG时,将从重试队列中删除该事件。如果启用了Deadlettering功能,则当响应失败代码为400或413时,也会从重试队列中删除该事件。
根据上述情况和您长期运行的订户,AEG在3分钟内发送了重复事件。
我确实建议在解决方案中使用 Push-Pull 模式,例如将事件传递到存储队列。