Bagikan melalui


Transfer data dengan pustaka Data Movement

Catatan

Artikel ini mencakup panduan untuk bekerja dengan pustaka Azure Storage Data Movement versi 2.0.XX. Versi 2.0.XX saat ini dalam mode pemeliharaan, dan pustaka hanya menerima perbaikan untuk integritas data dan masalah keamanan. Tidak ada fungsionalitas atau fitur baru yang akan ditambahkan, dan versi layanan penyimpanan baru tidak akan didukung oleh pustaka.

Versi beta dari pustaka Pergerakan Data modern saat ini sedang dalam pengembangan. Untuk informasi selengkapnya, lihat Pustaka klien Umum Pergerakan Data Azure Storage untuk .NET di GitHub.

Pustaka Azure Storage Data Movement adalah pustaka sumber terbuka lintas platform yang dirancang untuk pengunggahan, pengunduhan, dan penyalinan blob dan file berperforma tinggi. Pustaka Data Movement menyediakan metode mudah yang tidak tersedia di pustaka klien Azure Storage untuk .NET. Metode ini memungkinkan Anda untuk mengatur jumlah operasi paralel, melacak kemajuan transfer, dengan mudah melanjutkan transfer yang dibatalkan, dan banyak lagi.

Library ini juga menggunakan .NET Core, yang berarti Anda dapat menggunakannya saat membuat aplikasi .NET untuk Windows, Linux, dan macOS. Untuk mempelajari lebih lanjut tentang .NET Core, lihat dokumentasi .NET Core. Pustaka ini juga berfungsi untuk aplikasi .NET Framework tradisional untuk Windows.

Dokumen ini menunjukkan cara membuat aplikasi konsol .NET Core yang berjalan di Windows, Linux, dan macOS dan melakukan skenario berikut:

  • Unggah file dan direktori ke Blob Storage.
  • Tentukan jumlah operasi paralel saat mentransfer data.
  • Lacak kemajuan transfer data.
  • Lanjutkan transfer data yang dibatalkan.
  • Salin file dari URL ke Blob Storage.
  • Salin dari Blob Storage ke Blob Storage.

Prasyarat

Siapkan

  1. Kunjungi Panduan Instalasi .NET Core untuk menginstal .NET Core SDK. Saat memilih lingkungan Anda, pilih opsi baris perintah.
  2. Dari baris perintah, buat direktori untuk proyek Anda. Navigasi ke direktori ini, lalu ketik dotnet new console -o <sample-project-name> untuk membuat proyek konsol C#.
  3. Buka direktori ini di Visual Studio Code. Langkah ini dapat dengan cepat dilakukan melalui baris perintah dengan mengetik code . di Windows.
  4. Instal ekstensi C# dari Visual Studio Code Marketplace. Hidupkan ulang Visual Studio Code.
  5. Pada titik ini, Anda akan melihat dua perintah. Salah satunya adalah untuk menambahkan "aset yang diperlukan untuk membangun dan men-debug." Pilih "ya." Perintah lain adalah memulihkan dependensi yang belum terselesaikan. Pilih "pulihkan."
  6. Ubah launch.json di bawah .vscode untuk menggunakan terminal eksternal sebagai konsol. Pengaturan ini harus dibaca sebagai "console": "externalTerminal"
  7. Visual Studio Code memungkinkan Anda untuk memperbaiki kesalahan aplikasi .NET Core. Tekan F5 untuk menjalankan aplikasi Anda dan verifikasi bahwa penyetelan Anda berfungsi. Anda akan melihat "Halo Dunia!" dicetak pada konsol.

Tambahkan pustaka Data Movement ke proyek Anda

  1. Tambahkan versi terbaru pustaka Data Movement ke bagian dependencies file <project-name>.csproj Anda. Pada saat ditulis, versi ini adalah "Microsoft.Azure.Storage.DataMovement": "0.6.2"
  2. Perintah akan muncul untuk memulihkan proyek Anda. Pilih tombol "pulihkan". Anda juga dapat memulihkan proyek dari baris perintah dengan mengetik perintah dotnet restore di akar direktori proyek Anda.

Ubah <project-name>.csproj:

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>netcoreapp2.0</TargetFramework>
    </PropertyGroup>
    <ItemGroup>
        <PackageReference Include="Microsoft.Azure.Storage.DataMovement" Version="0.6.2" />
        </ItemGroup>
    </Project>

Menyiapkan kerangka kerja aplikasi

