مرفقات Azure Cosmos DB

ينطبق على: NoSQL MongoDB

مرفقات Azure Cosmos DB عبارة عن عناصر خاصة تحتوي على مراجع لبيانات أولية مرتبطة بملف blob خارجي أو ملف وسائط.

يدعم Azure Cosmos DB نوعين من المرفقات:

  • المرفقات غير المدارة عبارة عن برنامج تضمين حول مرجع URI إلى كائن ثنائي كبير الحجم مخزن في خدمة خارجية (على سبيل المثال، Azure Storage وOneDrive وما إلى ذلك). يشبه هذا الأسلوب تخزين خاصية URI في عنصر Azure Cosmos DB قياسي.
  • المرفقات المدارة هي كائنات ثنائية كبيرة الحجم تتم إدارتها وتخزينها داخليا بواسطة Azure Cosmos DB وتعرض عبر mediaLink الذي ينشئه النظام.

إشعار

المرفقات هي ميزة قديمة. تم تحديد نطاق دعمهم لتقديم وظائف مستمرة إذا كنت تستخدم هذه الميزة بالفعل.

بدلاً من استخدام المرفقات، نوصيك باستخدام Azure Blob Storage كخدمة تخزين blob مصممة لهذا الغرض لتخزين بيانات blob. يمكنك الاستمرار في تخزين البيانات الوصفية المتعلقة بالنقاط الكبيرة، جنباً إلى جنب مع ارتباطات URI المرجعية، في Azure Cosmos DB كخصائص عنصر. يوفر تخزين هذه البيانات في Azure Cosmos DB القدرة على الاستعلام عن البيانات الوصفية والارتباطات الخاصة بالنقاط الكبيرة المخزنة في Azure Blob Storage.

تلتزم Microsoft بتقديم إشعار مدته 36 شهراً كحد أدنى قبل الإيقاف الكامل للمرفقات - والذي سيتم الإعلان عنه في تاريخ آخر.

القيود المعروفة

تتميز مرفقات Azure Cosmos DB المُدارة عن دعمها للعناصر القياسية - والتي توفر لها قابلية تطوير غير محدودة وتوزيع عالمي وتكامل مع خدمات Azure الأخرى.

  • المرفقات غير مدعومة في جميع إصدارات Azure Cosmos DB SDKs.
  • تقتصر المرفقات المُدارة على 2 جيجا بايت من التخزين لكل حساب قاعدة بيانات.
  • المرفقات المُدارة غير متوافقة مع التوزيع العالمي لـ Azure Cosmos DB، ولا يتم نسخها عبر المناطق.

إشعار

يستخدم Azure Cosmos DB للإصدار 3.2 من MongoDB المرفقات المدارة ل GridFS وهذه تخضع لنفس القيود.

نوصي المطورين باستخدام مجموعة ميزات MongoDB GridFS للترقية إلى Azure Cosmos DB للإصدار 3.6 أو أعلى من MongoDB، والذي يتم فصله عن المرفقات ويوفر تجربة أفضل. بدلاً من ذلك، يجب على المطورين الذين يستخدمون مجموعة ميزات MongoDB GridFS أيضاً التفكير في استخدام قاعدة تخزين Azure Blob - المصمم خصوصاً لتخزين محتوى البيانات الثنائية الكبيرة ويوفر وظائف موسعة بتكلفة أقل مقارنة بـ GridFS.

ترحيل المرفقات إلى مساحة تخزين Azure Blob

نوصي بترحيل مرفقات Azure Cosmos DB إلى تخزين Azure Blob باتباع الخطوات التالية:

  1. انسخ بيانات المرفقات من حاوية Azure Cosmos DB المصدر إلى حاوية تخزين Azure Blob المستهدفة.
  2. تحقق من صحة بيانات البيانات الثنائية الكبيرة التي تم تحميلها في حاوية تخزين Azure Blob المستهدفة.
  3. إذا كان ذلك ممكناً، فأضف مراجع URI إلى الكرات الكبيرة الموجودة في قاعدة تخزين Azure Blob كخصائص سلسلة ضمن مجموعة بيانات Azure Cosmos DB.
  4. أعد تشكيل كود التطبيق لقراءة وكتابة النقاط الكبيرة من حاوية تخزين Azure Blob الجديدة.

يوضح نموذج التعليمات البرمجية التالي كيفية نسخ المرفقات من Azure Cosmos DB إلى تخزين Azure Blob كجزء من تدفق الترحيل باستخدام .NET SDK v2 وAzure Blob Storage .NET SDK v12. تأكد من استبدال <placeholder values> لحساب Azure Cosmos DB المصدر وحاوية تخزين Azure Blob المستهدفة.


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);
        }
    }
}

الخطوات التالية