Azure Blob 存储 - 如何在查询前考虑 blob 上传时间延迟?
Azure Blob Storage - How to factor in a blob upload time delay before querying?
在我的项目中,将项目上传到存储是一个两步过程。
第 1 步 - 我将 blob 上传到 Azure 存储。
第 2 步 - 然后 运行 查询 blob 索引标签并检索 blob 列表(包括我刚刚在第 1 步中上传的那个)
我这样做是因为我正在创建一个文件夹目录系统,用户可以借此创建自己的文件夹和子文件夹,并且 blob 将被引用到该文件夹结构。本质上是一种创建与 Windows 文件资源管理器类似的外观和感觉的方式,用于组织上传。
我不得不考虑步骤 1 和步骤 2 之间的几秒钟的短暂延迟,否则如果我尝试在上传完成后立即查询存储,则不会返回新添加的 blob .
我不确定如何最好地解决这个问题,因为在我的代码中的两个步骤之间添加静态延迟似乎是一种危险的方法,以防在某些情况下延迟不够长。
方法一:
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 中使用异步编程完成,然后我在步骤 2 中尝试通过索引标签查询来获取相同的 blob(和其他 blob),我有点困惑。
这两个方法位于我的 API 控制器微服务中,但实际的上传请求是使用 javascript 中的 ajax 从我的前端应用程序驱动的。值得注意的是,在第 1 步的 API 结果在 ajax 中完成之前,我不会尝试 运行 方法 2,因此我不相信这个问题会进一步回到我的项目中。
我正在寻找的似乎是某种等待的 blob 上传完成事件,例如 'Blob has uploaded and is ready to be queried'
我的猜测是,通过 SDK 完成 blob 的上传实际上并不意味着它已准备好通过查询立即查找和检索,因为 Azure 可能仍在后台处理上传...
您看到的行为与 SDK 无关。相反,它是 Azure 存储的限制(从某种意义上说)。每当在 blob 上设置标签时,它们都会立即保留,但是会有一些延迟,在此之前您可以使用标签搜索 blob。
从这个link
:
The indexing engine exposes your key-value attributes into a
multi-dimensional index. After you set your index tags, they exist on
the blob and can be retrieved immediately. It may take some time
before the blob index updates. After the blob index updates, you can
use the native query and discovery capabilities offered by Blob
Storage.
我找不到任何关于更新 blob 索引需要多长时间的文档,以便您可以按标签搜索 blob。
旁注:
我注意到您首先上传 blob,然后发送单独的请求来更新标签和元数据。你真的不必那样做。您只需在上传方法中设置标签和元数据即可。请参阅 BlobUploadOptions
了解更多详情。
在我的项目中,将项目上传到存储是一个两步过程。
第 1 步 - 我将 blob 上传到 Azure 存储。
第 2 步 - 然后 运行 查询 blob 索引标签并检索 blob 列表(包括我刚刚在第 1 步中上传的那个)
我这样做是因为我正在创建一个文件夹目录系统,用户可以借此创建自己的文件夹和子文件夹,并且 blob 将被引用到该文件夹结构。本质上是一种创建与 Windows 文件资源管理器类似的外观和感觉的方式,用于组织上传。
我不得不考虑步骤 1 和步骤 2 之间的几秒钟的短暂延迟,否则如果我尝试在上传完成后立即查询存储,则不会返回新添加的 blob .
我不确定如何最好地解决这个问题,因为在我的代码中的两个步骤之间添加静态延迟似乎是一种危险的方法,以防在某些情况下延迟不够长。
方法一:
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 中使用异步编程完成,然后我在步骤 2 中尝试通过索引标签查询来获取相同的 blob(和其他 blob),我有点困惑。
这两个方法位于我的 API 控制器微服务中,但实际的上传请求是使用 javascript 中的 ajax 从我的前端应用程序驱动的。值得注意的是,在第 1 步的 API 结果在 ajax 中完成之前,我不会尝试 运行 方法 2,因此我不相信这个问题会进一步回到我的项目中。
我正在寻找的似乎是某种等待的 blob 上传完成事件,例如 'Blob has uploaded and is ready to be queried'
我的猜测是,通过 SDK 完成 blob 的上传实际上并不意味着它已准备好通过查询立即查找和检索,因为 Azure 可能仍在后台处理上传...
您看到的行为与 SDK 无关。相反,它是 Azure 存储的限制(从某种意义上说)。每当在 blob 上设置标签时,它们都会立即保留,但是会有一些延迟,在此之前您可以使用标签搜索 blob。
从这个link
:
The indexing engine exposes your key-value attributes into a multi-dimensional index. After you set your index tags, they exist on the blob and can be retrieved immediately. It may take some time before the blob index updates. After the blob index updates, you can use the native query and discovery capabilities offered by Blob Storage.
我找不到任何关于更新 blob 索引需要多长时间的文档,以便您可以按标签搜索 blob。
旁注:
我注意到您首先上传 blob,然后发送单独的请求来更新标签和元数据。你真的不必那样做。您只需在上传方法中设置标签和元数据即可。请参阅 BlobUploadOptions
了解更多详情。