توزيع بدون تعطل للحصول على الدوالّ الدائمة

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

لمنع حدوث هذه الإخفاقات، لديك خياران:

  • تأخير التوزيع حتى يتم إكمال كافة مثيلات التنسيق الجارية.
  • تأكد من أن استخدام مثيلات التنسيق الجارية للإصدارات الموجودة من الدالات.

يقارن المخطط التالي الاستراتيجيات الرئيسية الثلاث لتحقيق توزيع بدون تعطل للدالات الدائمة:

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

ويصف باقي هذه الوثيقة هذه الاستراتيجيات بمزيد من التفصيل.

إشعار

تفترض أوصاف استراتيجيات التوزيع بدون تعطل استخدام موفر Azure Storage الافتراضي للدالات الدائمة. قد لا تكون الإرشادات مناسبة إذا كنت تستخدم موفر تخزين غير موفر Azure Storage الافتراضي. لمزيد من المعلومات حول خيارات موفر التخزين المختلفة وكيفية مقارنتها، راجع وثائق Durable Functions storage providers.

تعيين الإصدار

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

Versioning strategy

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

إشعار

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

التحقق من الحالة باستخدام الفتحة

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

تكوين تطبيق الوظائف

استخدم الإجراء التالي لإعداد هذا السيناريو.

  1. Add deployment slots إلى تطبيق الوظائف لتنظيم الإنتاج.

  2. لكل فتحة، قم بتعيين AzureWebJobsStorage application setting إلى سلسلة الاتصال لحساب تخزين مشترك. يتم استخدام سلسلة اتصال حساب التخزين هذه من قبل وقت تشغيل Azure Functions لتخزين functions' access keysبشكل آمن.

  3. لكل فتحة، قم بإنشاء إعداد تطبيق جديد، على سبيل المثال، DurableManagementStorage. تعيين قيمته إلى سلسلة الاتصال لحسابات تخزين مختلفة. يتم استخدام حسابات التخزين هذه من قبل ملحق الدوال الدائمة reliable execution. استخدم حساب تخزين منفصل لكل فتحة. لا تضع علامة على هذا الإعداد كإعداد فتحة توزيع.

  4. في تطبيق الوظائف host.json file's durableTask section، حدد connectionStringName (Durable 2.x) أو azureStorageConnectionStringName (Durable 1.x) كاسم لإعداد التطبيق الذي قمت بإنشائه في الخطوة 3.

يوضح المخطط التالي التكوين الموضح لفتحات التوزيع وحسابات التخزين. في سيناريو ما قبل التوزيع المحتمل هذا، يتم تشغيل الإصدار 2 من تطبيق الوظائف في فتحة الإنتاج، بينما يظل الإصدار 1 في فتحة التقسيم المرحلي.

Deployment slots and storage accounts

أمثلة على host.json

أجزاء JSON التالية عبارة عن أمثلة لإعداد سلسلة الاتصال في ملف host.js.

الدوال 2.0

{
  "version": 2.0,
  "extensions": {
    "durableTask": {
      "hubName": "MyTaskHub",
      "storageProvider": {
        "connectionStringName": "DurableManagementStorage"
      }
    }
  }
}

دالات 1.x

{
  "durableTask": {
    "azureStorageConnectionStringName": "DurableManagementStorage"
  }
}

تكوين مسار CI/CD

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

[FunctionName("StatusCheck")]
public static async Task<IActionResult> StatusCheck(
    [HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequestMessage req,
    [DurableClient] IDurableOrchestrationClient client,
    ILogger log)
{
    var runtimeStatus = new List<OrchestrationRuntimeStatus>();

    runtimeStatus.Add(OrchestrationRuntimeStatus.Pending);
    runtimeStatus.Add(OrchestrationRuntimeStatus.Running);

    var result = await client.ListInstancesAsync(new OrchestrationStatusQueryCondition() { RuntimeStatus = runtimeStatus }, CancellationToken.None);
    return (ActionResult)new OkObjectResult(new { HasRunning = result.DurableOrchestrationState.Any() });
}

بعد ذلك، تكوين بوابة التقسيم المرحلي بغية الانتظار حتى وقت عدم تشغيل التنسيقات. لمزيد من المعلومات، راجع Release deployment control using gates

Deployment gate

يتحقق Azure Pipelines من تطبيق الوظائف لتشغيل مثيلات التنسيق قبل بدء التوزيع.

Deployment gate (running)

الآن يجب نشر الإصدار الجديد من تطبيق الوظائف إلى فتحة التقسيم المرحلي.

Staging slot

وأخيراً، فتحات التبديل.

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

Deployment slot

لاستخدام حساب التخزين نفسه لكلا الفتحتين، يمكنك تغيير أسماء مراكز المهام. في هذه الحالة، تحتاج إلى إدارة حالة الفتحات وإعدادات تطبيق HubName. لمعرفة المزيد، راجع Task hubs in Durable Functions.

توجيه استمارة التقديم

وهذه الاستراتيجية هي الأكثر تعقيداً. ومع ذلك، يمكن استخدامه لتطبيقات الوظائف التي ليس لديها وقت بين التنسيقات الجارية.

بالنسبة لهذه الاستراتيجية، يجب إنشاء جهاز توجيه تطبيق أمام الدوال الدائمة. يمكن تطبيق هذا الموجه مع الدوال الدائمة. يتولى جهاز التوجيه مسؤولية ما يلي:

  • وزّع تطبيق الوظيفة
  • إدارة إصدار الدوال الدائمة.
  • توجيه طلبات التنسيق إلى تطبيقات الوظائف.

في المرة الأولى التي يتم فيها تلقي طلب تنسيق، يقوم الموجه بالمهام التالية:

  1. إنشاء تطبيق وظائف جديد في Azure.
  2. توزيع تعليمات تطبيق الوظائف البرمجية إلى تطبيق الوظائف الجديد في Azure.
  3. إعادة توجيه طلب التنسيق إلى التطبيق الجديد.

يدير الموجه حالة إصدار التعليمات البرمجية للتطبيق الذي يتم توزيعه على تطبيق الوظائف في Azure.

Application routing (first time)

يوجه جهاز التوجيه طلبات التوزيع والتنسيق إلى تطبيق الوظائف المناسب استناداً إلى الإصدار المرسل مع الطلب. يتجاهل إصدار التصحيح.

عند توزيع إصدار جديد من التطبيق دون تغيير طارئ، يمكنك زيادة إصدار التصحيح. يقوم جهاز التوجيه بتوزيع تطبيق الوظائف الموجود ويرسل طلبات للإصدارات القديمة والجديدة من التعليمات البرمجية، والتي يتم توجيهها إلى تطبيق الوظائف نفسه.

Application routing (no breaking change)

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

Application routing (breaking change)

يراقب جهاز التوجيه حالة التنسيقات على إصدار 1.0.1 ويزيل التطبيقات بعد الانتهاء من جميع التنسيقات.

تتبع إعدادات التخزين

يجب أن يستخدم كل تطبيق وظائف قوائم انتظار مجدولة منفصلة، وربما يكون ذلك في حسابات تخزين منفصلة. إذا كنت تود الاستعلام عن كافة مثيلات التنسيق عبر كافة إصدارات التطبيق، يمكنك مشاركة مثيل وجداول المحفوظات عبر تطبيقات الوظائف. يمكنك مشاركة الجداول عن طريق تكوين إعدادات trackingStoreConnectionStringNameو trackingStoreNamePrefix في ملف host.json settings بحيث تستخدم جميعًا القيم نفسها.

لمزيد من المعلومات، راجع Manage instances in Durable Functions in Azure.

Tracking store settings

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