【问题标题】:Azure Blob Storage - How to factor in a blob upload time delay before querying?Azure Blob 存储 - 如何在查询之前考虑 Blob 上传时间延迟?
【发布时间】:2021-12-31 15:21:14
【问题描述】:

在我的项目中,将项目上传到存储是一个两步过程。

第 1 步 - 我将 blob 上传到 Azure 存储。

第 2 步 - 然后我对 blob 索引标签运行查询并检索 blob 列表(包括我刚刚在第 1 步中上传的那个)

我这样做是因为我正在创建一个文件夹目录系统,用户可以在其中创建自己的文件夹和子文件夹,并且 blob 将被引用到这个文件夹结构。本质上是一种创建与 Windows 文件资源管理器相似的外观和感觉来组织上传的方法。

我必须在步骤 1 和 2 之间考虑几秒钟的短暂延迟,否则如果我尝试在上传完成后立即查询存储,则不会返回新添加的 blob。

我不确定如何最好地解决这个问题,因为在我的代码中的两个步骤之间添加静态延迟似乎是一种危险的方法,以防在某些情况下延迟不够长。

第1步方法:

public async Task UploadContentAsync(UploadContentRequest request)
{
    try
    {
        // Get the BlobContainerClient & Container
        var container = _blobServiceClient.GetBlobContainerClient(request.ContainerName);

        // Create a container if not exist.
        await container.CreateIfNotExistsAsync();

        var blobClient = container.GetBlobClient(request.FileName);
        var bytes = Encoding.UTF8.GetBytes(request.Content);
        await using var memoryStream = new MemoryStream(bytes);
        await blobClient.UploadAsync(memoryStream, new BlobHttpHeaders { ContentType = request.FileName.GetContentType() });

        if (request.BlobIndexTags != null)
        {
            // Set or update blob index tags on existing blob
            Dictionary<string, string> tags = new()
            {
                { "parentFolder", request.BlobIndexTags.ParentFolder }
            };
            await blobClient.SetTagsAsync(tags);
        }
        if (request.BlobMetadata != null)
        {
            IDictionary<string, string> metadata = new Dictionary<string, string>
            {
                // Add metadata to the dictionary by calling the Add method
                { "description", request.BlobMetadata.Description }
            };

            // Set the blob's metadata.
            await blobClient.SetMetadataAsync(metadata);
        }
        
    }
    catch (RequestFailedException ex)
    {
        LogExtension logExtension = new(_config);

        string logData = "AzureBlobStorage-API encountered an exception when uploading content with name [" + request.FileName + "]";
        logExtension.WriteLogEvent<BlobService>("Error", "Blob Storage", "Upload Content", request.FileName, logData, ex);
        throw;
    }
}

在上述方法中,我先上传内容(在我的情况下是一个短字符串),然后添加一些索引标签,最后设置一些元数据。

第2步方法:

public async Task<List<TaggedBlobItem>> GetBlobsWithQueryAsync(string query)
{
    try
    {
        var blobs = new List<TaggedBlobItem>();
        await foreach (TaggedBlobItem taggedBlobItem in _blobServiceClient.FindBlobsByTagsAsync(query))
        {
            blobs.Add(taggedBlobItem);
        }

        return blobs;
    }
    catch (RequestFailedException ex)
    {
        LogExtension logExtension = new(_config);

        string logData = "AzureBlobStorage-API encountered an exception when fetching blobs with query [" + query + "]";
        logExtension.WriteLogEvent<BlobService>("Error", "Blob Storage", "Get Blobs with Query", query, logData, ex);
        throw;
    }
}

上述方法在第一种方法完成后直接运行。如果我在它们之间添加一个短暂的延迟(当前设置为 2 秒),这两个步骤运行得非常好。

我的问题不是具体的代码,而是更多关于尝试了解在使用 SDK 上传 blob 时是否通常会出现延迟。考虑到我正在等待第 1 步中使用异步 propgramming 完成上传,然后尝试通过第 2 步中的索引标签查询来获取相同的 blob(和其他 blob),我有点困惑。

这两个方法位于我的 API 控制器微服务中,但上传的实际请求是从我的前端应用程序使用 javascript 中的 ajax 驱动的。值得注意的是,在步骤 1 的 API 结果在 ajax 中完成之前,我不会尝试运行方法 2,因此我不相信这个问题会在我的项目中进一步出现。

看来我正在寻找某种等待的 Blob 上传完成事件,例如“Blob 已上传并准备好被查询”

我的猜测是,通过 SDK 完成 blob 的上传实际上并不意味着它已准备好通过查询立即查找和检索,因为 Azure 可能仍在后台处理上传...

【问题讨论】:

    标签: c# azure-blob-storage


    【解决方案1】:

    您看到的行为与 SDK 无关。相反,它是 Azure 存储的一个限制(从某种意义上说)。每当在 blob 上设置标签时,它们都会立即持久化,但是在此之前您可以使用标签搜索 blob。

    来自link

    索引引擎将您的键值属性公开到一个 多维索引。设置索引标签后,它们存在于 blob 并且可以立即检索。 可能需要一些时间 在 blob 索引更新之前。在 blob 索引更新后,您可以 使用 Blob 提供的本机查询和发现功能 存储。

    我找不到任何有关更新 blob 索引需要多长时间以便您可以按标签搜索 blob 的文档。

    旁注:

    我注意到您首先上传 blob,然后发送单独的请求以更新标签和元数据。您实际上不必这样做。您只需在上传方法中设置标签和元数据即可。详情请见BlobUploadOptions

    【讨论】:

    • 非常感谢您的回复,这些信息至少可以帮助我评估是否要改变我的策略来解决这个问题。此外,按照您的建议以相同的方法组合请求将非常有用,有点想 Azure 可能会开始在交易命中/成本方面鼓掌,否则哈哈。再次感谢
    猜你喜欢
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 2019-04-06
    • 2014-08-23
    • 1970-01-01
    • 2014-02-15
    • 2017-04-27
    相关资源
    最近更新 更多