【问题标题】:EventGrid-triggered, Python Azure Function keeps triggering after successfully running?EventGrid触发,Python Azure Function运行成功后一直触发?
【发布时间】:2021-02-16 12:38:58
【问题描述】:

还有其他几个主题,但没有一个提供解决方案或没有与 Python 函数有关。

背景:

  • EventGrid 触发,Python Azure 函数
  • 在将 blob 上传到给定存储帐户时创建 EventGrid 消息
  • 函数接收消息,从消息 URL 下载 blob 并执行“stuff”
  • 函数可以运行几秒/分钟(对于大型 blob,最长可达 120 秒)

问题示例:

  • 4 个文件上传到正确存储帐户中的 blob 容器
  • 函数成功触发了 4 次,由 4 条单独的 EventGrid 消息触发
  • 函数从每条消息中的 URL 下载 blob,执行“stuff”
  • ~55 秒后,又有 4 条 EventGrid 消息再次触发函数(对于相同的 4 个文件!)
  • 一切都在重复

这种情况多次发生,导致 4 个文件执行 12 次函数:

  • 以及相应的输出来自函数所做的“东西”!

当 2500 个文件上传到存储帐户时变得可笑!

似乎我需要调整 EventGrid 重试时间。但我在门户中没有看到此设置:

如何防止这种行为?

编辑 1: 那么今天...上传了 16 个文件没有问题...为什么 EventGrid 会不一致地触发此函数?

编辑 2: 今天又一次......无缘无故,〜一个小时后...... EventGrid 触发了更多触发器,尽管没有更多文件已上传到存储帐户。

以下是上传到存储帐户的 16 个文件的 EventGrid 统计信息。

  • 您可以清楚地看到数字无处不在,在某些情况下,重试间隔约为 1 小时。
  • 在我看来很随意

编辑 3: 任何有兴趣的人...

【问题讨论】:

    标签: python triggers azure-functions azure-eventgrid retry-logic


    【解决方案1】:

    根据doc,订阅者(例如您的 EventGridTrigger 函数)需要在 30 秒内将响应发送回 AEG,否则消息将排队等待重试。

    请注意,当 AEG 在 3 分钟内收到来自传递目标端点(订阅者)的成功响应时,该事件将从重试队列中删除。如果启用了死信功能,当响应失败代码为 400 或 413 时,事件也会从重试队列中删除。

    根据上述情况和您的长期订阅者,AEG 在 3 分钟内发送了重复事件。

    我确实建议在您的解决方案中使用 Push-Pull 模式,例如将事件传递到存储队列。

    【讨论】:

    • “推拉”模式是什么意思?你能给我举个例子吗?
    • 在上面的日志中注意......在这种情况下,函数的运行时间从 ~1 秒到 4.5 秒。这正好在 30 秒的重试窗口内。
    • 那么今天,每个函数的运行时间约为 1 - 3.5 秒。这次没有重试发生? EventGrid 是否是运行时间少于 30 秒的 Azure Functions 的生产就绪触发器?
    • 松散分离的 Pub/Sub 模型中的传递 Push-Pull 模式允许将事件传递(存储)到资源实体(例如存储队列、事件中心、服务总线等)实时而不是根据需要拉起它们。请注意,AEG 需要根据交付和重试策略从交付过程接收响应(ACK/NACK)。还有一点需要注意的是,在 Push-Push 模式(例如 EventGridTrigger)中,响应时间也取决于函数“冷启动”
    • 出于测试目的:使用 "maxDeliveryAttempts":1,"eventTimeToLiveInMinutes":30 打开死信功能,以了解有关 lastDeliveryOutcome 的详细信息
    猜你喜欢
    • 2018-10-26
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    • 2018-11-17
    • 2021-12-22
    相关资源
    最近更新 更多