Załączniki usługi Azure Cosmos DB

DOTYCZY: Nosql Mongodb

Załączniki usługi Azure Cosmos DB to specjalne elementy zawierające odwołania do skojarzonych metadanych z zewnętrznym plikiem obiektów blob lub multimediów.

Usługa Azure Cosmos DB obsługuje dwa typy załączników:

  • Załączniki niezarządzane to otoka identyfikatora URI odwołania do obiektu blob przechowywanego w usłudze zewnętrznej (na przykład Azure Storage, OneDrive itp.). Takie podejście jest podobne do przechowywania właściwości URI w standardowym elemencie usługi Azure Cosmos DB.
  • Załączniki zarządzane są obiektami blob zarządzanymi i przechowywanymi wewnętrznie przez usługę Azure Cosmos DB oraz udostępnianymi za pośrednictwem nośnika generowanego przez system.

Uwaga

Załączniki są starszą funkcją. Ich obsługa jest ograniczona do oferowania ciągłej funkcjonalności, jeśli korzystasz już z tej funkcji.

Zamiast używać załączników, zalecamy używanie Azure Blob Storage jako specjalnie utworzonej usługi magazynu obiektów blob do przechowywania danych obiektów blob. Metadane powiązane z obiektami blob można przechowywać wraz z linkami identyfikatora URI odwołania w usłudze Azure Cosmos DB jako właściwości elementu. Przechowywanie tych danych w usłudze Azure Cosmos DB umożliwia wykonywanie zapytań dotyczących metadanych i linków do obiektów blob przechowywanych w Azure Blob Storage.

Firma Microsoft zobowiązuje się do udostępnienia co najmniej 36-miesięcznego powiadomienia przed w pełni przestarzałymi załącznikami — które zostaną ogłoszone w dalszej części.

Znane ograniczenia

Załączniki zarządzane usługi Azure Cosmos DB różnią się od obsługi elementów standardowych, dla których oferuje nieograniczoną skalowalność, dystrybucję globalną i integrację z innymi usługami platformy Azure.

  • Załączniki nie są obsługiwane we wszystkich wersjach zestawów SDK usługi Azure Cosmos DB.
  • Załączniki zarządzane są ograniczone do 2 GB magazynu na konto bazy danych.
  • Załączniki zarządzane nie są zgodne z globalną dystrybucją usługi Azure Cosmos DB i nie są replikowane w różnych regionach.

Uwaga

Usługa Azure Cosmos DB dla bazy danych MongoDB w wersji 3.2 korzysta z załączników zarządzanych dla systemu plików GridFS i podlegają tym samym ograniczeniom.

Zalecamy deweloperom korzystanie z zestawu funkcji MongoDB GridFS w celu uaktualnienia do usługi Azure Cosmos DB dla bazy danych MongoDB w wersji 3.6 lub nowszej, która jest oddzielona od załączników i zapewnia lepsze środowisko. Alternatywnie deweloperzy korzystający z zestawu funkcji MongoDB GridFS powinni również rozważyć użycie Azure Blob Storage — który jest przeznaczony do przechowywania zawartości obiektów blob i oferuje rozszerzone funkcje przy niższych kosztach w porównaniu z gridFS.

Migrowanie załączników do Azure Blob Storage

Zalecamy migrację załączników usługi Azure Cosmos DB do Azure Blob Storage, wykonując następujące kroki:

  1. Skopiuj dane załączników ze źródłowego kontenera usługi Azure Cosmos DB do kontenera docelowego Azure Blob Storage.
  2. Zweryfikuj przekazane dane obiektu blob w kontenerze Azure Blob Storage docelowym.
  3. Jeśli ma to zastosowanie, dodaj odwołania identyfikatora URI do obiektów blob zawartych w Azure Blob Storage jako właściwości ciągu w zestawie danych usługi Azure Cosmos DB.
  4. Refaktoryzacja kodu aplikacji w celu odczytywania i zapisywania obiektów blob z nowego kontenera Azure Blob Storage.

