0

当我将文件上传到一个 blob (Blob1) 时会出现此问题,该 blob 又运行后台压缩服务。后台服务从 Blob1 流式传输文件,对其进行压缩,并将其作为 zip 文件存储在单独的 Blob (Blob2) 中以缓存供用户下载。

对于小于 2GB 的文件,该过程正常工作,但当文件大小大于 2GB 时会引发 Micrososft.Azure.Storage.StorageException。

使用 Microsoft.Azure.Storage.Blob 11.2.2

示例代码

    public async void DoWork(CancellationToken cancellationToken)
    {
    while (!cancellationToken.IsCancellationRequested)
    {
        await _messageSemaphore.WaitAsync(cancellationToken);
        MyModel model = await _queue.PeekMessage();
        if(model != null)
        {
            try
            {
                //Get CloudBlockBlob zip blob reference
                var zipBlockBlob = await _storageAccount.GetFileBlobReference(_configuration[ConfigKeys.ContainerName], model.Filename, model.FileRelativePath);

                using (var zipStream = zipBlockBlob.OpenWrite()) //Opens zipstream
                {
                    using (var archive = new ZipArchive(zipStream, ZipArchiveMode.Create, false)) // Create new ZipArchive
                    {
                        //Add each file to the zip archive
                        foreach (var fileUri in Files)
                        {
                            var file = new Uri(fileUri);
                            var cloudBlockBlob = blobContainer.GetBlockBlobReference(file);

                            using (var blobStream = cloudBlockBlob.OpenRead())//Opens read stream
                            {
                                //Create new ZipEntry
                                var zipEntry = archive.CreateEntry(model.Filename, CompressionLevel.Fastest);

                                using (var zipEntryStream = zipEntry.Open())
                                {
                                    //Zip file
                                    blobStream.CopyTo(zipEntryStream);
                                }
                            }
                        }
                    }
                }
            }
            catch (FileNotFoundException e)
            {
                Console.WriteLine($"Download Error: {e.Message}");
            }
            catch (Microsoft.Azure.Storage.StorageException e) // "
            {
                Console.WriteLine($"Storage Exception Error: {e.Message}");
            }
        }
        else
        {
            _messageSemaphore.Release();
            // Wait for 1 minute between polls when idle
            await Task.Delay(_sleepTime);
        }
        
    }
}
4

1 回答 1

0

问题在于并发性和多个应用程序实例同时写入同一个 blob。为了解决这个问题,我最终在正在创建的 blob 上实现了Azure blob 租约,但必须创建一个临时文件来将租约应用于. 目前这是一个足够体面的工作,但这可以/应该使用 Azure 事件驱动服务来实现。

于 2021-08-29T22:25:35.420 回答