Test edilebilirlik eylemleri

Azure Service Fabric, güvenilir olmayan bir altyapının benzetimini yapmak için geliştirici olarak size çeşitli gerçek dünya hatalarının ve durum geçişlerinin benzetimini yapmanın yollarını sağlar. Bunlar test edilebilirlik eylemleri olarak kullanıma sunulur. Eylemler belirli bir hata ekleme, durum geçişi veya doğrulamaya neden olan alt düzey API'lerdir. Bu eylemleri birleştirerek hizmetleriniz için kapsamlı test senaryoları yazabilirsiniz.

Service Fabric, bu eylemlerden oluşan bazı yaygın test senaryoları sağlar. Yaygın durum geçişlerini ve hata durumlarını test etmek için dikkatle seçilen bu yerleşik senaryoları kullanmanızı kesinlikle öneririz. Ancak, henüz yerleşik senaryoların kapsamına alınmayan veya uygulamanız için özel olarak uyarlanmış senaryolar için kapsam eklemek istediğinizde özel test senaryoları oluşturmak için eylemler kullanılabilir.

Eylemlerin C# uygulamaları System.Fabric.dll derlemesinde bulunur. System Fabric PowerShell modülü Microsoft.ServiceFabric.Powershell.dll derlemesinde bulunur. Çalışma zamanı yüklemesinin bir parçası olarak, kullanım kolaylığı sağlamak için ServiceFabric PowerShell modülü yüklenir.

Düzgün ve düzgün olmayan hata eylemleri karşılaştırması

Test edilebilirlik eylemleri iki ana demet olarak sınıflandırılır:

  • Düzgün olmayan hatalar: Bu hatalar, makine yeniden başlatmaları ve işlem kilitlenmeleri gibi hataların benzetimini oluşturur. Bu tür hatalarda, işlemin yürütme bağlamı aniden durdurulur. Bu, uygulama yeniden başlatılmadan önce durumu temizleme işleminin çalışabileceği anlamına gelir.
  • Düzgün hatalar: Bu hatalar, yük dengeleme tarafından tetiklenen çoğaltma taşımaları ve bırakmaları gibi düzgün eylemlerin benzetimini gerçekleştirir. Bu gibi durumlarda, hizmet kapanış bildirimi alır ve çıkmadan önce durumu temizleyebilir.

Daha iyi kalite doğrulaması için, çeşitli düzgün ve düzgün olmayan hatalar oluştururken hizmet ve iş yükünü çalıştırın. Hizmet işleminin bir iş akışının ortasında aniden çıktığı düzgün olmayan hata alıştırması senaryoları. Bu, hizmet çoğaltması Service Fabric tarafından geri yüklendikten sonra kurtarma yolunu sınar. Bu, veri tutarlılığını ve hatalardan sonra hizmet durumunun doğru korunup korunmadığını test etme konusunda yardımcı olur. Diğer hata kümesi (düzgün hatalar), hizmetin Service Fabric tarafından taşınan çoğaltmalara doğru tepki gösterdiğini test eder. Bu, RunAsync yönteminde iptal işlemini test ediyor. Hizmetin ayarlanan iptal belirtecini denetlemesi, durumunu doğru kaydetmesi ve RunAsync yönteminden çıkması gerekir.

Test edilebilirlik eylemleri listesi

Eylem Açıklama Yönetilen API PowerShell cmdlet'i Düzgün/düzgün olmayan hatalar
CleanTestState Test sürücüsünün hatalı kapatılması durumunda kümeden tüm test durumunu kaldırır. CleanTestStateAsync Remove-ServiceFabricTestState Uygulanamaz
InvokeDataLoss Veri kaybını bir hizmet bölümüne neden eder. InvokeDataLossAsync Invoke-ServiceFabricPartitionDataLoss Zarif
InvokeQuorumLoss Belirli bir durum bilgisi olan hizmet bölümünü çekirdek kaybına sokar. InvokeQuorumLossAsync Invoke-ServiceFabricQuorumLoss Zarif
MovePrimary Durum bilgisi olan bir hizmetin belirtilen birincil çoğaltmasını belirtilen küme düğümüne taşır. MovePrimaryAsync Move-ServiceFabricPrimaryReplica Zarif
MoveSecondary Durum bilgisi olan bir hizmetin geçerli ikincil çoğaltmasını farklı bir küme düğümüne taşır. MoveSecondaryAsync Move-ServiceFabricSecondaryReplica Zarif
MoveInstance Durum bilgisi olmayan bir hizmetin geçerli örneğini farklı bir küme düğümüne taşır. MoveInstanceAsync Move-ServiceFabricInstance Zarif
RemoveReplica Kümeden bir çoğaltmayı kaldırarak çoğaltma hatasının benzetimini gerçekleştirir. Bu işlem çoğaltmayı kapatır ve kümeden tüm durumunu kaldırarak 'Yok' rolüne geçirir. RemoveReplicaAsync Remove-ServiceFabricReplica Zarif
RestartDeployedCodePackage Kümedeki bir düğüme dağıtılan bir kod paketini yeniden başlatarak kod paketi işlemi hatasının benzetimini gerçekleştirir. Bu, kod paketi işlemini durdurur ve bu işlemde barındırılan tüm kullanıcı hizmeti çoğaltmalarını yeniden başlatır. RestartDeployedCodePackageAsync Restart-ServiceFabricDeployedCodePackage Düzgün Değil
RestartNode Bir düğümü yeniden başlatarak Service Fabric küme düğümü hatasının benzetimini gerçekleştirir. RestartNodeAsync Restart-ServiceFabricNode Düzgün Değil
RestartPartition Bir bölümün bazı veya tüm çoğaltmalarını yeniden başlatarak veri merkezi karartma veya küme karartma senaryosunun benzetimini gerçekleştirir. RestartPartitionAsync Restart-ServiceFabricPartition Zarif
RestartReplica Kümede kalıcı bir çoğaltmayı yeniden başlatıp çoğaltmayı kapatıp yeniden açarak çoğaltma hatasının benzetimini gerçekleştirir. RestartReplicaAsync Restart-ServiceFabricReplica Zarif
StartNode Zaten durdurulmuş bir kümede bir düğüm başlatır. StartNodeAsync Start-ServiceFabricNode Uygulanamaz
StopNode Kümedeki bir düğümü durdurarak düğüm hatasının benzetimini gerçekleştirir. StartNode çağrılana kadar düğüm aşağıda kalır. StopNodeAsync Stop-ServiceFabricNode Düzgün Değil
ValidateApplication Bir uygulama içindeki tüm Service Fabric hizmetlerinin kullanılabilirliğini ve sistem durumunu doğrular; genellikle sistemde bir hata oluştuktan sonra. ValidateApplicationAsync Test-ServiceFabricApplication Uygulanamaz
ValidateService Genellikle sistemde bir hataya neden olduktan sonra Service Fabric hizmetinin kullanılabilirliğini ve sistem durumunu doğrular. ValidateServiceAsync Test-ServiceFabricService Uygulanamaz

PowerShell kullanarak test edilebilirlik eylemi çalıştırma

Bu öğreticide, PowerShell kullanarak test edilebilirlik eylemi çalıştırma işlemi gösterilmektedir. Yerel (bir kutu) kümede veya Azure kümesinde test edilebilirlik eylemi çalıştırmayı öğreneceksiniz. Microsoft.Fabric.Powershell.dll(Service Fabric PowerShell modülü) Microsoft Service Fabric MSI'yi yüklediğinizde otomatik olarak yüklenir. Bir PowerShell istemi açtığınızda modül otomatik olarak yüklenir.

Öğretici segmentleri:

Tek kutulu kümede eylem çalıştırma

Yerel bir kümede test edilebilirlik eylemi çalıştırmak için önce kümeye bağlanın ve PowerShell istemini yönetici modunda açın. Restart-ServiceFabricNode eylemine göz atalım.

Restart-ServiceFabricNode -NodeName Node1 -CompletionMode DoNotVerify

Burada Restart-ServiceFabricNode eylemi "Node1" adlı bir düğümde çalıştırılıyor. Tamamlama modu, restart-node eyleminin gerçekten başarılı olup olmadığını doğrulamaması gerektiğini belirtir. Tamamlama modunun "Doğrula" olarak belirtilmesi, yeniden başlatma eyleminin gerçekten başarılı olup olmadığını doğrulamasına neden olur. Düğümü adıyla doğrudan belirtmek yerine, aşağıdaki gibi bir bölüm anahtarı ve çoğaltma türü aracılığıyla belirtebilirsiniz:

Restart-ServiceFabricNode -ReplicaKindPrimary  -PartitionKindNamed -PartitionKey Partition3 -CompletionMode Verify
$connection = "localhost:19000"
$nodeName = "Node1"

Connect-ServiceFabricCluster $connection
Restart-ServiceFabricNode -NodeName $nodeName -CompletionMode DoNotVerify

Bir kümedeki Service Fabric düğümünü yeniden başlatmak için Restart-ServiceFabricNode kullanılmalıdır. Bu, Fabric.exe işlemini durdurur ve bu işlem söz konusu düğümde barındırılan tüm sistem hizmetini ve kullanıcı hizmeti çoğaltmalarını yeniden başlatır. Hizmetinizi test etmek için bu API'yi kullanmak yük devretme kurtarma yolları boyunca hataların ortaya çıkarılmasına yardımcı olur. Kümedeki düğüm hatalarının benzetimini yapmak için yardımcı olur.

