سيناريوهات قابلية الاختبار

الأنظمة الموزعة الكبيرة مثل البنى الأساسية السحابية غير موثوقة بطبيعتها. يمنح Azure Service Fabric المطوِّرين القدرة على كتابة الخدمات للعمل فوق البنى التحتية غير الموثوق بها. من أجل كتابة خدمات عالية الجودة، يحتاج المطورون إلى أن يكونوا قادرين على إحداث مثل هذه البنية التحتية غير الموثوقة لاختبار استقرار خدماتهم.

تمنح خدمة Fault Analysis المطورين القدرة على تحريض إجراءات الخطأ لاختبار الخدمات في حالة وجود حالات فشل. ومع ذلك، فإن أخطاء المحاكاة المستهدفة ستجعلك فقط حتى الآن. لإجراء المزيد من الاختبار، يمكنك استخدام سيناريوهات الاختبار في Service Fabric: اختبار الفوضى واختبار تجاوز الفشل. تحاكي هذه السيناريوهات أخطاء التشذير المستمرة، سواء كانت رشيقة أو غير رشيقة، في جميع أنحاء نظام المجموعة على مدى فترات طويلة من الزمن. بمجرد تكوين الاختبار مع معدل ونوع الأخطاء، يمكن بدؤه من خلال واجهات برمجة تطبيقات C # أو PowerShell، لإنشاء أخطاء في المجموعة وخدمتك.

تحذير

يتم استبدال ChaosTestScenario بفوضى مرنة وقائمة على الخدمة. يرجى الرجوع إلى المقالة الجديدة الفوضى الخاضعة للسيطرة لمزيد من التفاصيل.

اختبار مخصصة للفوضى

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

محاكاة الأخطاء في اختبار الفوضى

  • عملية إعادة تشغيل عقدة
  • إعادة تشغيل حزمة التعليمات البرمجية الموزعة
  • إزالة نسخة متماثلة
  • عملية إعادة تشغيل نسخة متماثلة
  • عملية نقل نسخة متماثلة أساسية (اختياري)
  • عملية نقل نسخة متماثلة ثانوية (اختياري)

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

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

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

خيارات مهمة للتكوين

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

طريقة تشغيل اختبار الفوضى

عينة C#‎

using System;
using System.Fabric;
using System.Fabric.Testability.Scenario;
using System.Threading;
using System.Threading.Tasks;

class Test
{
    public static int Main(string[] args)
    {
        string clusterConnection = "localhost:19000";

        Console.WriteLine("Starting Chaos Test Scenario...");
        try
        {
            RunChaosTestScenarioAsync(clusterConnection).Wait();
        }
        catch (AggregateException ae)
        {
            Console.WriteLine("Chaos Test Scenario did not complete: ");
            foreach (Exception ex in ae.InnerExceptions)
            {
                if (ex is FabricException)
                {
                    Console.WriteLine("HResult: {0} Message: {1}", ex.HResult, ex.Message);
                }
            }
            return -1;
        }

        Console.WriteLine("Chaos Test Scenario completed.");
        return 0;
    }

    static async Task RunChaosTestScenarioAsync(string clusterConnection)
    {
        TimeSpan maxClusterStabilizationTimeout = TimeSpan.FromSeconds(180);
        uint maxConcurrentFaults = 3;
        bool enableMoveReplicaFaults = true;

        // Create FabricClient with connection and security information here.
        FabricClient fabricClient = new FabricClient(clusterConnection);

        // The chaos test scenario should run at least 60 minutes or until it fails.
        TimeSpan timeToRun = TimeSpan.FromMinutes(60);
        ChaosTestScenarioParameters scenarioParameters = new ChaosTestScenarioParameters(
          maxClusterStabilizationTimeout,
          maxConcurrentFaults,
          enableMoveReplicaFaults,
          timeToRun);

        // Other related parameters:
        // Pause between two iterations for a random duration bound by this value.
        // scenarioParameters.WaitTimeBetweenIterations = TimeSpan.FromSeconds(30);
        // Pause between concurrent actions for a random duration bound by this value.
        // scenarioParameters.WaitTimeBetweenFaults = TimeSpan.FromSeconds(10);

        // Create the scenario class and execute it asynchronously.
        ChaosTestScenario chaosScenario = new ChaosTestScenario(fabricClient, scenarioParameters);

        try
        {
            await chaosScenario.ExecuteAsync(CancellationToken.None);
        }
        catch (AggregateException ae)
        {
            throw ae.InnerException;
        }
    }
}

PowerShell

تحتوي وحدة Service Fabric PowerShell على طريقتين لبدء سيناريو الفوضى. يعتمد Invoke-ServiceFabricChaosTestScenario على العميل، وإذا تم إغلاق جهاز العميل في منتصف الاختبار، فلن يتم عرض المزيد من الأخطاء. بدلًا من ذلك، هناك مجموعة من الأوامر تهدف إلى استمرار تشغيل الاختبار في حالة إيقاف تشغيل الجهاز. يستخدم Start-ServiceFabricChaos خدمة نظام ذات حالة وموثوق بها تسمى FaultAnalysisService، مما يضمن استمرار ظهور الأخطاء حتى يتم تشغيل وقت التشغيل. يمكن استخدام Stop-ServiceFabricChaos لإيقاف السيناريو يدويًّا، وسيحصل Get-ServiceFabricChaosReport على تقرير. لمزيد من المعلومات، راجع مرجع Azure Service Fabric PowerShell و إحداث فوضى يتم التحكم فيها في مجموعات نسيج الخدمة .

