موفري تخزين Durable Functions

Durable Functions هي مجموعة من مشغلات وروابط Azure Functions المّشغّلة داخليًا بواسطة Durable Task Framework (DTFx). يدعم DTFx موفري تخزين بالخلفية متعددين، بما في ذلك موفر Azure Storage المستخدم بواسطة Durable Functions. بدءًا من Durable Functions v2.5.0، يمكن للمستخدمين تكوين تطبيقات الدوال لاستخدام موفري التخزين DTFx بخلاف موفر Azure Storage.

إشعار

بالنسبة للعديد من تطبيقات الوظائف، من المحتمل أن يكون موفر Azure Storage الافتراضي ل Durable Functions كافيًا، وهو الأسهل في الاستخدام لأنه لا يتطلب تكوينًا إضافيًا. ومع ذلك، هناك مفاضلات التكلفة وقابلية التوسع وإدارة البيانات التي قد تفضل استخدام موفر تخزين بديل.

تم تطوير موفري تخزين بديلين للاستخدام مع Durable Functions وDurable Task Framework هما موفر التخزين Netherite وموفر التخزين Microsoft SQL Server (MSSQL). توضح هذه المقالة جميع الموفرين الثلاثة المدعومين، وتقارنهم ببعضهم البعض وتوفر معلومات أساسية حول كيفية بدء استخدامهم.

إشعار

أنه لا يمكن حاليًا ترحيل البيانات من موفر تخزين واحد إلى آخر. إذا كنت ترغب في استخدام موفر تخزين جديد، يجب إنشاء تطبيق جديد تم تكوينه باستخدام موفر التخزين الجديد.

تخزين Azure

Azure Storage هو موفر التخزين الافتراضي لـ Durable Functions. ويستخدم قوائم الانتظار والجداول والكائنات الثنائية كبيرة الحجم لاستمرار التنسيق وحالة الكيان. كما أنه يستخدم الكائنات الثنائية كبيرة الحجم وعقود إيجار الكائنات الثنائية كبيرة الحجم لإدارة الأقسام. في كثير من الحالات، يكون حساب التخزين المستخدم لتخزين حالة وقت تشغيل Durable Functions هو نفس حساب التخزين الافتراضي المستخدم من قبل Azure Functions (AzureWebJobsStorage). ومع ذلك، من الممكن أيضًا تكوين Azure Functions باستخدام حساب تخزين منفصل. موفر Azure Storage مضمّن في ملحق Durable Functions وليس لديه أي تبعيات أخرى.

تشمل الفوائد الرئيسية لموفر Azure Storage:

  • لا يلزم الإعداد - يمكنك استخدام حساب التخزين الذي تم إنشاؤه لك من خلال تجربة إعداد تطبيق الدالة.
  • نموذج الفوترة بلا خادم بأقل تكلفة - يحتوي Azure Storage على نموذج تسعير على أساس الاستهلاك يستند بالكامل إلى الاستخدام (مزيد من المعلومات).
  • أفضل دعم أدوات - يوفر Azure Storage محاكاة محلية عبر النظام الأساسي ويتكامل مع Visual Studio وVisual Studio Code وAzure Functions Core Tools.
  • الأكثر تطورًا - Azure Storage كان خلفية التخزين الأصلية والأكثر اختبارًا في المشكلات لـ Durable Functions.
  • دعم استخدام الهوية بدلا من الأسرار للاتصال بموفر التخزين.

يمكن العثور على التعليمات البرمجية المصدر لمكونات DTFx لموفر تخزين Azure Storage في مستودع GitHub Azure/durabletask.

إشعار

يلزم توفر حسابات Azure Storage للأغراض العامة القياسية عند استخدام موفر Azure Storage. جميع أنواع حسابات التخزين الأخرى غير مدعومة. نوصي بشدة باستخدام حسابات تخزين الأغراض العامة القديمة v1 لأن حسابات التخزين v2 الأحدث يمكن أن تكون أكثر تكلفة بكثير لأحمال عمل Durable Functions. لمزيد من المعلومات حول أنواع حسابات التخزين في Azure، راجع وثائق نظرة عامة على حساب التخزين.

Netherite

تم تصميم خلفية تخزين Netherite وتطويرها من قبل Microsoft Research. حيث تستخدم Azure Event Hubs وتكنولوجيا قاعدة بيانات FASTER على رأس Azure Page Blobs. يتيح تصميم Netherite معالجة ذات معدل نقل أعلى بكثير لعمليات التنسيق والكيانات مقارنة بالموفرين الآخرين. في بعض السيناريوهات القياسية، شهد معدل النقل زيادة كبيرة من حيث ترتيب الحجم عند مقارنته بموفر Azure Storage الافتراضي.

تشمل الفوائد الرئيسية لموفر تخزين Netherite:

  • معدل نقل أعلى بكثير بتكلفة أقل مقارنة بموفري التخزين الآخرين.
  • يدعم تحسين أداء الأسعار، مما يسمح لك بتعزيز الأداء حسب الحاجة.
  • يدعم ما يصل إلى 32 قسم بيانات باستخدام مراكز الأحداث الأساسية ووحدات حفظ المخزون القياسية.
  • أكثر فعالية من حيث التكلفة من الموفرين الآخرين لأحمال العمل ذات معدل النقل العالي.

يمكنك معرفة المزيد حول التفاصيل الفنية لموفر تخزين Netherite، بما في ذلك كيفية البدء في استخدامه، في وثائق Netherite. يمكن العثور على التعليمات البرمجية المصدر لموفر تخزين Netherite في مستودع GitHub microsoft/durabletask-netherite. يتوفر أيضًا تقييمًا أكثر تعمقا لموفر تخزين Netherite في ورقة البحث التالية: عمليات سير العمل بلا خادم مع Durable Functions وNetherite.

إشعار

ينشأ اسم Netherite من عالم Minecraft.

Microsoft SQL Server (MSSQL)

يحتفظ موفر التخزين Microsoft SQL Server (MSSQL) بجميع الحالات في قاعدة بيانات Microsoft SQL Server. وهو يتوافق مع عمليات التوزيع المحلية والمستضافة على السحابة في SQL Server، بما في ذلك Azure SQL Database.

تشمل الفوائد الرئيسية لموفر تخزين MSSQL:

  • يدعم البيئات غير المتصلة - لا يلزم اتصال Azure عند استخدام تثبيت SQL Server.
  • محمول عبر بيئات وسحب متعددة، بما في ذلك المحلية المستضافة على Azure.
  • تناسق قوي للبيانات، مما يتيح النسخ الاحتياطي/الاستعادة و تجاوز الفشل بدون فقدان للبيانات.
  • دعم أصلي لتشفير البيانات المخصصة (ميزة SQL Server).
  • يتكامل مع تطبيقات قاعدة البيانات الموجودة عبر إجراءات مخزنة مضمنة.

يمكنك معرفة المزيد حول التفاصيل الفنية لموفر تخزين Azure، بما في ذلك كيفية البدء في استخدامه، في وثائق موفر Microsoft SQL. يمكن العثور على التعليمات البرمجية المصدر لموفر تخزين MSSQL في مستودع GitHub microsoft/durabletask-mssql.

تكوين موفري التخزين البديلة

تكوين موفري التخزين البديلة هي عملية مكونة من خطوتين بشكل عام:

  1. أضف حزمة NuGet المناسبة إلى تطبيق الدوال لديك (هذا المتطلب مؤقت للتطبيقات التي تستخدم حزم الملحقات).
  2. حدّث ملف host.json الملف لتحديد موفر التخزين الذي تريد استخدامه.

إذا لم يتم تكوين موفر تخزين بشكل صريح في host.json، سيتم تمكين موفر Azure Storage بشكل افتراضي.

تكوين موفر تخزين Azure

موفر Azure Storage هو موفر التخزين الافتراضي ولا يتطلب أي تكوين صريح أو مراجع حزمة NuGet أو مراجع حزمة ملحقة. يمكنك العثور على مجموعة كاملة من خيارات تكوين host.json هنا، تحت المسار extensions/durableTask/storageProvider.