Aşağıdaki ekran görüntüsünde Restart-ServiceFabricNode testability komutu gösterilmektedir.

PowerShell'de Restart-ServiceFabricNode komutunu çalıştırma işleminin ekran görüntüsü.

İlk Get-ServiceFabricNode (Service Fabric PowerShell modülünden bir cmdlet) çıkışı, yerel kümenin beş düğümü olduğunu gösterir: Node.1 - Node.5. Test edilebilirlik eylemi (cmdlet) Node.4 adlı düğümde Restart-ServiceFabricNode yürütüldükten sonra düğümün çalışma süresinin sıfırlandığını görürüz.

Azure kümesinde eylem çalıştırma

Bir Azure kümesinde test edilebilirlik eylemi (PowerShell kullanarak) çalıştırmak, eylemi yerel kümede çalıştırmaya benzer. Tek fark, eylemi çalıştırabilmeniz için önce yerel kümeye bağlanmak yerine Azure kümesine bağlanmanız gerektiğidir.

C kullanarak test edilebilirlik eylemi çalıştırma #

C# kullanarak test edilebilirlik eylemi çalıştırmak için öncelikle FabricClient kullanarak kümeye bağlanmanız gerekir. Ardından eylemi çalıştırmak için gereken parametreleri alın. Aynı eylemi çalıştırmak için farklı parametreler kullanılabilir. RestartServiceFabricNode eylemine bakmak, bunu çalıştırmanın bir yolu kümedeki düğüm bilgilerini (düğüm adı ve düğüm örneği kimliği) kullanmaktır.

RestartNodeAsync(nodeName, nodeInstanceId, completeMode, operationTimeout, CancellationToken.None)

Parametre açıklaması:

  • CompleteMode , modun yeniden başlatma eyleminin gerçekten başarılı olup olmadığını doğrulamaması gerektiğini belirtir. Tamamlama modunun "Doğrula" olarak belirtilmesi, yeniden başlatma eyleminin gerçekten başarılı olup olmadığını doğrulamasına neden olur.
  • OperationTimeout , timeoutException özel durumu oluşturmadan önce işlemin bitme süresini ayarlar.
  • CancellationToken bekleyen bir çağrının iptal edilmesine olanak tanır.

Düğümü adıyla doğrudan belirtmek yerine, bir bölüm anahtarı ve çoğaltma türü aracılığıyla belirtebilirsiniz.

Daha fazla bilgi için bkz. PartitionSelector ve 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 ve ReplicaSelector

PartitionSelector

PartitionSelector, test edilebilirlik açısından kullanıma sunulan bir yardımcıdır ve test edilebilirlik eylemlerinden herhangi birinin gerçekleştirildiği belirli bir bölümü seçmek için kullanılır. Bölüm kimliği önceden biliniyorsa belirli bir bölümü seçmek için kullanılabilir. Veya bölüm anahtarını sağlayabilirsiniz ve işlem bölüm kimliğini dahili olarak çözümler. Rastgele bir bölüm seçme seçeneğiniz de vardır.

Bu yardımcıyı kullanmak için PartitionSelector nesnesini oluşturun ve Select* yöntemlerinden birini kullanarak bölümü seçin. Ardından PartitionSelector nesnesini gerektiren API'ye geçirin. Hiçbir seçenek belirlenmezse, varsayılan olarak rastgele bir bölüme ayarlanır.

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, test edilebilirlik açısından kullanıma sunulan bir yardımcıdır ve test edilebilirlik eylemlerinden herhangi birinin gerçekleştirildiği bir çoğaltmanın seçilmesine yardımcı olmak için kullanılır. Çoğaltma kimliği önceden biliniyorsa, belirli bir çoğaltmayı seçmek için kullanılabilir. Buna ek olarak, birincil çoğaltmayı veya rastgele bir ikincil çoğaltmayı seçme seçeneğiniz vardır. ReplicaSelector PartitionSelector'dan türetilir, bu nedenle test edilebilirlik işlemini gerçekleştirmek istediğiniz çoğaltmayı ve bölümü seçmeniz gerekir.

Bu yardımcıyı kullanmak için bir ReplicaSelector nesnesi oluşturun ve çoğaltmayı ve bölümü seçmek istediğiniz şekilde ayarlayın. Daha sonra bunu gerektiren API'ye geçirebilirsiniz. Hiçbir seçenek belirlenmezse, varsayılan olarak rastgele bir çoğaltma ve rastgele bölüm olur.

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);

Sonraki adımlar