عمليات Gridwich لـ Azure Storage

Azure Storage

توفر خدمة تخزين Gridwich Azure Gridwich.SagaParticipants.Storage.AzureStorage ، عمليات الكائنات الثنائية كبيرة الحجم والحاويات لحسابات تخزين Azure التي تم تكوينها لـ Gridwich. من أمثلة عمليات التخزين إنشاء كائن ثنائي كبير الحجم أو حذف حاوية أو نسخ كائن ثنائي كبير الحجم أو تغيير طبقة التخزين.

يتطلب Gridwich آليات التخزين الخاصة به للعمل لكل من الكائنات الثنائية كبيرة الحجم لكتل تخزين Azure والحاويات. مع الفئات المميزة وعمليات خدمة التخزين للكائنات الثنائية كبيرة الحجم والحاويات، لا يوجد أي غموض حول ما إذا كانت عملية تخزين معينة تتعلق بكائن ثنائي كبير الحجم أو بحاوية. تنطبق هذه المقالة على كل من الكائنات الثنائية كبيرة الحجم والحاويات، باستثناء الحالات المذكورة.

تعرض Gridwich معظم عمليات التخزين للأنظمة الخارجية داخل المشارك الملحمة.Storage.AzureStorage يستخدم المشاركون الآخرون في saga خدمة التخزين لمهام مثل نسخ الكائنات الثنائية كبيرة الحجم بين حاويات أو حسابات مختلفة عند إعداد مهام سير عمل الترميز.

تبين هذه المقالة كيف تفي خدمة تخزين Gridwich Azure بمتطلبات الحل وتتكامل مع آليات مثل معالجات الأحداث. تشير الارتباطات إلى التعليمات البرمجية المصدر المقابلة، والتي تحتوي على تعليقات أكثر شمولاً على الحاويات والفئات والآليات.

Azure Storage SDK

يستخدم Gridwich فئات من Azure Storage SDK للتفاعل مع Azure Storage، بدلا من طلبات REST يدويا. داخل موفر التخزين، تدير فئتا SDK BlobBaseClient وBlobContainerClient طلبات التخزين.

تسمح فئات عميل SDK هذه حاليا فقط بالوصول غير المباشر إلى عنواني HTTP Gridwich اللذين يحتاجان إلى معالجة سياق x-ms-client-request-id العملية وإصدار ETag الكائن.

في Gridwich، يوزع زوج من فئات الموفر وظائف BlobBaseClientProvider وBlobContainerClientProvider في وحدات تسمى الأكمام. للحصول على تفاصيل حول الأكمام، راجع أكمام التخزين.

يوضح الرسم التخطيطي التالي بنية فئتي SDK و Gridwich، وكيفية ارتباط المثيلات ببعضها البعض. تشير الأسهم إلى "يحتوي على مرجع إلى."

رسم تخطيطي يوضح علاقات مثيل كائن العميل بين فئات Storage SDK.

نهج البنية الأساسية لبرنامج ربط العمليات التجارية

يمكنك تعيين الوصلة لمعالجة رؤوس HTTP كمثيل نهج البنية الأساسية لبرنامج ربط العمليات التجارية عند إنشاء مثيل العميل. يمكنك تعيين هذا النهج فقط في وقت إنشاء مثيل العميل، ولا يمكنك تغيير النهج. يجب أن يكون رمز موفر التخزين باستخدام العميل قادرا على معالجة قيم الرأس أثناء التنفيذ. يتمثل التحدي في جعل موفر التخزين والمسار يتفاعلان بشكل نظيف.

للحصول على نهج البنية الأساسية لبرنامج ربط العمليات التجارية Gridwich، راجع فئة BlobClientPipelinePolicy .

التخزين المؤقت لخدمة التخزين

إنشاء اتصال TCP والمصادقة إنشاء النفقات العامة عندما يرسل مثيل كائن عميل SDK طلبه الأول إلى تخزين Azure. استدعاءات متعددة لنفس الكائن الثنائي كبير الحجم في طلب نظام خارجي، على سبيل المثال الحصول على بيانات التعريف، ثم حذف كائن ثنائي كبير الحجم، يضاعف الحمل.

للتخفيف من الحمل، يحتفظ Gridwich بذاكرة تخزين مؤقت لمثيل عميل واحد لكل كائن ثنائي كبير الحجم أو حاوية تخزين، اعتمادا على فئات SDK التي يستخدمها سياق العملية. يحتفظ Gridwich بمثيل العميل هذا ويمكنه استخدام المثيل لعمليات تخزين Azure متعددة مقابل نفس الكائن الثنائي كبير الحجم أو الحاوية طوال مدة طلب النظام الخارجي.

تتطلب فئات العميل التي توفرها Azure SDK مثيلات كائن عميل SDK لتكون خاصة بكائن ثنائي كبير الحجم واحد أو حاوية واحدة في وقت الإنشاء. المثيلات أيضا غير مضمونة آمنة للاستخدام المتزامن على مؤشرات ترابط مختلفة. نظرا لأن سياق العملية يمثل طلبا واحدا، فإن Gridwich يقوم بالتخزين المؤقت على مزيج من كائن ثنائي كبير الحجم أو اسم الحاوية مع سياق العملية.

تتطلب إعادة استخدام هذا المثيل، جنبا إلى جنب مع بنية عميل Azure Storage SDK، رمز دعم إضافي لتحقيق التوازن بين الكفاءة ووضوح التعليمات البرمجية.

وسيطة السياق

تتطلب جميع عمليات خدمة تخزين Gridwich تقريبا وسيطة سياق خاصة من نوع StorageClientProviderContext. تفي وسيطة السياق هذه بالمتطلبات التالية:

  • يوفر للنظام الخارجي استجابات، والتي تتضمن قيمة سياق العملية الفريدة المستندة إلى JSON لكل طلب التي حددها النظام الخارجي على طلب Gridwich. لمزيد من المعلومات، راجع سياق العملية.

  • يسمح لمتصلي خدمة التخزين مثل معالجات أحداث Gridwich بالتحكم في الاستجابات المرئية للنظام الخارجي. يمنع عنصر التحكم هذا الخدمة من إغراق النظام الخارجي بأحداث الإعلام غير ذات الصلة. لمزيد من المعلومات، راجع القيود.

  • يتوافق مع اصطلاحات Azure Storage لضمان الطلبات والاستجابات المتماسكة في بيئة تسمح بمزيج من القراء والكتاب المتوازيين. على سبيل المثال، يدعم تتبع ETag. لمزيد من المعلومات، راجع ETags.

سياق التخزين

سياق كل من أنواع تخزين الكائنات الثنائية كبيرة الحجم والحاويات هو StorageClientProviderContext، الذي يبدو كما يلي:

    string  ClientRequestID { get; }
    JObject ClientRequestIdAsJObject { get; }
    bool    IsMuted { get; set; }
    string  ETag { get; set; }
    bool    TrackingETag { get; set; }

أول خاصيتين هما تمثيلات مختلفة لسياق العملية الذي تم استخدامه لتهيئة مثيل StorageClientProviderContext . تحتوي الفئة على منشئات مختلفة، بما في ذلك منشئ نسخ. تتضمن ResetToالأساليب الإضافية، للسماح بازدواجية الحالة الموضعية، وطريقة ثابتة CreateSafe لضمان عدم طرح التهيئة الإشكالية استثناءات.

تحتوي الفئة أيضا على معالجة خاصة لإنشاء سياقات استنادا إلى معرفات المستخدم الرسومية والسلاسل الفارغة. تتطلب معالجات إعلام تخزين Azure للكائن الثنائي كبير الحجم التي تم إنشاؤها وحذفها، والتي تعالج أيضا الإعلامات الناشئة عن عوامل خارجية، نموذج GUID.

كتم السياق

IsMuted تتحكم الخاصية في ما إذا كان التطبيق يتوقع من الخدمة نشر الإعلامات الناتجة مرة أخرى إلى المتصل، على سبيل المثال إلى النظام الخارجي. في عملية كتم الصوت، لا تنشر الخدمة الأحداث الناتجة.

مثال على ذلك هو نسخ الكائنات الثنائية كبيرة الحجم التي ينفذها أداة الترميز لترتيب الكائنات الثنائية كبيرة الحجم في Azure Storage كإدخال لمهمة ترميز. لا يهتم النظام الخارجي بهذه التفاصيل، ولكن فقط حول حالة مهمة الترميز ومكان استرداد المخرجات المشفرة. لعكس هذه المخاوف، أداة الترميز:

  1. ينشئ سياق تخزين غير كتم الصوت استنادا إلى سياق عملية الطلب، على سبيل المثال ctxNotMuted.

  2. إنشاء سياق تخزين كتم الصوت، على سبيل المثال ctxMuted، إما باستخدام منشئ نسخ فئة السياق أو إنشاء مثيل جديد. سيكون لأي من الخيارين نفس قيمة سياق العملية.

  3. ctxMuted يحدد عمليات التخزين المتضمنة في إعداد الترميز. لا يرى النظام الخارجي أي إشارة إلى حدوث هذه العمليات.

  4. ctxNotMuted يحدد سياق عمليات التخزين التي تعكس اكتمال الترميز، على سبيل المثال نسخ ملف إخراج إلى حاوية هدف. تنشر معالجات Gridwich أحداث إعلام Azure Storage الناتجة إلى النظام الخارجي.

يتحكم المتصل في الرؤية النهائية للعمليات. تستند كل من العمليات المكتمة وغير المكتمة إلى قيمة مكافئة operationContext. الهدف من كتم السياق هو تسهيل إجراء تشخيص المشكلة من سجلات تتبع الأحداث، لأنه من الممكن رؤية عمليات التخزين المتعلقة بطلب، بغض النظر عن حالة كتم العملية.

يحتوي ResponseBaseDTO على خاصية DoNotPublishمنطقية ، والتي يستخدمها إرسال الحدث لإملاء القرار النهائي حول ما إذا كان سيتم النشر. يؤدي إرسال الحدث بدوره إلى تعيين الخاصية DoNotPublish استنادا IsMuted إلى خاصية السياق.

ترسل الخدمة إعداد كتم الصوت إلى Azure Storage، والذي يقوم بعد ذلك بتعيين clientRequestId في أحداث إعلام التخزين التي تقدمها إلى معالجي Gridwich، تم الإنشاء والحذف. تم تعيين DoNotPublish هذين المعالجين ليعكسا كتم الصوت المطلوب من المتصل.

ETags للتناسق الهدف

يستخدم Azure Storage عنوان HTTP ETag لتسلسلات الطلب التي يجب أن تحتوي على تناسق الهدف. مثال على ذلك هو التأكد من عدم تغيير كائن ثنائي كبير الحجم بين عمليات تخزين استرداد بيانات التعريفوتحديث بيانات التعريف.

للمحاذاة مع استخدام HTTP القياسي، يحتوي هذا العنوان على قيمة مبهمة تفسيرها هو أنه إذا تغيرت قيمة العنوان، فقد تغير الكائن الأساسي أيضا. إذا أرسل طلب قيمته الحالية ETag للكائن، ولم يتطابق مع قيمة خدمة ETag التخزين الحالية، فسيفشل الطلب على الفور. إذا لم يتضمن ETag الطلب قيمة، يتخطى Azure Storage هذا الفحص ولا يحظر الطلب.

ETags في خدمة التخزين

بالنسبة إلى Gridwich، ETag هو تفاصيل داخلية بين خدمة تخزين Gridwich وAzure Storage. لا توجد تعليمات برمجية أخرى يجب أن تكون على علم ب ETag. تستخدم ETag خدمة التخزين لتسلسلات مثل الحصول على بيانات تعريف كائن ثنائي كبير الحجم، وحذف عمليات Blob لمعالجة BlobDelete Event طلب. ETag يشمل استخدام أن عملية Delete Blob تستهدف بالضبط نفس إصدار الكائن الثنائي كبير الحجم مثل عملية Get Metadata.

لاستخدام ETag للمثال السابق:

  1. أرسل طلب الحصول على بيانات التعريف مع فارغ ETag.
  2. حفظ ETagالقيمة من الرد.
  3. أضف القيمة المحفوظة ETag إلى طلب Delete Blob .

إذا كانت القيمتان مختلفتين ETag، تفشل عملية الحذف. يعني الفشل أن بعض العمليات الأخرى غيرت الكائن الثنائي كبير الحجم بين الخطوتين 2 و3. كرر العملية من الخطوة 1.

ETagهي معلمة من الدالات الإنشائية وخاصية سلسلة لفئة StorageClientProviderContext. يعالج ETag BlobClientPipelinePolicy الخاص ب Gridwich فقط القيمة.

التحكم في استخدام ETag

TrackingETag تتحكم الخاصية في ما إذا كنت تريد إرسال ETag القيمة على الطلب التالي. تعني القيمة true أن الخدمة ترسل ETag إذا كانت متوفرة.

