توفر خدمة تخزين 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، وكيفية ارتباط المثيلات ببعضها البعض. تشير الأسهم إلى "يحتوي على مرجع إلى."
نهج البنية الأساسية لبرنامج ربط العمليات التجارية
يمكنك تعيين الوصلة لمعالجة رؤوس 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 كإدخال لمهمة ترميز. لا يهتم النظام الخارجي بهذه التفاصيل، ولكن فقط حول حالة مهمة الترميز ومكان استرداد المخرجات المشفرة. لعكس هذه المخاوف، أداة الترميز:
ينشئ سياق تخزين غير كتم الصوت استنادا إلى سياق عملية الطلب، على سبيل المثال
ctxNotMuted
.إنشاء سياق تخزين كتم الصوت، على سبيل المثال
ctxMuted
، إما باستخدام منشئ نسخ فئة السياق أو إنشاء مثيل جديد. سيكون لأي من الخيارين نفس قيمة سياق العملية.ctxMuted
يحدد عمليات التخزين المتضمنة في إعداد الترميز. لا يرى النظام الخارجي أي إشارة إلى حدوث هذه العمليات.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
للمثال السابق:
- أرسل طلب الحصول على بيانات التعريف مع فارغ
ETag
. - حفظ
ETag
القيمة من الرد. - أضف القيمة المحفوظة
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
. . .
}
- يملأ Gridwich سياق العملية تلقائيا في سياق الأكمام في السطر A.
TrackingETag
افتراضيات إلى خطأ. - بعد السطر B،
sleeve.Context
يحتوي علىETag
من السطر A ويحتفظ بنفسClientRequestID
القيمة. - يرسل السطر C قيمة
ETag
من السطر B وClientRequestId
. - بعد السطر C، يكون للسياق قيمة
ETag
جديدة، كما تم إرجاعها في الردDelete()
. - لا يرسل السطرD قيمة
ETag
على طلبAnotherOperation()
. - بعد السطر 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: