تكلفة نقل الخدمة

أحد العوامل التي تأخذها Service Fabric Cluster Resource Manager بعين الاعتبار عند محاولة تحديد التغييرات التي يجب إجراؤها على نظام المجموعة هو تكلفة هذه التغييرات. وتتم المفاضلة بين فكرة "التكلفة" مقابل مقدار تحسن نظام المجموعة. يتم أخذ التكلفة في الاعتبار عند نقل الخدمات للتوازن وإلغاء التجزئة والمتطلبات الأخرى. الهدف هو تلبية المتطلبات بأقل قدر من التعطيل أو التكلفة.

يكلف نقل الخدمات وقت وحدة المعالجة المركزية (CPU) والنطاق الترددي للشبكة كحد أدنى. بالنسبة إلى الخدمات ذات الحالة، فإنها تتطلب نسخ حالة تلك الخدمات؛ ما يستهلك ذاكرة وقرصاً إضافيين. يساعد تقليل تكلفة الحلول التي يتوصل إليها Azure Service Fabric Cluster Resource Manager على ضمان عدم إنفاق موارد نظام المجموعة دون داعٍ. ومع ذلك، لا تريد أيضاً تجاهل الحلول التي من شأنها تحسين تخصيص الموارد في نظام المجموعة بشكل كبير.

يحتوي Resource Manager Cluster على طريقتين لحساب التكاليف والحد منها أثناء محاولته إدارة نظام المجموعة. الآلية الأولى هي ببساطة حساب كل تحرك يجريه. إذا تم إنشاء حلين بنفس الرصيد (النتيجة) تقريباً، فإن Cluster Resource Manager يفضل الحل الأقل تكلفة (إجمالي عدد التحركات).

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

إعداد تكاليف النقل

يمكنك تحديد تكلفة النقل الافتراضية لخدمة عند إنشائها:

PowerShell:

New-ServiceFabricService -ApplicationName $applicationName -ServiceName $serviceName -ServiceTypeName $serviceTypeName –Stateful -MinReplicaSetSize 3 -TargetReplicaSetSize 3 -PartitionSchemeSingleton -DefaultMoveCost Medium

C#‎:

FabricClient fabricClient = new FabricClient();
StatefulServiceDescription serviceDescription = new StatefulServiceDescription();
//set up the rest of the ServiceDescription
serviceDescription.DefaultMoveCost = MoveCost.Medium;
await fabricClient.ServiceManager.CreateServiceAsync(serviceDescription);

يمكنك أيضاً تحديد MoveCost أو تحديثه ديناميكياً لخدمة بعد إنشائها:

PowerShell:

Update-ServiceFabricService -Stateful -ServiceName "fabric:/AppName/ServiceName" -DefaultMoveCost High

C#‎:

StatefulServiceUpdateDescription updateDescription = new StatefulServiceUpdateDescription();
updateDescription.DefaultMoveCost = MoveCost.High;
await fabricClient.ServiceManager.UpdateServiceAsync(new Uri("fabric:/AppName/ServiceName"), updateDescription);

تحديد تكلفة النقل ديناميكياً على أساس كل نسخة متماثلة

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

C#‎:

this.Partition.ReportMoveCost(MoveCost.Medium);

ملاحظة

يمكنك فقط تعيين تكلفة الحركة للنسخ المتماثلة الثانوية من خلال التعليمات البرمجية.

الإبلاغ عن تكلفة النقل لقسم

يوضح القسم السابق كيفية قيام النسخ المتماثلة للخدمة أو مثيلات الخدمة بالإبلاغ عن MoveCost لنفسها. لقد قدمنا واجهة برمجة تطبيقات Service Fabric للإبلاغ عن قيم MoveCost نيابة عن الأقسام الأخرى. في بعض الأحيان، لا يمكن للنسخة المتماثلة للخدمة أو مثيل الخدمة تحديد أفضل قيمة MoveCost بمفردها، ويجب أن تعتمد على منطق الخدمات الأخرى. يتيح لك الإبلاغ عن MoveCost نيابة عن الأقسام الأخرى، إلى جانب الإبلاغ عن الحمل نيابة عن الأقسام الأخرى، إدارة الأقسام بالكامل من الخارج. تلغي واجهات برمجة التطبيقات هذه احتياجات نمط Sidecar، من منظور Cluster Resource Manager.

يمكنك الإبلاغ عن تحديثات MoveCost لقسم مختلف بنفس استدعاء واجهة برمجة التطبيقات. تحتاج إلى تحديد عنصر PartitionMoveCostDescription لكل قسم تريد تحديثه بقيم جديدة من MoveCost. تسمح واجهة برمجة التطبيقات بطرق متعددة لتحديث MoveCost:

  • يمكن لقسم خدمة ذات حالة تحديث MoveCost للنسخة المتماثلة الأساسية.
  • يمكن لكل من الخدمات عديمة الحالة والخدمات ذات الحالة تحديث MoveCost لجميع النسخ المتماثلة الثانوية أو المثيلات.
  • يمكن لكل من الخدمات عديمة الحالة والخدمات ذات الحالة تحديث MoveCost لنسخة متماثلة محددة أو مثيل محدد على عقدة.

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

  • PartitionNotFound - معرّف القسم المحدد غير موجود.
  • ReconfigurationPending - القسم قيد إعادة التكوين حالياً.
  • InvalidForStatelessServices - تم إجراء محاولة لتغيير MoveCost لنسخة متماثلة أساسية لقسم ينتمي إلى خدمة عديمة الحالة.
  • ReplicaDoesNotExist - النسخة المتماثلة الثانوية أو المثيل غير موجود على عقدة محددة.
  • InvalidOperation - تحديث MoveCost لقسم ينتمي إلى تطبيق النظام.

