إجراءات قابلية الاختبار
من أجل محاكاة بنية أساسية غير موثوقة، يوفر لك Azure Service Fabric طرقاً لمحاكاة العديد من حالات الفشل في العالم الحقيقي وانتقالات الحالة. يتم الكشف عن هذه الإجراءات كإجراءات قابلية اختبار. الإجراءات هي واجهات برمجة التطبيقات منخفضة المستوى التي تسبب حقن خطأ معين أو انتقال الحالة أو التحقق من الصحة. من خلال الجمع بين هذه الإجراءات، يمكنك كتابة سيناريوهات اختبار شاملة لخدماتك.
يوفر Service Fabric بعض سيناريوهات الاختبار الشائعة التي تتكون من هذه الإجراءات. نوصي بشدة باستخدام هذه السيناريوهات المضمنة، والتي تم اختيارها بعناية لاختبار انتقالات الحالة الشائعة وحالات الفشل. ومع ذلك، يمكن استخدام الإجراءات لإنشاء سيناريوهات اختبار مخصصة عندما تريد إضافة تغطية للسيناريوهات التي لم تغطيها السيناريوهات المضمنة حتى الآن أو المخصصة خصيصاً للتطبيق الخاص بك.
تم العثور على عمليات تنفيذ C# للإجراءات في التجميع System.Fabric.dll. تم العثور على وحدة System Fabric PowerShell في تجميع Microsoft.ServiceFabric.Powershell.dll. كجزء من تثبيت وقت التشغيل، يتم تثبيت وحدة ServiceFabric PowerShell للسماح بسهولة الاستخدام.
إجراءات الخطأ الآمنة مقابل غير الآمنة
يتم تصنيف إجراءات قابلية الاختبار إلى مستودعين رئيسيين:
- الأخطاء غير الآمنة: تحاكي هذه الأخطاء حالات الفشل مثل إعادة تشغيل الجهاز وأعطال العملية. في مثل هذه الحالات من الفشل، يتوقف سياق تنفيذ العملية فجأة. هذا يعني أنه لا يمكن تشغيل أي تنظيف للحالة قبل بدء تشغيل التطبيق مرة أخرى.
- أخطاء آمنة: تحاكي هذه الأخطاء الإجراءات الآمنة مثل حركات النسخ المتماثلة والإسقاطات الناتجة عن موازنة التحميل. في مثل هذه الحالات، تتلقى الخدمة إخطاراً بالإغلاق ويمكنها تنظيف الحالة قبل الخروج.
للتحقق من الجودة بشكل أفضل، قم بتشغيل حمل عمل الخدمة والأعمال مع التسبب في العديد من الأخطاء الآمنة وغير الآمنة. سيناريوهات ممارسة الأخطاء غير الآمنة حيث يتم إنهاء عملية الخدمة فجأة في منتصف بعض مهام سير العمل. هذا يختبر مسار الاسترداد بمجرد استعادة النسخة المتماثلة للخدمة بواسطة Service Fabric. سيساعد ذلك في اختبار اتساق البيانات وما إذا كان يتم الحفاظ على حالة الخدمة بشكل صحيح بعد الفشل. تختبر المجموعة الأخرى من حالات الفشل (حالات الفشل الآمنة) أن الخدمة تتفاعل بشكل صحيح مع النسخ المتماثلة التي يتم نقلها بواسطة Service Fabric. هذا يختبر معالجة الإلغاء في أسلوب RunAsync. تحتاج الخدمة إلى التحقق من تعيين الرمز المميز للإلغاء، وحفظ حالته بشكل صحيح، والخروج من أسلوب RunAsync.
قائمة إجراءات قابلية الاختبار
إجراء | الوصف | واجهة برمجة التطبيقات المدارة | PowerShell cmdlet | أخطاء آمنة/غير آمنة |
---|---|---|---|---|
CleanTestState | يزيل كل حالة الاختبار من نظام المجموعة في حالة إيقاف تشغيل إصدار تجريبي بشكل سيء. | CleanTestStateAsync | Remove-ServiceFabricTestState | غير قابل للتطبيق |
InvokeDataLoss | يؤدي إلى فقدان البيانات في قسم خدمة. | InvokeDataLossAsync | Invoke-ServiceFabricPartitionDataLoss | آمن |
InvokeQuorumLoss | يؤدي إلى فقدان الحصة لقسم خدمة ذي حالة خاصة. | InvokeQuorumLossAsync | Invoke-ServiceFabricQuorumLoss | آمن |
MovePrimary | ينقل النسخة المتماثلة الأساسية المحددة لخدمة ذات حالة خاصة إلى عقدة نظام المجموعة المحددة. | MovePrimaryAsync | Move-ServiceFabricPrimaryReplica | آمن |
MoveSecondary | ينقل النسخة المتماثلة الثانوية الحالية لخدمة ذات حالة خاصة إلى عقدة نظام مجموعة مختلفة. | MoveSecondaryAsync | Move-ServiceFabricSecondaryReplica | آمن |
MoveInstance | نقل المثيل الحالي لخدمة عديمة الحالة إلى عقدة نظام مجموعة مختلفة. | MoveInstanceAsync | Move-ServiceFabricInstance | آمن |
RemoveReplica | يحاكي فشل نسخة متماثلة عن طريق إزالة نسخة متماثلة من نظام مجموعة. سيؤدي ذلك إلى إغلاق النسخة المتماثلة ونقلها إلى دور "لا شيء"، وإزالة كل حالتها من نظام المجموعة. | RemoveReplicaAsync | Remove-ServiceFabricReplica | آمن |
RestartDeployedCodePackage | يحاكي فشل عملية حزمة تعليمات برمجية عن طريق إعادة تشغيل حزمة تعليمات برمجية تم توزيعها على عقدة في نظام مجموعة. يؤدي هذا إلى إحباط عملية حزمة التعليمات البرمجية، والتي ستقوم بإعادة تشغيل جميع النسخ المتماثلة لخدمة المستخدم المستضافة في تلك العملية. | RestartDeployedCodePackageAsync | Restart-ServiceFabricDeployedCodePackage | غير آمن |
RestartNode | يحاكي فشل عقدة نظام مجموعة Service Fabric عن طريق إعادة تشغيل عقدة. | RestartNodeAsync | Restart-ServiceFabricNode | غير آمن |
RestartPartition | يحاكي سيناريو عدم إتاحة مركز بيانات أو نظام المجموعة عن طريق إعادة تشغيل بعض أو كل النسخ المتماثلة لقسم. | RestartPartitionAsync | Restart-ServiceFabricPartition | آمن |
RestartReplica | يحاكي فشل نسخة متماثلة عن طريق إعادة تشغيل نسخة متماثلة مستمرة في نظام مجموعة، وإغلاق النسخة المتماثلة ثم إعادة فتحها. | RestartReplicaAsync | Restart-ServiceFabricReplica | آمن |
StartNode | بدء تشغيل عقدة في نظام مجموعة تم إيقافه بالفعل. | StartNodeAsync | Start-ServiceFabricNode | غير قابل للتطبيق |
StopNode | يحاكي فشل عقدة عن طريق إيقاف عقدة في نظام مجموعة. ستبقى العقدة معطلة حتى يتم استدعاء StartNode. | StopNodeAsync | Stop-ServiceFabricNode | غير آمن |
ValidateApplication | التحقق من توفر وسلامة جميع خدمات Service Fabric داخل التطبيق، عادة بعد إحداث بعض الأخطاء في النظام. | ValidateApplicationAsync | Test-ServiceFabricApplication | غير قابل للتطبيق |
ValidateService | التحقق من توفر وسلامة جميع خدمات Service Fabric داخل التطبيق، عادة بعد إحداث بعض الأخطاء في النظام. | ValidateServiceAsync | Test-ServiceFabricService | غير قابل للتطبيق |
تشغيل إجراء قابلية اختبار باستخدام PowerShell
يوضح لك هذا البرنامج التعليمي كيفية تشغيل إجراء قابلية اختبار باستخدام PowerShell. ستتعلم كيفية تشغيل إجراء قابلية اختبار ضد نظام مجموعة محلي (مربع واحد) أو نظام مجموعة Azure. يتم تثبيت Microsoft.Fabric.Powershell.dll--the Service Fabric PowerShell module-- تلقائياً عند تثبيت Microsoft Service Fabric MSI. يتم تحميل الوحدة تلقائياً عند فتح مطالبة PowerShell.
مقاطع البرنامج التعليمي:
تشغيل إجراء ضد نظام مجموعة من مربع واحد
لتشغيل إجراء قابلية اختبار ضد نظام مجموعة محلي، اتصل أولاً بنظام المجموعة وافتح مطالبة PowerShell في وضع المسؤول. دعونا نلقي نظرة على الإجراء Restart-ServiceFabricNode.
Restart-ServiceFabricNode -NodeName Node1 -CompletionMode DoNotVerify
هنا يتم تشغيل الإجراء Restart-ServiceFabricNode على عقدة تسمى "Node1". يحدد وضع الإكمال أنه لا ينبغي التحقق مما إذا كان إجراء عقدة إعادة التشغيل قد نجح بالفعل أم لا. سيؤدي تحديد وضع الإكمال على أنه "تحقق" إلى قيامه بالتحقق مما إذا كان إجراء إعادة التشغيل قد نجح بالفعل أم لا. بدلاً من تحديد العقدة مباشرة باسمها، يمكنك تحديدها عبر مفتاح قسم ونوع النسخة المتماثلة، على النحو التالي:
Restart-ServiceFabricNode -ReplicaKindPrimary -PartitionKindNamed -PartitionKey Partition3 -CompletionMode Verify
$connection = "localhost:19000"
$nodeName = "Node1"
Connect-ServiceFabricCluster $connection
Restart-ServiceFabricNode -NodeName $nodeName -CompletionMode DoNotVerify
يجب استخدام Restart-ServiceFabricNode لإعادة تشغيل عقدة Service Fabric في نظام مجموعة. سيؤدي ذلك إلى إيقاف عملية Fabric.exe، والتي ستقوم بإعادة تشغيل كافة النسخ المتماثلة لخدمة النظام وخدمة المستخدم المستضافة على تلك العقدة. يساعد استخدام واجهة برمجة التطبيقات هذه لاختبار خدمتك في الكشف عن الأخطاء على طول مسارات استرداد تجاوز الفشل. يساعد على محاكاة حالات فشل العقدة في نظام المجموعة.
تعرض لقطة الشاشة التالية أمر قابلية الاختبار إعادة تشغيل-ServiceFabricNode أثناء العمل.
يوضح إخراج Get-ServiceFabricNode الأول (الأمر cmdlet من الوحدة Service Fabric PowerShell) أن نظام المجموعة المحلي يحتوي على خمس عقد: Node.1 إلى Node.5. بعد تنفيذ إجراء قابلية الاختبار (الأمر cmdlet) Restart-ServiceFabricNode على العقدة، المسماة Node.4، نرى أنه تمت إعادة تعيين وقت تشغيل العقدة.
تشغيل إجراء ضد نظام مجموعة Azure
يشبه تشغيل إجراء قابلية اختبار (باستخدام PowerShell) ضد نظام مجموعة Azure تشغيل الإجراء ضد مجموعة نظام مجموعة محلي. الفرق الوحيد هو أنه قبل أن تتمكن من تشغيل الإجراء، بدلاً من الاتصال بنظام المجموعة المحلي، تحتاج إلى الاتصال بنظام مجموعة Azure أولاً.
تشغيل إجراء قابلية اختبار باستخدام C#
لتشغيل إجراء قابلية اختبار باستخدام C#، تحتاج أولاً إلى الاتصال بنظام المجموعة باستخدام FabricClient. ثم احصل على المعلمات اللازمة لتشغيل الإجراء. يمكن استخدام معلمات مختلفة لتشغيل نفس الإجراء. بالنظر إلى الإجراء RestartServiceFabricNode، تتمثل إحدى طرق تشغيله في استخدام معلومات العقدة (اسم العقدة ومعرف مثيل العقدة) في نظام المجموعة.
RestartNodeAsync(nodeName, nodeInstanceId, completeMode, operationTimeout, CancellationToken.None)
شرح المعلمة:
- CompleteMode يحدد أنه لا ينبغي التحقق مما إذا كان إجراء عقدة إعادة التشغيل قد نجح بالفعل أم لا. سيؤدي تحديد وضع الإكمال على أنه "تحقق" إلى قيامه بالتحقق مما إذا كان إجراء إعادة التشغيل قد نجح بالفعل أم لا.
- OperationTimeout يقوم بتعيين مقدار الوقت اللازم لإنهاء العملية قبل طرح استثناء TimeoutException.
- يتيح CancellationToken بتمكين إلغاء مكالمة معلقة.
بدلاً من تحديد العقدة مباشرة باسمها، يمكنك تحديدها عبر مفتاح قسم ونوع النسخة المتماثلة.
لمزيد من المعلومات، راجع PartitionSelector وReplicaSelector.
// Add a reference to System.Fabric.Testability.dll and System.Fabric.dll
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Fabric.Testability;
using System.Fabric;
using System.Threading;
using System.Numerics;
class Test
{
public static int Main(string[] args)
{
string clusterConnection = "localhost:19000";
Uri serviceName = new Uri("fabric:/samples/PersistentToDoListApp/PersistentToDoListService");
string nodeName = "N0040";
BigInteger nodeInstanceId = 130743013389060139;
Console.WriteLine("Starting RestartNode test");
try
{
//Restart the node by using ReplicaSelector
RestartNodeAsync(clusterConnection, serviceName).Wait();
//Another way to restart node is by using nodeName and nodeInstanceId
RestartNodeAsync(clusterConnection, nodeName, nodeInstanceId).Wait();
}
catch (AggregateException exAgg)
{
Console.WriteLine("RestartNode did not complete: ");
foreach (Exception ex in exAgg.InnerExceptions)
{
if (ex is FabricException)
{
Console.WriteLine("HResult: {0} Message: {1}", ex.HResult, ex.Message);
}
}
return -1;
}
Console.WriteLine("RestartNode completed.");
return 0;
}
static async Task RestartNodeAsync(string clusterConnection, Uri serviceName)
{
PartitionSelector randomPartitionSelector = PartitionSelector.RandomOf(serviceName);
ReplicaSelector primaryofReplicaSelector = ReplicaSelector.PrimaryOf(randomPartitionSelector);
// Create FabricClient with connection and security information here
FabricClient fabricclient = new FabricClient(clusterConnection);
await fabricclient.FaultManager.RestartNodeAsync(primaryofReplicaSelector, CompletionMode.Verify);
}
static async Task RestartNodeAsync(string clusterConnection, string nodeName, BigInteger nodeInstanceId)
{
// Create FabricClient with connection and security information here
FabricClient fabricclient = new FabricClient(clusterConnection);
await fabricclient.FaultManager.RestartNodeAsync(nodeName, nodeInstanceId, CompletionMode.Verify);
}
}
PartitionSelector وReplicaSelector
PartitionSelector
PartitionSelector هو مساعد مكشوف في قابلية الاختبار ويستخدم لتحديد قسم معين لتنفيذ أي من إجراءات قابلية الاختبار. يمكن استخدامه لتحديد قسم معين إذا كان معرف القسم معروفاً مسبقاً. أو يمكنك توفير مفتاح القسم وستقوم العملية بحل معرف القسم داخلياً. لديك أيضاً خيار تحديد قسم عشوائي.
لاستخدام هذا المساعد، قم بإنشاء عنصر PartitionSelector وحدد القسم باستخدام إحدى أساليب Select*. ثم قم بإدخال عنصر PartitionSelector إلى واجهة برمجة التطبيقات التي تتطلب ذلك. إذا لم يتم تحديد أي خيار، يتم تعيينه افتراضياً إلى قسم عشوائي.
Uri serviceName = new Uri("fabric:/samples/InMemoryToDoListApp/InMemoryToDoListService");
Guid partitionIdGuid = new Guid("8fb7ebcc-56ee-4862-9cc0-7c6421e68829");
string partitionName = "Partition1";
Int64 partitionKeyUniformInt64 = 1;
// Select a random partition
PartitionSelector randomPartitionSelector = PartitionSelector.RandomOf(serviceName);
// Select a partition based on ID
PartitionSelector partitionSelectorById = PartitionSelector.PartitionIdOf(serviceName, partitionIdGuid);
// Select a partition based on name
PartitionSelector namedPartitionSelector = PartitionSelector.PartitionKeyOf(serviceName, partitionName);
// Select a partition based on partition key
PartitionSelector uniformIntPartitionSelector = PartitionSelector.PartitionKeyOf(serviceName, partitionKeyUniformInt64);
ReplicaSelector
ReplicaSelector هو مساعد مكشوف في قابلية الاختبار ويستخدم للمساعدة في تحديد نسخة متماثلة لأداء أي من إجراءات قابلية الاختبار. يمكن استخدامه لتحديد نسخة متماثلة معينة إذا كان معرف النسخة المتماثلة معروفاً مسبقاً. بالإضافة إلى ذلك، لديك خيار تحديد نسخة متماثلة أساسية أو ثانوية عشوائية. ReplicaSelector مشتق من PartitionSelector، لذلك تحتاج إلى تحديد كل من النسخة المتماثلة والقسم الذي ترغب في إجراء عملية قابلية الاختبار عليه.
لاستخدام هذا المساعد، قم بإنشاء عنصر ReplicaSelector وقم بتعيين الطريقة التي تريد بها تحديد النسخة المتماثلة والقسم. يمكنك بعد ذلك تمريره إلى واجهة برمجة التطبيقات التي تتطلب ذلك. إذا لم يتم تحديد أي خيار، يتم تعيينه افتراضياً إلى قسم عشوائي ونسخة متماثلة عشوائية.
Guid partitionIdGuid = new Guid("8fb7ebcc-56ee-4862-9cc0-7c6421e68829");
PartitionSelector partitionSelector = PartitionSelector.PartitionIdOf(serviceName, partitionIdGuid);
long replicaId = 130559876481875498;
// Select a random replica
ReplicaSelector randomReplicaSelector = ReplicaSelector.RandomOf(partitionSelector);
// Select the primary replica
ReplicaSelector primaryReplicaSelector = ReplicaSelector.PrimaryOf(partitionSelector);
// Select the replica by ID
ReplicaSelector replicaByIdSelector = ReplicaSelector.ReplicaIdOf(partitionSelector, replicaId);
// Select a random secondary replica
ReplicaSelector secondaryReplicaSelector = ReplicaSelector.RandomSecondaryOf(partitionSelector);
الخطوات التالية
الملاحظات
https://aka.ms/ContentUserFeedback.
قريبًا: خلال عام 2024، سنتخلص تدريجيًا من GitHub Issues بوصفها آلية إرسال ملاحظات للمحتوى ونستبدلها بنظام ملاحظات جديد. لمزيد من المعلومات، راجعإرسال الملاحظات وعرضها المتعلقة بـ