الاتصالات

الخاصية connectionName في host.json تعد مرجعًا لتكوين البيئة التي تحدد كيفية اتصال التطبيق بتخزين Azure. ويجوز لها أن تحدد ما يلي:

إذا كانت القيمة المكونة مطابقة بدقة لإعداد واحد ومطابقة لبادئة للإعدادات الأخرى، يتم استخدام المطابقة الدقيقة. إذا لم يتم تحديد أي قيمة في host.json، فإن القيمة الافتراضية هي "AzureWebJobsStorage".

الاتصالات القائمة على الهوية

إذا كنت تستخدم الإصدار 2.7.0 أو أعلى من الملحق وموفر تخزين Azure، فبدلا من استخدام سلسلة الاتصال مع سر، يمكنك أن يكون التطبيق يستخدم هوية Microsoft Entra. للقيام بذلك، يمكنك تحديد الإعدادات تحت بادئة مشتركة والتي تقوم بالتعيين إلى خاصية connectionName في تكوين المشغل والربط.

لاستخدام الاتصال المستند إلى الهوية لـ Durable Functions، قم بتكوين إعدادات التطبيق التالية:

الخاصية قالب متغير البيئة ‏‏الوصف مثال للقيمة
خدمة عنوان موقع الويب للكائن الثنائي كبير الحجم <CONNECTION_NAME_PREFIX>__blobServiceUri عنوان موقع الويب لوحدة البيانات لخدمة كائن ثنائي كبير الحجم من حساب التخزين. https://<storage_account_name>.blob.core.windows.net
عنوان موقع الويب لخدمة قائمة الانتظار <CONNECTION_NAME_PREFIX>__queueServiceUri عنوان موقع الويب (URI) لوحدة البيانات لخدمة قائمة الانتظار من حساب التخزين. https://<storage_account_name>.queue.core.windows.net
عنوان موقع الويب لخدمة الجدول <CONNECTION_NAME_PREFIX>__tableServiceUri عنوان موقع الويب (URI) لوحدة البيانات لخدمة جداول من حساب التخزين. https://<storage_account_name>.table.core.windows.net

قد يتم تعيين خصائص إضافية لتخصيص الاتصال. راجع الخصائص الشائعة للاتصالات المعتمدة على الهوية.

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

منح الإذن للهوية

مهما كانت الهوية المستخدمة يجب أن يكون لديك أذونات لتنفيذ الإجراءات المقصودة. بالنسبة لمعظم خدمات Azure، يعني هذا أنك بحاجة إلى تعيين دور في Azure RBAC، باستخدام أدوار مضمنة أو مخصصة توفر هذه الأذونات.

هام

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

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

قد يتطلب طلبك المزيد من الأذونات بناءً على الرمز الذي تكتبه. إذا كنت تستخدم السلوك الافتراضي أو تقوم بإعداد connectionName بشكل صريح إلى "AzureWebJobsStorage "، فراجع الاتصال بتخزين المضيف مع هوية لاعتبارات التصريح الأخرى.

تكوين موفر تخزين Netherite

يتطلب تمكين موفر تخزين Netherite تغيير التكوين في .host.json بالنسبة لمستخدمي C#، يتطلب أيضا خطوة تثبيت إضافية.

host.json تكوين

يعرض مثال host.json التالي الحد الأدنى من التكوين المطلوب لتمكين موفر التخزين Netherite.

{
  "version": "2.0",
  "extensions": {
    "durableTask": {
      "storageProvider": {
        "type": "Netherite",
        "storageConnectionName": "AzureWebJobsStorage",
        "eventHubsConnectionName": "EventHubsConnection"
      }
    }
  }
}

للحصول على إرشادات إعداد أكثر تفصيلاً، راجع وثائق بدء استخدام Netherite.

تثبيت ملحق Netherite (.NET فقط)

إشعار

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

ستحتاج إلى تثبيت أحدث إصدار من ملحق Netherite على NuGet. وهذا يعني عادة تضمين إشارة إليه في ملفك .csproj وإنشاء المشروع.

تعتمد حزمة الملحق المراد تثبيتها على عامل .NET الذي تستخدمه:

تكوين موفر تخزين MSSQL

يتطلب تمكين موفر تخزين MSSQL تغيير التكوين في .host.json بالنسبة لمستخدمي C#، يتطلب أيضا خطوة تثبيت إضافية.

host.json تكوين

يعرض المثال التالي الحد الأدنى من التكوين المطلوب لتمكين موفر التخزين MSSQL.

{
  "version": "2.0",
  "extensions": {
    "durableTask": {
      "storageProvider": {
        "type": "mssql",
        "connectionStringName": "SQLDB_Connection"
      }
    }
  }
}

للحصول على إرشادات إعداد أكثر تفصيلاً، راجع وثائق بدء استخدام موفر MSSQL.

تثبيت ملحق Durable Task MSSQL (.NET فقط)

إشعار

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

ستحتاج إلى تثبيت أحدث إصدار من ملحق موفر تخزين MSSQL على NuGet. وهذا يعني عادة تضمين إشارة إليه في ملفك .csproj وإنشاء المشروع.

تعتمد حزمة الملحق المراد تثبيتها على عامل .NET الذي تستخدمه:

مقارنة موفري التخزين

هناك العديد من المفاضلات الهامة بين مختلف موفري التخزين المدعومين. يمكن استخدام الجدول التالي لمساعدتك على فهم هذه المفاضلات وتحديد موفر التخزين الأفضل لاحتياجاتك.

موفر التخزين تخزين Azure Netherite MSSQL
حالة الدعم الرسمية ✅ متوفرة بشكل عام (GA) ✅ متوفرة بشكل عام (GA) ✅ متوفرة بشكل عام (GA)
التبعيات الخارجية حساب تخزين Azure (للأغراض العامة v1) مراكز أحداث Azure
حساب تخزين Azure (للأغراض العامة)
SQL Server 2019 أو Azure SQL Database
خيارات التطوير والمحاكاة المحلية Azurite v3.12+ (عبر نظام أساسي) يدعم المحاكاة داخل الذاكرة لمراكز المهام (مزيد من المعلومات) SQL Server Developer Edition (يدعم حاويات Windows وLinux وDocker)
تكوين مركز المهام واضح واضح ضمني بشكل افتراضي (مزيد من المعلومات)
الحد الأقصى لمعدل النقل متوسط مرتفع جدًا متوسط
الحد الأقصى لتوسيع نطاق التنسيق/الكيان (العقد) 16 32 ‏‫غير متوفر‬
الحد الأقصى لتوسيع نطاق النشاط (العقد) ‏‫غير متوفر‬ 32 ‏‫غير متوفر‬
دعم الكيانات الدائمة ✅ مدعوم بالكامل ✅ مدعوم بالكامل ⚠️ معتمدة إلا عند استخدام .NET Isolated
دعم تحجيم KEDA 2.0
(مزيد من المعلومات)
❌ غير مدعوم ❌ غير مدعوم ✅ مدعوم باستخدام مقياس MSSQL (مزيد من المعلومات)
دعم حزم الملحقات (يوصى بها لغير تطبيقات NET.) ✅ مدعوم بالكامل ✅ مدعوم بالكامل ✅ مدعوم بالكامل
هل أداء السعر قابل للتكوين؟ ❌ لا ✅ نعم (وحدات TUs وCUs لمراكز الأحداث) ✅نعم (SQL vCPUs)
دعم البيئة غير المتصلة ❌ اتصال Azure مطلوب ❌ اتصال Azure مطلوب ✅ مدعوم بالكامل
الاتصالات القائمة على الهوية ✅ مدعوم بالكامل ❌ غير مدعوم يتطلب ⚠تحجيم يستند إلى وقت التشغيل
خطة استهلاك Flex ✅ معتمد بالكامل (راجع الملاحظات) ❌ غير مدعوم ❌ غير مدعوم

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