ينتج عن طلب Azure Storage بقيمة ETag لا تتطابق مع الكائن الثنائي كبير الحجم للموضوع أو الحاوية فشل العملية. هذا الفشل حسب التصميم، لأنه ETag طريقة HTTP القياسية للتعبير عن "الإصدار الدقيق الذي يستهدفه الطلب." يمكن أن تتضمن الطلبات الخاصية TrackingETag التي يجب أن تشير إلى أن يجب أن ETags تتطابق، أو لا تتضمن الخاصية TrackingETag للإشارة إلى أن ETag القيم لا تهم.

يسترد ETag المسار دائما قيمة من عملية تخزين Azure إذا كانت موجودة في استجابة REST هذه. يحدث المسار دائماً خاصية السياق ETag، إن أمكن، اعتبارا من العملية الأخيرة. TrackingETag تتحكم العلامة فقط فيما إذا كان الطلب التالي من مثيل العميل نفسه يرسل قيمة الخاصيةETag. ETag إذا كانت القيمة خالية أو فارغة، فإن الطلب الحالي لا يعين قيمة HTTPETag، بغض النظر عن قيمة TrackingETag.

أكمام التخزين

يتطلب Gridwich أن تعمل آليات التخزين الخاصة به لكل من الكائنات الثنائية كبيرة الحجم لكتل تخزين Azure والحاويات. هناك فئات مميزة وعمليات Storage Service للكائنات الثنائية كبيرة الحجم والحاويات، لذلك لا يوجد أي غموض حول ما إذا كانت عملية تخزين معينة تتعلق بنقطة أو بحاوية.

زوج من فئات الموفر، واحد للكائنات الثنائية كبيرة الحجم والآخر للحاويات، يوزع مجموعتي الوظائف في وحدات تسمى الأكمام. تحتوي الأكمام على مثيلات فئات مساعد التخزين التي تعد جزءا من Azure SDK. تهيئة خدمة التخزين تنشئ الموفرين وتجعلهم متاحين مباشرة لأساليب خدمة التخزين.

بنية الأكمام

الأكمام هو حاوية لمثيل كائن عميل SDK وسياق التخزين. تشير وظائف موفر التخزين إلى الأكمام عبر الخاصيتين Client و Context. هناك نوع كم للكائنات الثنائية كبيرة الحجم وآخر للحاويات، والتي لها Client خصائص من النوع BlobBaseClientوBlobContainerClient، على التوالي.

يبدو الهيكل العام للأكمام للكائنات الثنائية كبيرة الحجم كما يلي:

    BlobBaseClient Client { get; }
    BlobServiceClient Service { get; }
    StorageClientProviderContext Context { get; }

الخاصية Service على الأكمام هو راحة. تتطلب بعض العمليات النهائية المتعلقة بأداة الترميز التي تستخدم فئة SDK BlobServiceClient مفاتيح حساب التخزين. أدى هذا المطلب إلى إضافة مثيل عميل خدمة إلى نوعي الأكمام الحاليين، بدلا من إنتاج موفر منفصل.

استخدام الأكمام

يوزع موفرو تخزين العميل مثيلات الأكمام. تبدو التعليمات البرمجية لخدمة التخزين مشابهة لتسلسل التعليمات البرمجية التوضيحية التالي، مع كتابة الأنواع للوضوح:

    public bool DeleteBlob(Uri sourceUri, StorageClientProviderContext context)
    {
        . . .
        StorageBlobClientSleeve sleeve = _blobBaseClientProvider.GetBlobBaseClientForUri(sourceUri, context); // Line A
        BlobProperties propsIncludingMetadata = sleeve.Client.GetProperties(); // Line B
        sleeve.Context.TrackingETag = true;   // Send ETag from GetProperties()
        var wasDeleted = sleeve.Client.DeleteBlob(); // Line C
        sleeve.Context.TrackingETag = false;
        var someResult = sleeve.Client.AnotherOperation(); // Line D
        . . .
    }
  1. يملأ Gridwich سياق العملية تلقائيا في سياق الأكمام في السطر A. TrackingETag افتراضيات إلى خطأ.
  2. بعد السطر B، sleeve.Context يحتوي على ETag من السطر A ويحتفظ بنفس ClientRequestID القيمة.
  3. يرسل السطر C قيمة ETag من السطر B و ClientRequestId.
  4. بعد السطر C، يكون للسياق قيمة ETag جديدة، كما تم إرجاعها في الرد Delete().
  5. لا يرسل السطرD قيمة ETag على طلب AnotherOperation().
  6. بعد السطر D، يكون للسياق قيمة ETag جديدة، كما تم إرجاعها في الرد AnotherOperation().

