仅当 blob 完全提交时才发生 BlobCreated 事件

BlobCreated event only when a blob is completely commited

我想通过 Arm 部署创建一个 EventGrid,以便在添加容器中的所有 blob 后摄取到 ADX 集群。 (它是每隔一定时间间隔创建的一堆斑点)

我想确保只有在创建 blob 并且其内容已完成写入时才会引发事件。 (不仅仅是“blob 创建的文件”)。

存储是 Data Lake Storage V2,这意味着它具有“分层命名空间”

我正在看这个link:

https://docs.microsoft.com/en-us/azure/event-grid/event-schema-blob-storage?tabs=event-grid-event-schema

我很困惑: Blob REST API 事件列表部分和Azure Data Lake Storage Gen 2 REST API 事件列表部分。

哪一个与我相关,我可以实现我的目标还是有什么方法可以绕过它来实现我的目标?

我见过各种规避此问题的方法,有些好,有些不好。只取决于什么适合你。

  1. 您可以在首次触发 BlobEvent 触发器时等待一段指定的时间。如果您有一些小文件,您知道它永远不会超过 2 或 3 分钟,那么这是一个选项。如果您不知道完全加载 Blob 需要 5 分钟还是 30 分钟,那么这是一个糟糕的选择。我个人不喜欢这个选项,但它对某些人有用。

  2. 使用流或直接复制暂存 Blob,然后通过直接复制移动它们,在完全提交之前不会触发触发器。我个人喜欢这种方法,因为它允许将 Blob 移动到 Staging,然后在它们上设置元数据,然后在它们上执行 Blob Copy 命令以复制包含的元数据。 (仅供参考,ADF 具有在副本中设置元数据的功能 activity,但同样的原则可以应用于 Azure Functions、Powershell、C#,无论代码将 blob 放在那里。)

  1. 理论上,您可以在 ADF 中使用 UNTIL activity 来检查传入 Blob 的状态,一旦它不再增长,具有特定状态,可能是特定的上次修改(类似这些)然后你可以继续你的管道。我没有测试过这种方法,但我希望可以持续获取文件的元数据并使用它来确定管道是否准备好继续。

我已经进行了测试,看看数据是否真的没有从存储类型中提取到集群中,并且确实没有提取数据。 这是来自 ADF 的副本 activity。 我假设是因为该事件只是 blob 创建的触发器。 我可能会使用 ADF。