$connection = "localhost:19000"
$timeToRun = 60
$maxStabilizationTimeSecs = 180
$concurrentFaults = 3
$waitTimeBetweenIterationsSec = 60

Connect-ServiceFabricCluster $connection

Invoke-ServiceFabricChaosTestScenario -TimeToRunMinute $timeToRun -MaxClusterStabilizationTimeoutSec $maxStabilizationTimeSecs -MaxConcurrentFaults $concurrentFaults -EnableMoveReplicaFaults -WaitTimeBetweenIterationsSec $waitTimeBetweenIterationsSec

اختبار عملية تجاوز الفشل

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

محاكاة الأخطاء في اختبار تجاوز الفشل

  • إعادة تشغيل حزمة التعليمات البرمجية التي تم نشرها حيث تتم استضافة القسم
  • إزالة نسخة متماثلة أساسية / ثانوية أو نسخة عديمة الحالة
  • إعادة تشغيل نسخة متماثلة ثانوية أساسية (إذا كانت خدمة مستمرة)
  • عملية نقل نسخة متماثلة أساسية
  • عملية نقل نسخة متماثلة ثانوية
  • إعادة تشغيل القسم

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

خيارات مهمة للتكوين

  • PartitionSelector : كائن محدد يحدد القسم الذي يجب استهدافه.
  • TimeToRun : إجمالي الوقت الذي سيجري فيه الاختبار قبل الانتهاء.
  • MaxServiceStabilizationTimeout : أقصى قدر من الوقت لانتظار الكتلة حتى تصبح سليمة قبل فشل الاختبار. عمليات التحقق التي تم إجراؤها هي ما إذا كانت صحة الخدمة على ما يرام أم لا، ويتم تحقيق حجم مجموعة النسخ المتماثلة الهدف لجميع الأقسام، ولا توجد نسخ متماثلة InBuild.
  • WaitTimeBetweenFaults : مقدار الوقت اللازم للانتظار بين كل خطأ ودورة تحقق من الصحة.

طريقة تشغيل اختبار تجاوز الفشل

C#‎

using System;
using System.Fabric;
using System.Fabric.Testability.Scenario;
using System.Threading;
using System.Threading.Tasks;

class Test
{
    public static int Main(string[] args)
    {
        string clusterConnection = "localhost:19000";
        Uri serviceName = new Uri("fabric:/samples/PersistentToDoListApp/PersistentToDoListService");

        Console.WriteLine("Starting Chaos Test Scenario...");
        try
        {
            RunFailoverTestScenarioAsync(clusterConnection, serviceName).Wait();
        }
        catch (AggregateException ae)
        {
            Console.WriteLine("Chaos Test Scenario did not complete: ");
            foreach (Exception ex in ae.InnerExceptions)
            {
                if (ex is FabricException)
                {
                    Console.WriteLine("HResult: {0} Message: {1}", ex.HResult, ex.Message);
                }
            }
            return -1;
        }

        Console.WriteLine("Chaos Test Scenario completed.");
        return 0;
    }

    static async Task RunFailoverTestScenarioAsync(string clusterConnection, Uri serviceName)
    {
        TimeSpan maxServiceStabilizationTimeout = TimeSpan.FromSeconds(180);
        PartitionSelector randomPartitionSelector = PartitionSelector.RandomOf(serviceName);

        // Create FabricClient with connection and security information here.
        FabricClient fabricClient = new FabricClient(clusterConnection);

        // The chaos test scenario should run at least 60 minutes or until it fails.
        TimeSpan timeToRun = TimeSpan.FromMinutes(60);
        FailoverTestScenarioParameters scenarioParameters = new FailoverTestScenarioParameters(
          randomPartitionSelector,
          timeToRun,
          maxServiceStabilizationTimeout);

        // Other related parameters:
        // Pause between two iterations for a random duration bound by this value.
        // scenarioParameters.WaitTimeBetweenIterations = TimeSpan.FromSeconds(30);
        // Pause between concurrent actions for a random duration bound by this value.
        // scenarioParameters.WaitTimeBetweenFaults = TimeSpan.FromSeconds(10);

        // Create the scenario class and execute it asynchronously.
        FailoverTestScenario failoverScenario = new FailoverTestScenario(fabricClient, scenarioParameters);

        try
        {
            await failoverScenario.ExecuteAsync(CancellationToken.None);
        }
        catch (AggregateException ae)
        {
            throw ae.InnerException;
        }
    }
}

PowerShell

$connection = "localhost:19000"
$timeToRun = 60
$maxStabilizationTimeSecs = 180
$waitTimeBetweenFaultsSec = 10
$serviceName = "fabric:/SampleApp/SampleService"

Connect-ServiceFabricCluster $connection

Invoke-ServiceFabricFailoverTestScenario -TimeToRunMinute $timeToRun -MaxServiceStabilizationTimeoutSec $maxStabilizationTimeSecs -WaitTimeBetweenFaultsSec $waitTimeBetweenFaultsSec -ServiceName $serviceName -PartitionKindSingleton