【发布时间】:2020-03-02 17:21:46
【问题描述】:
我有一个 Azure 函数,它从 blob 容器中提取名称和文件 URL,然后将此信息发送到另一个函数以处理这些文件(解压缩并将它们保存在 Datalake 中)
对于 blob 的提取:
string storageConnectionString = @"myconnstring";
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(storageConnectionString);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference("Container");
IEnumerable<IListBlobItem> blobs = new IListBlobItem[0];
foreach (IListBlobItem blobItem in container.ListBlobs())
{
if (blobItem is CloudBlobDirectory)
{
CloudBlobDirectory directory = (CloudBlobDirectory)blobItem;
blobs = directory.ListBlobs(true);
}
}
await ProcessBlobs(blobs);
以及处理螺栓的功能:
public static async Task ProcessBlobs(IEnumerable<IListBlobItem> blobs)
{
var tasks = blobs.Select(currentblob =>
{
string FileUrl = currentblob.Uri.ToString();
string FileName = currentblob.Uri.Segments.Last();
//string content = "{ \"fileUri\": \""+ currentblob.Uri.ToString()+ "\" , \"fileName\": \""+ currentblob.Uri.Segments.Last()+"\"}";
var values = new Dictionary<string, string>
{
{ "fileUri", currentblob.Uri.ToString() },
{ "fileName", currentblob.Uri.Segments.Last() }
};
var content = new FormUrlEncodedContent(values);
string baseURL = @"https://<afu>.azurewebsites.net/api/process_zip_files_by_http_trigger?code=45"; ;
//string urlToInvoke = string.Format("{0}&name={1}", baseURL, FileUrl, FileName);
return RunAsync(baseURL, content);
});
await Task.WhenAll(tasks);
}
public static async Task RunAsync(string i_URL, FormUrlEncodedContent content)
{
var response = await client.PostAsync(i_URL, content);
var responseString = await response.Content.ReadAsStringAsync();
log.info(responseString);
}
函数RunAsync异步处理文件。
我现在的问题是: 通常是否可以并行处理 blob,但以同步方式?你有更好更简单的想法来实现我的目标吗?
【问题讨论】:
-
为什么要同步进行?只是好奇,它可以帮助人们给出更准确的答案。
-
确保每个文件都得到处理
-
同步运行您的流程并不能确保您的文件已全部处理完毕。这也适用于异步。您应该处理异常并在需要时重试,以确保您的文件已得到处理并添加一些日志记录。
-
我是否以正确的方式从另一个 azure 函数异步调用 azure 函数?
-
可能总是有多种方法,但是您需要详细说明您要达到的目标才能获得正确的方法之一
标签: c# azure http azure-functions