C#‎:

Guid partitionId = Guid.Parse("53df3d7f-5471-403b-b736-bde6ad584f42");
string nodeName0 = "NodeName0";

OperationResult<UpdatePartitionMoveCostResultList> updatePartitionMoveCostResults =
    await this.FabricClient.UpdatePartitionMoveCostAsync(
        new UpdatePartitionMoveCostQueryDescription
        {
            new List<PartitionMoveCostDescription>()
            {
                new PartitionMoveCostDescription(
                    partitionId,
                    MoveCost.VeryHigh,
                    MoveCost.Zero,
                    new List<ReplicaMoveCostDescription>()
                    {
                        new ReplicaMoveCostDescription(nodeName0, MoveCost.Medium)
                    })
            }
        },
        this.Timeout,
        cancellationToken);

باستخدام هذا المثال، ستقوم بإجراء تحديث لآخر نقل تم الإبلاغ عنه لقسم 53df3d7f-5471-403b-b736-bde6ad584f42. ستكون تكلفة نقل النسخة المتماثلة الأساسية VeryHigh. ستكون تكلفة نقل جميع النسخ المتماثلة الثانوية Zero، باستثناء تكلفة النقل لنسخة متماثلة ثانوية محددة موجودة في العقدة NodeName0. ستكون تكلفة النقل لنسخة متماثلة معينة Medium. إذا كنت ترغب في تخطي تكلفة نقل تحديث النسخة المتماثلة الأساسية أو كافة النسخ المتماثلة الثانوية، فيمكنك ترك الإدخال المقابل فارغاً.

تأثير تكلفة النقل

يحتوي MoveCost على خمسة مستويات: Zero، وLow، وMedium، وHigh، وVeryHigh. تطبق القواعد التالية:

  • تكون مستويات MoveCosts نسبية لبعضها البعض، باستثناء Zero وVeryHigh.
  • تعني تكلفة النقل Zero أن الحركة مجانية ويجب ألا تُحتسب ضمن نتيجة الحل.
  • لا يوفر تعيين تكلفة النقل إلى High أو VeryHigh ضماناً بعدم نقل النسخة المتماثلة أبداً.
  • سيتم نقل النسخ المتماثلة ذات تكلفة النقل VeryHigh فقط إذا كان هناك خرق قيد في نظام المجموعة لا يمكن إصلاحه بأي طريقة أخرى (حتى إذا كان يتطلب نقل العديد من النسخ المتماثلة الأخرى لإصلاح الخرق)

نقل التكلفة كعامل في تحديد النسخ المتماثلة للحركة

تساعدك MoveCost في العثور على الحلول التي تسبب أقل قدر من الاضطراب بشكل عام ويسهل تحقيقها مع الاستمرار في الوصول إلى رصيد مكافئ. يمكن أن تكون فكرة تكلفة الخدمة مرتبطة بأشياء كثيرة. العوامل الأكثر شيوعاً في حساب تكلفة النقل هي:

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

هام

يجب النظر بعناية في استخدام تكلفة النقل VeryHigh؛ لأنها تحد بشكل كبير من قدرة Cluster Resource Manager على إيجاد حل تعيين موضع مثالي عمومي في نظام المجموعة. سيتم نقل النسخ المتماثلة ذات تكلفة النقل VeryHigh فقط إذا كان هناك خرق قيد في نظام المجموعة لا يمكن إصلاحه بأي طريقة أخرى (حتى إذا كان يتطلب نقل العديد من النسخ المتماثلة الأخرى لإصلاح الخرق)

تمكين تكلفة النقل في مجموعتك

لكي تؤخذ تكاليف MoveCosts الأكثر دقة في الاعتبار، يجب تمكين MoveCost في مجموعتك. بدون هذا الإعداد، يتم استخدام الوضع الافتراضي لحساب التحركات لحساب MoveCost، ويتم تجاهل تقارير MoveCost.

ClusterManifest.xml:

        <Section Name="PlacementAndLoadBalancing">
            <Parameter Name="UseMoveCostReports" Value="true" />
        </Section>

عبر ClusterConfig.json لعمليات التوزيع المستقلة أو Template.json للمجموعات المستضافة في Azure:

"fabricSettings": [
  {
    "name": "PlacementAndLoadBalancing",
    "parameters": [
      {
          "name": "UseMoveCostReports",
          "value": "true"
      }
    ]
  }
]

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