Hal pertama yang kami lakukan adalah menyiapkan kerangka kerja kode untuk aplikasi kami. Kode ini meminta nama akun penyimpanan dan kunci akun dan menggunakan kredensial tersebut untuk membuat CloudStorageAccount objek. Objek ini digunakan untuk berinteraksi dengan akun penyimpanan kami dalam semua skenario transfer. Kode ini juga meminta kita untuk memilih jenis operasi transfer yang ingin dieksekusi.

Ubah Program.cs:

using System;
using System.Threading;
using System.Threading.Tasks;
using System.Diagnostics;
using Microsoft.Azure.Storage;
using Microsoft.Azure.Storage.Blob;
using Microsoft.Azure.Storage.DataMovement;

namespace DMLibSample
{
    public class Program
    {
        public static void Main()
        {
            Console.WriteLine("Enter Storage account name:");
            string accountName = Console.ReadLine();

            Console.WriteLine("\nEnter Storage account key:");
            string accountKey = Console.ReadLine();

            string storageConnectionString = "DefaultEndpointsProtocol=https;AccountName=" + accountName + ";AccountKey=" + accountKey;
            CloudStorageAccount account = CloudStorageAccount.Parse(storageConnectionString);

            ExecuteChoice(account);
        }

        public static void ExecuteChoice(CloudStorageAccount account)
        {
            Console.WriteLine("\nWhat type of transfer would you like to execute?\n1. Local file --> Azure Blob\n2. Local directory --> Azure Blob directory\n3. URL (e.g. Amazon S3 file) --> Azure Blob\n4. Azure Blob --> Azure Blob");
            int choice = int.Parse(Console.ReadLine());

            if(choice == 1)
            {
                TransferLocalFileToAzureBlob(account).Wait();
            }
            else if(choice == 2)
            {
                TransferLocalDirectoryToAzureBlobDirectory(account).Wait();
            }
            else if(choice == 3)
            {
                TransferUrlToAzureBlob(account).Wait();
            }
            else if(choice == 4)
            {
                TransferAzureBlobToAzureBlob(account).Wait();
            }
        }

        public static async Task TransferLocalFileToAzureBlob(CloudStorageAccount account)
        {

        }

        public static async Task TransferLocalDirectoryToAzureBlobDirectory(CloudStorageAccount account)
        {

        }

        public static async Task TransferUrlToAzureBlob(CloudStorageAccount account)
        {

        }

        public static async Task TransferAzureBlobToAzureBlob(CloudStorageAccount account)
        {

        }
    }
}

Penting

Contoh kode ini menggunakan string koneksi untuk mengotorisasi akses ke akun penyimpanan Anda. Konfigurasi ini misalnya. String koneksi dan kunci akses akun harus digunakan dengan hati-hati dalam kode aplikasi. Jika kunci akses akun Anda hilang atau tidak sengaja ditempatkan di lokasi yang tidak aman, layanan Anda mungkin menjadi rentan. Siapa pun yang memiliki kunci akses dapat mengotorisasi permintaan terhadap akun penyimpanan, dan secara efektif memiliki akses ke semua data.

Unggah file lokal ke blob

Tambahkan metode GetSourcePath dan GetBlob ke Program.cs:

public static string GetSourcePath()
{
    Console.WriteLine("\nProvide path for source:");
    string sourcePath = Console.ReadLine();

    return sourcePath;
}

public static CloudBlockBlob GetBlob(CloudStorageAccount account)
{
    CloudBlobClient blobClient = account.CreateCloudBlobClient();

    Console.WriteLine("\nProvide name of Blob container:");
    string containerName = Console.ReadLine();
    CloudBlobContainer container = blobClient.GetContainerReference(containerName);
    container.CreateIfNotExistsAsync().Wait();

    Console.WriteLine("\nProvide name of new Blob:");
    string blobName = Console.ReadLine();
    CloudBlockBlob blob = container.GetBlockBlobReference(blobName);

    return blob;
}

Ubah metode TransferLocalFileToAzureBlob:

public static async Task TransferLocalFileToAzureBlob(CloudStorageAccount account)
{
    string localFilePath = GetSourcePath();
    CloudBlockBlob blob = GetBlob(account);
    Console.WriteLine("\nTransfer started...");
    await TransferManager.UploadAsync(localFilePath, blob);
    Console.WriteLine("\nTransfer operation complete.");
    ExecuteChoice(account);
}

