Перемещение данных хранилища Azure с меньшей пропускной способностью

#c# #azure #azure-blob-storage #blobstorage

#c# #azure #azure-blob-хранилище #blobstorage

Вопрос:

Загрузка нескольких файлов (100 МБ, 200 МБ, 300 МБ) с пропускной способностью 50 Кбит / с. Ошибка была выдана через 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:repoDMazure-storage-net-data-movementlibTransferScheduler.cs:line 239
   at Microsoft.Azure.Storage.DataMovement.SingleObjectTransfer.ExecuteAsync(TransferScheduler scheduler, CancellationToken cancellationToken) in D:repoDMazure-storage-net-data-movementlibTransferJobsSingleObjectTransfer.cs:line 223
   at Microsoft.Azure.Storage.DataMovement.TransferManager.DoTransfer(Transfer transfer, TransferContext transferContext, CancellationToken cancellationToken) in D:repoDMazure-storage-net-data-movementlibTransferManager.cs:line 1777
   at Microsoft.Azure.Storage.DataMovement.TransferScheduler.ExecuteJobInternalAsync(TransferJob job, CancellationToken cancellationToken) in D:repoDMazure-storage-net-data-movementlibTransferScheduler.cs:line 239
   at Microsoft.Azure.Storage.DataMovement.SingleObjectTransfer.ExecuteAsync(TransferScheduler scheduler, CancellationToken cancellationToken) in D:repoDMazure-storage-net-data-movementlibTransferJobsSingleObjectTransfer.cs:line 223
   at Microsoft.Azure.Storage.DataMovement.TransferManager.DoTransfer(Transfer transfer, TransferContext transferContext, CancellationToken cancellationToken) in D:repoDMazure-storage-net-data-movementlibTransferManager.cs:line 1777
   at Microsoft.Azure.Storage.DataMovement.TransferScheduler.ExecuteJobInternalAsync(TransferJob job, CancellationToken cancellationToken) in D:repoDMazure-storage-net-data-movementlibTransferScheduler.cs:line 239
   at Microsoft.Azure.Storage.DataMovement.SingleObjectTransfer.ExecuteAsync(TransferScheduler scheduler, CancellationToken cancellationToken) in D:repoDMazure-storage-net-data-movementlibTransferJobsSingleObjectTransfer.cs:line 223
   at Microsoft.Azure.Storage.DataMovement.TransferManager.DoTransfer(Transfer transfer, TransferContext transferContext, CancellationToken cancellationToken) in D:repoDMazure-storage-net-data-movementlibTransferManager.cs:line 1777
  

Ошибка: «Передача не удалась».

Большой двоичный объект хранилища: 12.4.4

При более высокой пропускной способности это работает хорошо.

Комментарии:

1. Вы можете попытаться сохранить checkpoint сообщение об ошибке when, а затем повторить попытку загрузки с контрольной точки. Взгляните на этот пример .

2. @IvanYang Как вы хотите, чтобы я написал это после возникновения исключения? можете ли вы опубликовать это как ответ??

3. да, запишите это после исключения. Я опубликую это позже.

Ответ №1:

Вы можете установить контрольную точку в случае возникновения ошибки. Затем повторите загрузку с контрольной точки.

Например:

         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, destBlob, null, resumeContext, CancellationToken.None);
            task.Wait();
        }
  

Вы также можете изменить код в цикле, если считаете, что ошибка возникает не только один раз.

И вы знаете, что основная причина связана с низкой пропускной способностью, лучшее решение должно улучшить ее. Команда также рассматривает возможность добавления bandwdith в качестве параметра.

Комментарии:

1. Кажется, я получаю исключение внутри части исключения.