阅读Azure Blob异步,为什么会有2个延迟

时间:2019-06-15 12:20:12

标签: c# azure-functions azure-storage-blobs

我正在编写由存储队列消息触发的Azure函数。然后,它逐行读取blob,并将对数据进行处理。该行本身就是Json行。

我根据网络上的示例组装了代码,但给人的印象是出了点问题。我(在VS2017上开发中)遇到2个主要延迟。在OpenReadAsync和每个ReadlineAsync ...

因此,如果有人提出建议,我不是c#开发人员。

private static async Task ProcessFile(string fileName, ILogger log)
    {
        // Connect Source
        CloudStorageAccount cosmobatchStorageAccount = AzureBlobHandling.GetStorageAccount(CommonCode.GetEnvironmentVariable("ComsoBatch_Storage"));
        CloudBlobClient cosmobatchBlobClient = AzureBlobHandling.GetStorageClient(cosmobatchStorageAccount);
        CloudBlobContainer cosmobatchBlobContainer = AzureBlobHandling.GetStorageContainer(cosmobatchBlobClient, CommonCode.GetEnvironmentVariable("CosmoBatch_Container"));
        CloudBlockBlob cosmobatchBlob = cosmobatchBlobContainer.GetBlockBlobReference(fileName);

        // Connect Destination
        CloudStorageAccount singlefileStorageAccount = AzureBlobHandling.GetStorageAccount(CommonCode.GetEnvironmentVariable("SingleFile_Storage"));
        CloudBlobClient singlefileBlobClient = AzureBlobHandling.GetStorageClient(singlefileStorageAccount);
        CloudBlobContainer singlefileBlobContainer = AzureBlobHandling.GetStorageContainer(singlefileBlobClient, CommonCode.GetEnvironmentVariable("SingleFile_Container"));
        //CloudBlockBlob singlefileBlob = cosmobatchBlobContainer.GetBlockBlobReference(fileName);

        try
        {   // Read Blob
            log.LogInformation("Pass 1");
            using (Stream stream =  await cosmobatchBlob.OpenReadAsync())
            {
                log.LogInformation("Pass 2");
                using (StreamReader reader = new StreamReader(stream))
                {
                    log.LogInformation("Pass 3");
                    while (true)
                    {
                        log.LogInformation("Pass 4");
                        string line = await reader.ReadLineAsync();
                        if (line == null)
                        {
                            break;
                        }
                        Console.WriteLine(line);

                        jRecord jRec = JsonConvert.DeserializeObject<jRecord>(line);
                        log.LogInformation(String.Format("MsgNbr : {0}, FileName : {1}, FileType {2}", jRec.msgnbr, jRec.filename, jRec.msgtype));
                    }
                }
            }
        }
        catch (Exception ex)
        {
            log.LogError(String.Format("Catch: {0}", ex));
        }
        finally
        {
        }
    }

1 个答案:

答案 0 :(得分:2)

我可以想象OpenReadAsync会花一些时间

  

启动异步操作以打开要从blob读取的流。

来源:CloudBlockBlob.OpenReadAsync Method()

它为您使用Stream操纵Blob打下了基础。

ReadLineAsync

  

从当前流异步读取一行字符,并将数据作为字符串返回。

来源:StreamReader.ReadLineAsync Method

本质上是下载。因此,如果这是一条很大的线(意味着大量数据),那么可能还需要一些时间。

此外,还建议在调试模式下运行代码会降低其速度。当然,在这种情况下,由于带宽(连接速度)是本地因素,因此在本地计算机上进行这种操作要比在Azure中运行慢。

如果数字以毫秒为单位(毫秒),那么我就不用担心。否则,您可能需要查看数据的大小,以及Blob是否是此类数据的最佳存储类型。