较低带宽中的Azure存储数据移动

问题描述

以50kbps的带宽上载多个文件(100Mb,200Mb,300Mb)。 30分钟后引发错误,所有文件均失败。

代码

            TransferManager.Configurations.BlockSize = 4 * 1024 * 1024; //4MB

            CloudBlockBlob blockBlob = new CloudBlockBlob(new Uri(destSasUrl));

            ServicePointManager.Expect100Continue = false;

            SingleTransferContext context = new SingleTransferContext();

            context.SetAttributesCallbackAsync = async (src,dest) =>
            {
                CloudBlob destBlob = dest as CloudBlob;
                destBlob.Properties.ContentType = MimeMapping.MimeUtility.GetMimeMapping(Path.GetFileName(sourcePath));

            };

            TransferManager.Configurations.ParallelOperations = 2;

            // Start the upload
            Task task = TransferManager.UploadAsync(sourcePath,blockBlob,null,context);
            await task;

例外:

at Microsoft.Azure.Storage.DataMovement.TransferScheduler.ExecuteJobInternalAsync(TransferJob job,CancellationToken cancellationToken) in D:\repo\DM\azure-storage-net-data-movement\lib\TransferScheduler.cs:line 239
   at Microsoft.Azure.Storage.DataMovement.SingleObjectTransfer.ExecuteAsync(TransferScheduler scheduler,CancellationToken cancellationToken) in D:\repo\DM\azure-storage-net-data-movement\lib\TransferJobs\SingleObjectTransfer.cs:line 223
   at Microsoft.Azure.Storage.DataMovement.TransferManager.DoTransfer(Transfer transfer,TransferContext transferContext,CancellationToken cancellationToken) in D:\repo\DM\azure-storage-net-data-movement\lib\TransferManager.cs:line 1777
   at Microsoft.Azure.Storage.DataMovement.TransferScheduler.ExecuteJobInternalAsync(TransferJob job,CancellationToken cancellationToken) in D:\repo\DM\azure-storage-net-data-movement\lib\TransferManager.cs:line 1777

错误:“传输失败”。

存储Blob: 12.4.4

在更快的带宽中,效果很好。

解决方法

如果发生错误,则可以设置检查点。然后从检查点再次上传。

例如:

        TransferCheckpoint checkpoint = null;
        SingleTransferContext context = new SingleTransferContext();

        try
        {
            // Upload a local blob
            var task = TransferManager.UploadAsync(
                sourcePath,destBlob,null,context,CancellationToken.None);
            task.Wait();
        }
        catch
        {
            // Store the transfer checkpoint
            checkpoint = context.LastCheckpoint;

            // Create a new TransferContext with the store checkpoint
            SingleTransferContext resumeContext = new SingleTransferContext(checkpoint);
            // Upload from the checkpoint
            var task = TransferManager.UploadAsync(
                sourcePath,resumeContext,CancellationToken.None);
            task.Wait();
        }

如果您认为错误不会发生一次,那么您也可以循环修改代码。

您知道根本原因是带宽不足,最好的解决方案应该对此进行改进。团队也正在考虑add bandwdith as a parameter