مقدمة إلى مجموعات التطبيقات

عادة ما يدير Cluster Resource Manager في Service Fabric موارد أنظمة المجموعة عن طريق نشر الحمل (الممثل عبر المقاييس) بالتساوي في جميع أنحاء نظام المجموعة. يدير Service Fabric سعة العُقد في نظام المجموعة إلى جانب نظام المجموعة ككل عبر السعة. تعمل المقاييس والسعة بشكل رائع للعديد من أحمال العمل، ولكن الأنماط التي تستخدم بشكل كبير مثيلات تطبيقات Service Fabric المختلفة تجلب أحيانًا متطلبات إضافية. على سبيل المثال، قد ترغب في:

  • حجز بعض السعة على العُقد في نظام المجموعة للخدمات داخل بعض مثيل التطبيق المسمى
  • الحد من العدد الإجمالي للعُقد التي تعمل عليها الخدمات داخل مثيل تطبيق مسمى (بدلاً من نشرها على نظام المجموعة بأكمله)
  • تحديد السعات على مثيل التطبيق المسمى نفسه للحد من عدد الخدمات أو إجمالي استهلاك الموارد للخدمات الموجودة داخله

لتلبية هذه المتطلبات، يدعم Service Fabric Cluster Resource Manager ميزة تسمى مجموعات التطبيقات.

تقييد الحد الأقصى من عدد العُقد

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

تعرض الصورة التالية مثيل تطبيق مع وبدون الحد الأقصى لعدد العُقد المحددة:

مثيل التطبيق الذي يحدد الحد الأقصى لعدد العقد

في المثال الأيمن، لا يحتوي التطبيق على الحد الأقصى لعدد العُقد المحددة، ويحتوي على ثلاث خدمات. قام Cluster Resource Manager بتوزيع جميع النسخ المتماثلة عبر ست عُقد متوفرة لتحقيق أفضل توازن في نظام المجموعة (السلوك الافتراضي). في المثال الصحيح، نرى نفس التطبيق يقتصر على ثلاث عُقد.

تسمى المعلمة التي تتحكم في هذا السلوك MaximumNodes. يمكن تعيين هذه المعلمة أثناء إنشاء التطبيق، أو تحديثها لمثيل تطبيق كان قيد التشغيل بالفعل.

PowerShell

New-ServiceFabricApplication -ApplicationName fabric:/AppName -ApplicationTypeName AppType1 -ApplicationTypeVersion 1.0.0.0 -MaximumNodes 3
Update-ServiceFabricApplication –ApplicationName fabric:/AppName –MaximumNodes 5

C#‎

ApplicationDescription ad = new ApplicationDescription();
ad.ApplicationName = new Uri("fabric:/AppName");
ad.ApplicationTypeName = "AppType1";
ad.ApplicationTypeVersion = "1.0.0.0";
ad.MaximumNodes = 3;
await fc.ApplicationManager.CreateApplicationAsync(ad);

ApplicationUpdateDescription adUpdate = new ApplicationUpdateDescription(new Uri("fabric:/AppName"));
adUpdate.MaximumNodes = 5;
await fc.ApplicationManager.UpdateApplicationAsync(adUpdate);

ضمن مجموعة العُقد، لا يضمن Cluster Resource Manager كائنات الخدمة التي يتم وضعها معًا أو العُقد التي يتم استخدامها.

مقاييس التطبيق والحمل والسعة

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

لكل مقياس تطبيق، هناك قيمتان يمكن تعيينهما:

  • إجمالي سعة التطبيق - يمثل هذا الإعداد السعة الإجمالية للتطبيق لمقياس معين. لا يسمح Cluster Resource Manager بإنشاء أية خدمات جديدة داخل مثيل التطبيق هذا من شأنها أن تتسبب في تجاوز إجمالي الحمل لهذه القيمة. على سبيل المثال، لنفترض أن مثيل التطبيق كان بسعة 10 وكان لديه بالفعل حمل من خمسة. لن يسمح بإنشاء خدمة بإجمالي حمل افتراضي يبلغ 10.
  • الحد الأقصى لسعة العقدة - يحدد هذا الإعداد الحد الأقصى للحمل الإجمالي للتطبيق على عقدة واحدة. إذا تجاوز الحمل هذه السعة، يقوم Cluster Resource Manager بنقل النُسخ المتماثلة إلى عُقد أخرى بحيث ينخفض الحمل.

PowerShell:

New-ServiceFabricApplication -ApplicationName fabric:/AppName -ApplicationTypeName AppType1 -ApplicationTypeVersion 1.0.0.0 -Metrics @("MetricName:Metric1,MaximumNodeCapacity:100,MaximumApplicationCapacity:1000")

C#‎:

ApplicationDescription ad = new ApplicationDescription();
ad.ApplicationName = new Uri("fabric:/AppName");
ad.ApplicationTypeName = "AppType1";
ad.ApplicationTypeVersion = "1.0.0.0";

var appMetric = new ApplicationMetricDescription();
appMetric.Name = "Metric1";
appMetric.TotalApplicationCapacity = 1000;
appMetric.MaximumNodeCapacity = 100;
ad.Metrics.Add(appMetric);
await fc.ApplicationManager.CreateApplicationAsync(ad);

حجز السعة

استخدام شائع آخر لمجموعات التطبيقات هو التأكد من أن الموارد داخل نظام المجموعة محجوزة لمثيل تطبيق معين. يتم حجز المساحة دائمًا عند إنشاء مثيل التطبيق.

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

  • تم إنشاء مثيل التطبيق ولكن ليس لديه أي خدمات داخله حتى الآن
  • يتغير عدد الخدمات داخل مثيل التطبيق في كل مرة
  • تكون الخدمات موجودة ولكنها لا تستهلك الموارد

يتطلب حجز الموارد لمثيل تطبيق تحديد معلمتين إضافيتين: MinimumNodes وNodeReservationCapacity

  • MinimumNodes - تحدد الحد الأدنى لعدد العُقد التي يجب تشغيل مثيل التطبيق عليها.
  • NodeReservationCapacity - هذا الإعداد هو لكل مقياس للتطبيق. القيمة هي مقدار هذا المقياس المحجوز للتطبيق على أي عقدة حيث يتم تشغيل الخدمات في هذا التطبيق.

يضمن الجمع بين MinimumNodes وNodeReservationCapacity الحد الأدنى لحجز الحمل للتطبيق داخل نظام المجموعة. إذا كانت السعة المتبقية في نظام المجموعة أقل من إجمالي الحجز المطلوب، فإن إنشاء التطبيق يفشل.

فلنلقِ نظرة على مثال على حجز السعة:

مثيلات التطبيق التي تحدد السعة المحجوزة

في المثال الأيمن، لا تحتوي التطبيقات على أي سعة تطبيق محددة. يوازن Cluster Resource Manager كل شيء وفقًا للقواعد العادية.

في المثال الموجود على اليسار، لنفترض أنه تم إنشاء Application1 باستخدام الإعدادات التالية:

  • تعيين MinimumNodes إلى اثنين
  • مقياس تطبيق معرّف باستخدام
    • NodeReservationCapacity لـ 20

PowerShell

New-ServiceFabricApplication -ApplicationName fabric:/AppName -ApplicationTypeName AppType1 -ApplicationTypeVersion 1.0.0.0 -MinimumNodes 2 -Metrics @("MetricName:Metric1,NodeReservationCapacity:20")

C#‎

ApplicationDescription ad = new ApplicationDescription();
ad.ApplicationName = new Uri("fabric:/AppName");
ad.ApplicationTypeName = "AppType1";
ad.ApplicationTypeVersion = "1.0.0.0";
ad.MinimumNodes = 2;

var appMetric = new ApplicationMetricDescription();
appMetric.Name = "Metric1";
appMetric.NodeReservationCapacity = 20;

ad.Metrics.Add(appMetric);

await fc.ApplicationManager.CreateApplicationAsync(ad);

يحتفظ Service Fabric بالسعة على عقدتين لـ Application1، ولا يسمح للخدمات من Application2 باستهلاك هذه السعة حتى إذا لم يكن هناك حمل تستهلكه الخدمات داخل Application1 في ذلك الوقت. تعتبر سعة التطبيق المحجوزة هذه مستهلكة وتحتسب مقابل السعة المتبقية على تلك العقدة وداخل نظام المجموعة. يتم خصم الحجز من سعة المجموعة المتبقية على الفور، ولكن يتم خصم الاستهلاك المحجوز من سعة عقدة معينة فقط عند وضع كائن خدمة واحد على الأقل عليها. يسمح هذا الحجز اللاحق بالمرونة واستخدام الموارد بشكل أفضل نظرًا لأن الموارد محجوزة فقط على العُقد عند الحاجة.

الحصول على معلومات تحميل التطبيق

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

PowerShell:

Get-ServiceFabricApplicationLoadInformation –ApplicationName fabric:/MyApplication1

C#‎

var v = await fc.QueryManager.GetApplicationLoadInformationAsync("fabric:/MyApplication1");
var metrics = v.ApplicationLoadMetricInformation;
foreach (ApplicationLoadMetricInformation metric in metrics)
{
    Console.WriteLine(metric.ApplicationCapacity);  //total capacity for this metric in this application instance
    Console.WriteLine(metric.ReservationCapacity);  //reserved capacity for this metric in this application instance
    Console.WriteLine(metric.ApplicationLoad);  //current load for this metric in this application instance
}

يقوم استعلام ApplicationLoad بإرجاع المعلومات الأساسية حول سعة التطبيق التي تم تحديدها للتطبيق. تتضمن هذه المعلومات معلومات الحد الأدنى للعُقد والحد الأقصى للعُقد، والرقم الذي يشغله التطبيق حاليًا. كما تتضمن معلومات حول كل مقياس تحميل تطبيق، بما في ذلك:

  • اسم المقياس: اسم المقياس.
  • سعة الحجز: سعة نظام المجموعة المحجوزة في نظام المجموعة لهذا التطبيق.
  • تحميل التطبيق: إجمالي تحميل النُسخ المتماثلة التابعة لهذا التطبيق.
  • سعة التطبيق: الحد الأقصى المسموح به لقيمة تحميل التطبيق.

إزالة سعة التطبيق

بمجرد تعيين معلمات سعة التطبيق لأحد التطبيقات، يمكن إزالتها باستخدام واجهات برمجة تطبيقات تحديث التطبيق أو PowerShell cmdlets. على سبيل المثال:

Update-ServiceFabricApplication –Name fabric:/MyApplication1 –RemoveApplicationCapacity

يزيل هذا الأمر كافة معلمات إدارة سعة التطبيق من مثيل التطبيق. ويشمل ذلك MinimumNodes وMaximumNodes ومقاييس التطبيق، إن وجدت. يكون تأثير الأمر فوريًا. بعد اكتمال هذا الأمر، يستخدم Cluster Resource Manager السلوك الافتراضي لإدارة التطبيقات. يمكن تحديد معلمات سعة التطبيق مرة أخرى عبر Update-ServiceFabricApplication/System.Fabric.FabricClient.ApplicationManagementClient.UpdateApplicationAsync().

القيود المفروضة على سعة التطبيق

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

  • يتعين أن تكون جميع معلمات الأعداد الصحيحة أرقامًا غير سالبة.
  • يجب ألا يكون MinimumNodes أكبر من MaximumNodes.
  • إذا تم تحديد سعات مقياس الحمل، فيتعين عليها اتباع القواعد التالية:
    • يجب ألا تزيد سعة حجز العقدة عن الحد الأقصى لسعة العقدة. على سبيل المثال، لا يمكنك تحديد سعة "وحدة المعالجة المركزية" للمقاييس على العقدة إلى وحدتين ومحاولة حجز ثلاث وحدات على كل عقدة.
    • إذا تم تحديد MaximumNodes، فيجب ألا يكون ناتج MaximumNodes والحد الأقصى لسعة العقدة أكبر من إجمالي سعة التطبيق. على سبيل المثال، لنفترض أن الحد الأقصى لسعة العقدة "لوحدة المعالجة المركزية" لمقاييس التحميل قد تم تعيينه إلى ثمانية. لنفترض أيضًا أنك قمت بتعيين الحد الأقصى للعُقد إلى 10. في هذه الحالة، يتعين أن يكون إجمالي سعة التطبيق أكبر من 80 لمقياس التحميل هذا.

يتم فرض القيود أثناء إنشاء التطبيق والتحديثات.

كيفية عدم استخدام سعة التطبيق

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

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