Poniższy przykładowy kod przedstawia sposób kopiowania załączników z usługi Azure Cosmos DB do usługi Azure Blob Storage w ramach przepływu migracji przy użyciu zestawu SDK platformy .NET usługi Azure Cosmos DB w wersji 2 i Azure Blob Storage zestawu SDK platformy .NET w wersji 12. Pamiętaj o zastąpieniu <placeholder values> źródłowego konta usługi Azure Cosmos DB i docelowego kontenera usługi Azure Blob Storage.


using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.Azure.Documents;
using Microsoft.Azure.Documents.Client;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;

namespace attachments
{
    class Program
    {
        private static string cosmosAccount = "<Your_Azure_Cosmos_account_URI>";
        private static string cosmosKey = "<Your_Azure_Cosmos_account_PRIMARY_KEY>";
        private static string cosmosDatabaseName = "<Your_Azure_Cosmos_database>";
        private static string cosmosCollectionName = "<Your_Azure_Cosmos_collection>";
        private static string storageConnectionString = "<Your_Azure_Storage_connection_string>";
        private static string storageContainerName = "<Your_Azure_Storage_container_name>";
        private static DocumentClient cosmosClient = new DocumentClient(new Uri(cosmosAccount), cosmosKey);
        private static BlobServiceClient storageClient = new BlobServiceClient(storageConnectionString);
        private static BlobContainerClient storageContainerClient = storageClient.GetBlobContainerClient(storageContainerName);

        static void Main(string[] args)
        {
            CopyAttachmentsToBlobsAsync().Wait();
        }

        private async static Task CopyAttachmentsToBlobsAsync()
        {
            Console.WriteLine("Copying Azure Cosmos DB Attachments to Azure Blob Storage ...");

            int totalCount = 0;
            string docContinuation = null;

            // Iterate through each item (document in v2) in the Azure Cosmos DB container (collection in v2) to look for attachments.
            do
            {
                FeedResponse<dynamic> response = await cosmosClient.ReadDocumentFeedAsync(
                    UriFactory.CreateDocumentCollectionUri(cosmosDatabaseName, cosmosCollectionName),
                    new FeedOptions
                    {
                        MaxItemCount = -1,
                        RequestContinuation = docContinuation
                    });
                docContinuation = response.ResponseContinuation;

                foreach (Document document in response)
                {
                    string attachmentContinuation = null;
                    PartitionKey docPartitionKey = new PartitionKey(document.Id);

                    // Iterate through each attachment within the item (if any).
                    do
                    {
                        FeedResponse<Attachment> attachments = await cosmosClient.ReadAttachmentFeedAsync(
                            document.SelfLink,
                            new FeedOptions
                            {
                                PartitionKey = docPartitionKey,
                                RequestContinuation = attachmentContinuation
                            }
                        );
                        attachmentContinuation = attachments.ResponseContinuation;

                        foreach (var attachment in attachments)
                        {
                            // Download the attachment in to local memory.
                            MediaResponse content = await cosmosClient.ReadMediaAsync(attachment.MediaLink);

                            byte[] buffer = new byte[content.ContentLength];
                            await content.Media.ReadAsync(buffer, 0, buffer.Length);

                            // Upload the locally buffered attachment to blob storage
                            string blobId = String.Concat(document.Id, "-", attachment.Id);

                            Azure.Response<BlobContentInfo> uploadedBob = await storageContainerClient.GetBlobClient(blobId).UploadAsync(
                                new MemoryStream(buffer, writable: false),
                                true
                            );

                            Console.WriteLine("Copied attachment ... Item Id: {0} , Attachment Id: {1}, Blob Id: {2}", document.Id, attachment.Id, blobId);
                            totalCount++;

                            // Clean up attachment from Azure Cosmos DB.
                            // Warning: please verify you've succesfully migrated attachments to blog storage prior to cleaning up Azure Cosmos DB.
                            // await cosmosClient.DeleteAttachmentAsync(
                            //     attachment.SelfLink,
                            //     new RequestOptions { PartitionKey = docPartitionKey }
                            // );

                            // Console.WriteLine("Cleaned up attachment ... Document Id: {0} , Attachment Id: {1}", document.Id, attachment.Id);
                        }

                    } while (!string.IsNullOrEmpty(attachmentContinuation));
                }
            }
            while (!string.IsNullOrEmpty(docContinuation));

            Console.WriteLine("Finished copying {0} attachments to blob storage", totalCount);
        }
    }
}

Następne kroki