يتم تعيين خدمة التخزين حاليا كما هو الحال Transient في تكوين حقن التبعية، ما يعني أن التخزين المؤقت المستند إلى الأكمام على أساس كل طلب. راجع خدمة التخزين وحقن التبعية لمزيد من المعلومات.

بدائل خدمة التخزين

تصف الأقسام التالية الأساليب البديلة التي ليست جزءاً من حل تخزين Gridwich الحالي.

فئة Gridwich AzureStorageManagement

بالاقتران مع عضو الأكمامService، وهو مثيل لفئة Azure SDK BlobServiceClient، يحتوي Gridwich أيضا على فئة AzureStorageManagement. تستخدم طريقة خدمة التخزين GetConnectionStringForAccount وطريقة ترميز Telerek GetStoreByNameAsync تلك الفئة للحصول على مفاتيح حساب التخزين. تستند الفئة حاليا إلى إطار عمل سهل. يجب أن تحل الإضافات إلى فئة SDK BlobServiceClient في النهاية محل هذه الفئة، ما يسمح باسترجاع معلومات أكثر تركيزا من التنوع الواسع في واجهة Fluent IAzure.

إخفاء نهج البنية الأساسية لبرنامج ربط العمليات التجارية عبر التصنيف الفرعي

يضيف التصنيف الفرعي أنواع عميل SDK خاصيتين بسيطتين إلى العميل، واحدة لكل قيمة رأس HTTP، لإخفاء التفاعل تماما مع نهج البنية الأساسية لبرنامج ربط العمليات التجارية. ولكن نظرًا لوجود خلل عميق في Moq، لا يمكن إنشاء اختبارات الوحدة عبر mock لهذه الأنواع المشتقة. يستخدم Gridwich Moq، لذلك لم يستخدم نهج التصنيف الفرعي هذا.

يتعلق خطأ Moq بسوء التعامل مع التصنيف الفرعي عبر التجميع في وجود وظائف ظاهرية داخلية النطاق. تستخدم فئات عميل SDK الوظائف الظاهرية ذات النطاق الداخلي التي تتضمن أنواع النطاق الداخلي غير المرئية للمستخدمين الخارجيين العاديين. عندما يحاول موك إنشاء mock من الفئة الفرعية، والتي توجد في إحدى تجميعات Gridwich، فإنه يفشل في وقت تنفيذ الاختبار لأنه لا يستطيع العثور على الظواهر ذات النطاق الداخلي في فئات عملاء SDK التي يتم اشتقاق فئات Gridwich منها. لا يوجد حل بديل دون تغييرات في جيل وكيل قلعة موك.

خدمة التخزين وحقن التبعية

تقوم Gridwich حاليًا بتسجيل خدمة التخزين كخدمة Transient لحقن التبعية. أي أنه في كل مرة يطلب فيها إدخال التبعية للخدمة، فإنه ينشئ مثيلا جديدا. يجب أن يعمل الرمز الحالي أيضًا بشكل صحيح إذا تغير التسجيل إلى Scoped، مما يعني حالة واحدة لكل طلب، على سبيل المثال طلب النظام الخارجي.

ومع ذلك، ستكون هناك مشكلات إذا تغير التسجيل إلى Singleton، مثيل واحد عبر تطبيق وظيفة Gridwich. لن تميز آلية التخزين المؤقت Gridwich للأكمام ونطاقات بايت البيانات بين الطلبات المختلفة. أيضاً، نموذج ذاكرة التخزين المؤقت ليس نموذج سحب، لذلك لا يزيل Gridwich المثيل من ذاكرة التخزين المؤقت أثناء استخدامه. نظرا لأن فئات عميل SDK غير مضمونة لتكون آمنة للمترابط، فإن التنسيق يتطلب العديد من التغييرات.

لهذه الأسباب، لا تقم بتغيير خدمة تخزين Gridwich، كما هي، إلى Singleton تسجيل حقن التبعية. يتبع Gridwich هذه القاعدة في تسجيل إدخال التبعية ويتضمن اختبار وحدة، CheckThatStorageServiceIsNotASingleton، لفرضه.

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

وثائق المنتج:

وحدات Microsoft Learn: