【问题标题】:Identify modified blobs from storage account changefeed从存储帐户更改源中识别已修改的 Blob
【发布时间】:2021-12-29 05:11:18
【问题描述】:

我目前正在使用 Azure 存储帐户上的 changefeed,并希望区分创建(上传)的 blob 和刚刚修改的 blob。

在下面的示例中,我上传了一个 blob (agent-diag.txt),然后编辑该文件(添加一些文本)。

在这两种情况下,它都会引发“BlobCreated”,似乎没有“BlobUpdated”的概念。

来自 MS Doc:更改提要记录中捕获了以下事件类型:

Blob 已创建 已删除 Blob BlobPropertiesUpdated 已创建 BlobSnapshot

如果元数据或标签等发生更改,则会记录 BlobPropertiesUpdated。但如果文件被修改,我看不到任何识别方法。有什么想法吗?

操作名称:PutBlob Api:Azure.Storage.Blobs.ChangeFeed.BlobChangeFeedEventData 主题:/blobServices/default/containers/myblobs/blob/agent-diag.txt 事件类型:BlobCreated 活动时间:17/11/2021 23:25:42 +00:00

操作名称:PutBlob Api:Azure.Storage.Blobs.ChangeFeed.BlobChangeFeedEventData 主题:/blobServices/default/containers/myblobs/blob/agent-diag.txt 事件类型:BlobCreated 活动时间:17/11/2021 23:26:07 +00:00

using Azure.Storage.Blobs;
using Azure.Storage.Blobs.ChangeFeed;



namespace Changefeed
{
    class Program
    {
        const string conString = "DefaultEndpointsProtocol=BlahBlah";

        public static async Task<List<BlobChangeFeedEvent>> ChangeFeedAsync(string connectionString)
        {
            // Get a new blob service client.
            BlobServiceClient blobServiceClient = new BlobServiceClient(connectionString);

            // Get a new change feed client.
            BlobChangeFeedClient changeFeedClient = blobServiceClient.GetChangeFeedClient();

            List<BlobChangeFeedEvent> changeFeedEvents = new List<BlobChangeFeedEvent>();

            // Get all the events in the change feed. 
            await foreach (BlobChangeFeedEvent changeFeedEvent in changeFeedClient.GetChangesAsync())
            {
                changeFeedEvents.Add(changeFeedEvent);
            }

            return changeFeedEvents;
        }



        public static void showEventData(List<BlobChangeFeedEvent> changeFeedEvents)
        {
            foreach (BlobChangeFeedEvent changeFeedEvent in changeFeedEvents)
            {
                string subject = changeFeedEvent.Subject;
                string eventType = changeFeedEvent.EventType.ToString();
                string eventTime = changeFeedEvent.EventTime.ToString();

                string api = changeFeedEvent.EventData.ToString();
                string operation = changeFeedEvent.EventData.BlobOperationName.ToString();


                Console.WriteLine("Subject: " + subject + "\n" +
                "Event Type: " + eventType + "\n" +
                "Event Time: " + eventTime + "\n" +
                "Operation Name: " + operation + "\n" +
                "Api: " + api);
            }
        }


        public static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            List<BlobChangeFeedEvent> feedlist =  ChangeFeedAsync(conString).GetAwaiter().GetResult();

            Console.WriteLine("Feedlist :" + feedlist.Count());

            showEventData(feedlist);
        }
    }
}






【问题讨论】:

标签: azure .net-core azure-blob-storage


【解决方案1】:

每个 blob 都有 2 个系统定义的属性 - 创建日期和上次修改日期,分别告诉您创建 blob 的时间和上次修改的时间。

创建 blob 时,这两个属性将具有相同的值。然而,当相同的 blob 被覆盖(即内容更新)时,只有最后修改的值被更改。

您可以做的是使用这些属性来确定是创建了新 blob 还是更新了现有 blob 的内容。

您仍然可以使用BlobCreated 事件。您需要做的另一个步骤是获取 blob 的属性并比较这两个属性以进行区分。

【讨论】:

  • 谢谢,尝试了一些类似的方法,但在尝试根据日期对事件进行逆向工程时变得混乱。我想我很惊讶没有具有版本 ID 等的 BlobUpdated 事件
猜你喜欢
  • 1970-01-01
  • 2021-06-10
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-01
  • 2021-11-15
相关资源
最近更新 更多