Kode ini meminta jalur ke file lokal, nama kontainer baru atau yang sudah ada, dan nama blob baru. Metode TransferManager.UploadAsync ini melakukan unggahan menggunakan informasi ini.

Tekan F5 untuk menjalankan aplikasi Anda. Anda dapat memastikan bahwa unggahan tersebut terjadi dengan menampilkan akun Storage Anda dengan Microsoft Azure Storage Explorer.

Atur jumlah operasi paralel

Pustaka Pergerakan Data menawarkan kemampuan untuk mengatur jumlah operasi paralel untuk meningkatkan throughput transfer data. Secara default, pustaka Data Movement menetapkan jumlah operasi paralel menjadi 8 * jumlah inti pada mesin Anda.

Perlu diingat bahwa banyak operasi paralel di lingkungan bandwidth rendah mungkin membuat koneksi jaringan kewalahan dan benar-benar mencegah operasi selesai sepenuhnya. Anda harus bereksperimen dengan pengaturan ini untuk menentukan apa yang paling sesuai berdasarkan bandwidth jaringan yang tersedia.

Dalam contoh ini, kami menambahkan kode yang memungkinkan kami mengatur jumlah operasi paralel. Kami juga menambahkan kode dalam waktu berapa lama waktu yang dibutuhkan untuk menyelesaikan transfer.

Tambahkan metode SetNumberOfParallelOperations ke Program.cs:

public static void SetNumberOfParallelOperations()
{
    Console.WriteLine("\nHow many parallel operations would you like to use?");
    string parallelOperations = Console.ReadLine();
    TransferManager.Configurations.ParallelOperations = int.Parse(parallelOperations);
}

Ubah metode ExecuteChoice untuk menggunakan SetNumberOfParallelOperations:

public static void ExecuteChoice(CloudStorageAccount account)
{
    Console.WriteLine("\nWhat type of transfer would you like to execute?\n1. Local file --> Azure Blob\n2. Local directory --> Azure Blob directory\n3. URL (e.g. Amazon S3 file) --> Azure Blob\n4. Azure Blob --> Azure Blob");
    int choice = int.Parse(Console.ReadLine());

    SetNumberOfParallelOperations();

    if(choice == 1)
    {
        TransferLocalFileToAzureBlob(account).Wait();
    }
    else if(choice == 2)
    {
        TransferLocalDirectoryToAzureBlobDirectory(account).Wait();
    }
    else if(choice == 3)
    {
        TransferUrlToAzureBlob(account).Wait();
    }
    else if(choice == 4)
    {
        TransferAzureBlobToAzureBlob(account).Wait();
    }
}

Ubah metode TransferLocalFileToAzureBlob untuk menggunakan timer:

public static async Task TransferLocalFileToAzureBlob(CloudStorageAccount account)
{
    string localFilePath = GetSourcePath();
    CloudBlockBlob blob = GetBlob(account);
    Console.WriteLine("\nTransfer started...");
    Stopwatch stopWatch = Stopwatch.StartNew();
    await TransferManager.UploadAsync(localFilePath, blob);
    stopWatch.Stop();
    Console.WriteLine("\nTransfer operation completed in " + stopWatch.Elapsed.TotalSeconds + " seconds.");
    ExecuteChoice(account);
}

Lacak kemajuan transfer

Anda dapat melacak kemajuan transfer selama operasi transfer dengan membuat TransferContext objek. Objek TransferContext hadir dalam dua bentuk: SingleTransferContext untuk transfer file tunggal, dan DirectoryTransferContext untuk transfer direktori.

Tambahkan metode GetSingleTransferContext dan GetDirectoryTransferContext ke Program.cs:

public static SingleTransferContext GetSingleTransferContext(TransferCheckpoint checkpoint)
{
    SingleTransferContext context = new SingleTransferContext(checkpoint);

    context.ProgressHandler = new Progress<TransferStatus>((progress) =>
    {
        Console.Write("\rBytes transferred: {0}", progress.BytesTransferred );
    });

    return context;
}

public static DirectoryTransferContext GetDirectoryTransferContext(TransferCheckpoint checkpoint)
{
    DirectoryTransferContext context = new DirectoryTransferContext(checkpoint);

    context.ProgressHandler = new Progress<TransferStatus>((progress) =>
    {
        Console.Write("\rBytes transferred: {0}", progress.BytesTransferred );
    });

    return context;
}

Ubah metode TransferLocalFileToAzureBlob untuk menggunakan GetSingleTransferContext:

public static async Task TransferLocalFileToAzureBlob(CloudStorageAccount account)
{
    string localFilePath = GetSourcePath();
    CloudBlockBlob blob = GetBlob(account);
    TransferCheckpoint checkpoint = null;
    SingleTransferContext context = GetSingleTransferContext(checkpoint);
    Console.WriteLine("\nTransfer started...\n");
    Stopwatch stopWatch = Stopwatch.StartNew();
    await TransferManager.UploadAsync(localFilePath, blob, null, context);
    stopWatch.Stop();
    Console.WriteLine("\nTransfer operation completed in " + stopWatch.Elapsed.TotalSeconds + " seconds.");
    ExecuteChoice(account);
}

Lanjutkan transfer yang dibatalkan

Fitur lain yang ditawarkan oleh pustaka Pergerakan Data adalah kemampuan untuk melanjutkan transfer yang dibatalkan. Selanjutnya, kami menambahkan beberapa kode yang memungkinkan kami membatalkan transfer untuk sementara waktu dengan mengetik c, lalu melanjutkan transfer 3 detik kemudian.

Ubah metode TransferLocalFileToAzureBlob:

public static async Task TransferLocalFileToAzureBlob(CloudStorageAccount account)
{
    string localFilePath = GetSourcePath();
    CloudBlockBlob blob = GetBlob(account);
    TransferCheckpoint checkpoint = null;
    SingleTransferContext context = GetSingleTransferContext(checkpoint);
    CancellationTokenSource cancellationSource = new CancellationTokenSource();
    Console.WriteLine("\nTransfer started...\nPress 'c' to temporarily cancel your transfer...\n");

    Stopwatch stopWatch = Stopwatch.StartNew();
    Task task;
    ConsoleKeyInfo keyinfo;
    try
    {
        task = TransferManager.UploadAsync(localFilePath, blob, null, context, cancellationSource.Token);
        while(!task.IsCompleted)
        {
            if(Console.KeyAvailable)
            {
                keyinfo = Console.ReadKey(true);
                if(keyinfo.Key == ConsoleKey.C)
                {
                    cancellationSource.Cancel();
                }
            }
        }
        await task;
    }
    catch(Exception e)
    {
        Console.WriteLine("\nThe transfer is canceled: {0}", e.Message);
    }

    if(cancellationSource.IsCancellationRequested)
    {
        Console.WriteLine("\nTransfer will resume in 3 seconds...");
        Thread.Sleep(3000);
        checkpoint = context.LastCheckpoint;
        context = GetSingleTransferContext(checkpoint);
        Console.WriteLine("\nResuming transfer...\n");
        await TransferManager.UploadAsync(localFilePath, blob, null, context);
    }

    stopWatch.Stop();
    Console.WriteLine("\nTransfer operation completed in " + stopWatch.Elapsed.TotalSeconds + " seconds.");
    ExecuteChoice(account);
}

Hingga saat ini, nilai kami checkpoint telah diatur ke null. Sekarang, jika kita membatalkan transfer, kita mengambil titik pemeriksaan terakhir transfer, maka gunakan titik pemeriksaan baru ini dalam konteks transfer kita.

Transfer direktori lokal ke penyimpanan Blob

Pustaka Pergerakan Data memungkinkan Anda mentransfer direktori file dan semua subdirektorinya, seperti yang ditunjukkan dalam contoh berikut.

Pertama, tambahkan metode GetBlobDirectory ke Program.cs:

public static CloudBlobDirectory GetBlobDirectory(CloudStorageAccount account)
{
    CloudBlobClient blobClient = account.CreateCloudBlobClient();

    Console.WriteLine("\nProvide name of Blob container. This can be a new or existing Blob container:");
    string containerName = Console.ReadLine();
    CloudBlobContainer container = blobClient.GetContainerReference(containerName);
    container.CreateIfNotExistsAsync().Wait();

    CloudBlobDirectory blobDirectory = container.GetDirectoryReference("");

    return blobDirectory;
}

Kemudian, ubah TransferLocalDirectoryToAzureBlobDirectory:

public static async Task TransferLocalDirectoryToAzureBlobDirectory(CloudStorageAccount account)
{
    string localDirectoryPath = GetSourcePath();
    CloudBlobDirectory blobDirectory = GetBlobDirectory(account);
    TransferCheckpoint checkpoint = null;
    DirectoryTransferContext context = GetDirectoryTransferContext(checkpoint);
    CancellationTokenSource cancellationSource = new CancellationTokenSource();
    Console.WriteLine("\nTransfer started...\nPress 'c' to temporarily cancel your transfer...\n");

    Stopwatch stopWatch = Stopwatch.StartNew();
    Task task;
    ConsoleKeyInfo keyinfo;
    UploadDirectoryOptions options = new UploadDirectoryOptions()
    {
        Recursive = true
    };

    try
    {
        task = TransferManager.UploadDirectoryAsync(localDirectoryPath, blobDirectory, options, context, cancellationSource.Token);
        while(!task.IsCompleted)
        {
            if(Console.KeyAvailable)
            {
                keyinfo = Console.ReadKey(true);
                if(keyinfo.Key == ConsoleKey.C)
                {
                    cancellationSource.Cancel();
                }
            }
        }
        await task;
    }
    catch(Exception e)
    {
        Console.WriteLine("\nThe transfer is canceled: {0}", e.Message);
    }

    if(cancellationSource.IsCancellationRequested)
    {
        Console.WriteLine("\nTransfer will resume in 3 seconds...");
        Thread.Sleep(3000);
        checkpoint = context.LastCheckpoint;
        context = GetDirectoryTransferContext(checkpoint);
        Console.WriteLine("\nResuming transfer...\n");
        await TransferManager.UploadDirectoryAsync(localDirectoryPath, blobDirectory, options, context);
    }

    stopWatch.Stop();
    Console.WriteLine("\nTransfer operation completed in " + stopWatch.Elapsed.TotalSeconds + " seconds.");
    ExecuteChoice(account);
}

Ada beberapa perbedaan antara metode ini dengan metode mengunggah satu file. Kita sekarang menggunakan metode TransferManager.UploadDirectoryAsync dan getDirectoryTransferContext metode telah dibuat. Selain itu, kita sekarang memberikan nilai options untuk unggahan, yang memungkinkan kita untuk menunjukkan bahwa kita ingin menyertakan subdirektori dalam unggahan.

Salin file dari URL ke blob

Sekarang, mari kita tambahkan kode yang memungkinkan kita untuk menyalin file dari URL ke Azure Blob.

Ubah TransferUrlToAzureBlob:

public static async Task TransferUrlToAzureBlob(CloudStorageAccount account)
{
    Uri uri = new Uri(GetSourcePath());
    CloudBlockBlob blob = GetBlob(account);
    TransferCheckpoint checkpoint = null;
    SingleTransferContext context = GetSingleTransferContext(checkpoint);
    CancellationTokenSource cancellationSource = new CancellationTokenSource();
    Console.WriteLine("\nTransfer started...\nPress 'c' to temporarily cancel your transfer...\n");

    Stopwatch stopWatch = Stopwatch.StartNew();
    Task task;
    ConsoleKeyInfo keyinfo;
    try
    {
        task = TransferManager.CopyAsync(uri, blob, CopyMethod.ServiceSideAsyncCopy, null, context, cancellationSource.Token);
        while(!task.IsCompleted)
        {
            if(Console.KeyAvailable)
            {
                keyinfo = Console.ReadKey(true);
                if(keyinfo.Key == ConsoleKey.C)
                {
                    cancellationSource.Cancel();
                }
            }
        }
        await task;
    }
    catch(Exception e)
    {
        Console.WriteLine("\nThe transfer is canceled: {0}", e.Message);
    }

    if(cancellationSource.IsCancellationRequested)
    {
        Console.WriteLine("\nTransfer will resume in 3 seconds...");
        Thread.Sleep(3000);
        checkpoint = context.LastCheckpoint;
        context = GetSingleTransferContext(checkpoint);
        Console.WriteLine("\nResuming transfer...\n");
        await TransferManager.CopyAsync(uri, blob, CopyMethod.ServiceSideAsyncCopy, null, context, cancellationSource.Token);
    }

    stopWatch.Stop();
    Console.WriteLine("\nTransfer operation completed in " + stopWatch.Elapsed.TotalSeconds + " seconds.");
    ExecuteChoice(account);
}

Salah satu kasus penggunaan penting untuk fitur ini adalah ketika Anda perlu memindahkan data dari layanan cloud lain ke Azure. Jika Anda memiliki URL yang memberi Anda akses ke sumber daya, Anda dapat dengan mudah memindahkan sumber daya tersebut ke Azure Blobs dengan menggunakan metode .TransferManager.CopyAsync Metode ini juga memperkenalkan parameter CopyMethod . Tabel berikut ini memperlihatkan opsi yang tersedia untuk parameter ini:

Nama anggota Nilai Deskripsi
SyncCopy 0 Unduh data dari sumber ke memori, dan unggah data dari memori ke tujuan. Saat ini hanya tersedia untuk menyalin dari satu sumber daya Azure Storage ke sumber daya lainnya.
ServiceSideAsyncCopy 1 Kirim permintaan penyalinan awal ke Azure Storage untuk membiarkannya melakukan penyalinan; pantau kemajuan operasi salin hingga salinan selesai.
ServiceSideSyncCopy 2 Salin konten setiap gugus dengan Masukkan Blok Dari URL, Tambahkan Blok Dari URL, atau Masukkan Halaman Dari URL.

Menyalin blob

Fitur lain yang disediakan oleh pustaka Pergerakan Data adalah kemampuan untuk menyalin dari satu sumber daya Azure Storage ke sumber daya lainnya.

Ubah metode TransferAzureBlobToAzureBlob:

public static async Task TransferAzureBlobToAzureBlob(CloudStorageAccount account)
{
    CloudBlockBlob sourceBlob = GetBlob(account);
    CloudBlockBlob destinationBlob = GetBlob(account);
    TransferCheckpoint checkpoint = null;
    SingleTransferContext context = GetSingleTransferContext(checkpoint);
    CancellationTokenSource cancellationSource = new CancellationTokenSource();
    Console.WriteLine("\nTransfer started...\nPress 'c' to temporarily cancel your transfer...\n");

    Stopwatch stopWatch = Stopwatch.StartNew();
    Task task;
    ConsoleKeyInfo keyinfo;
    try
    {
        task = TransferManager.CopyAsync(sourceBlob, destinationBlob, CopyMethod.SyncCopy, null, context, cancellationSource.Token);
        while(!task.IsCompleted)
        {
            if(Console.KeyAvailable)
            {
                keyinfo = Console.ReadKey(true);
                if(keyinfo.Key == ConsoleKey.C)
                {
                    cancellationSource.Cancel();
                }
            }
        }
        await task;
    }
    catch(Exception e)
    {
        Console.WriteLine("\nThe transfer is canceled: {0}", e.Message);
    }

    if(cancellationSource.IsCancellationRequested)
    {
        Console.WriteLine("\nTransfer will resume in 3 seconds...");
        Thread.Sleep(3000);
        checkpoint = context.LastCheckpoint;
        context = GetSingleTransferContext(checkpoint);
        Console.WriteLine("\nResuming transfer...\n");
        await TransferManager.CopyAsync(sourceBlob, destinationBlob, CopyMethod.SyncCopy, null, context, cancellationSource.Token);
    }

    stopWatch.Stop();
    Console.WriteLine("\nTransfer operation completed in " + stopWatch.Elapsed.TotalSeconds + " seconds.");
    ExecuteChoice(account);
}

Dalam contoh ini, kita mengatur parameter boolean TransferManager.CopyAsync ke CopyMethod.SyncCopy untuk menunjukkan bahwa kita ingin melakukan salinan sinkron. Konfigurasi ini berarti bahwa sumber daya diunduh ke komputer lokal kami terlebih dahulu, lalu diunggah ke Azure Blob. Opsi salinan sinkron adalah cara yang bagus untuk memastikan bahwa operasi salinan Anda memiliki kecepatan yang konsisten. Sebaliknya, kecepatan salinan sisi server asinkron tergantung pada bandwidth jaringan yang tersedia di server, yang dapat berfluktuasi. Namun, salinan sinkron mungkin menghasilkan biaya keluar tambahan dibandingkan dengan salinan asinkron. Pendekatan yang disarankan adalah menggunakan salinan sinkron di Azure Virtual Machine yang berada di wilayah yang sama dengan akun penyimpanan sumber Anda untuk menghindari biaya keluar.

Aplikasi pergerakan data sekarang selesai. Sampel kode lengkap tersedia di GitHub.

Langkah berikutnya

Dokumentasi referensi pustaka Data Movement Azure Storage.

Tip

Mengelola sumber daya Azure Blob Storage dengan Storage Explorer. Azure Storage Explorer adalah aplikasi mandiri gratis dari Microsoft yang memungkinkan Anda mengelola sumber daya penyimpanan Azure Blob. Menggunakan Azure Storage Explorer, Anda dapat membuat, membaca, memperbarui, dan menghapus kontainer blob dan blob secara visual, serta mengelola akses ke kontainer dan gumpalan gumpalan Anda.