Sdílet prostřednictvím


Akce testovatelnosti

Aby bylo možné simulovat nespolehlivou infrastrukturu, azure Service Fabric poskytuje vývojářům způsoby simulace různých skutečných selhání a přechodů stavu. Tyto akce jsou vystaveny jako akce testovatelnosti. Akce jsou rozhraní API nízké úrovně, která způsobují konkrétní injektáž selhání, přechod stavu nebo ověření. Kombinací těchto akcí můžete pro své služby psát komplexní testovací scénáře.

Service Fabric poskytuje několik běžných testovacích scénářů, které se skládají z těchto akcí. Důrazně doporučujeme využít tyto předdefinované scénáře, které jsou pečlivě vybrány k testování běžných přechodů stavu a případů selhání. Akce se ale dají použít k vytvoření vlastních testovacích scénářů, pokud chcete přidat pokrytí pro scénáře, které ještě nejsou pokryté integrovanými scénáři nebo které jsou přizpůsobené pro vaši aplikaci.

Implementace akcí jazyka C# se nacházejí v System.Fabric.dll sestavení. Modul System Fabric PowerShell se nachází v Microsoft.ServiceFabric.Powershell.dll sestavení. V rámci instalace modulu runtime se nainstaluje modul ServiceFabric PowerShell, který umožňuje snadné použití.

Elegantní vs. nesrácené chybné akce

Akce testovatelnosti jsou klasifikovány do dvou hlavních kontejnerů:

  • Neřešivé chyby: Tyto chyby simulují selhání, jako jsou restartování počítače a chybové ukončení procesů. V takovýchpřípadechch To znamená, že před opětovným spuštěním aplikace nelze spustit žádné vyčištění stavu.
  • Elegantní chyby: Tyto chyby simulují řádné akce, jako jsou přesuny a poklesy repliky aktivované vyrovnáváním zatížení. V takových případech služba obdrží oznámení o uzavření a může před ukončením vyčistit stav.

Kvůli lepšímu ověření kvality spusťte službu a obchodní úlohu a současně vynucujte různé elegantní a nedržující chyby. Nevrácené chyby se vypracují ve scénářích, kdy se proces služby náhle ukončí uprostřed určitého pracovního postupu. Tato operace otestuje cestu obnovení, jakmile service Fabric obnoví repliku služby. To vám pomůže otestovat konzistenci dat a to, jestli je stav služby po selhání správně zachován. Druhá sada selhání (graceful failures) testuje, že služba správně reaguje na repliky, které se přesouvají službou Service Fabric. Tento test zpracovává zrušení v metodě RunAsync. Služba musí zkontrolovat nastavení tokenu zrušení, správně uložit jeho stav a ukončit metodu RunAsync.

Seznam akcí testovatelnosti

Akce Popis Spravované rozhraní API Rutina PowerShellu Elegantní/neschválné chyby
CleanTestState Odebere z clusteru veškerý stav testu v případě chybného vypnutí testovacího ovladače. CleanTestStateAsync Remove-ServiceFabricTestState Nelze použít
InvokeDataLoss Indukuje ztrátu dat do oddílu služby. InvokeDataLossAsync Invoke-ServiceFabricPartitionDataLoss Elegantní
InvokeQuorumLoss Umístí daný oddíl stavové služby do ztráty kvora. InvokeQuorumLossAsync Invoke-ServiceFabricQuorumLoss Elegantní
MovePrimary Přesune zadanou primární repliku stavové služby do zadaného uzlu clusteru. MovePrimaryAsync Move-ServiceFabricPrimaryReplica Elegantní
MoveSecondary Přesune aktuální sekundární repliku stavové služby do jiného uzlu clusteru. MoveSecondaryAsync Move-ServiceFabricSecondaryReplica Elegantní
MoveInstance Přesune aktuální instanci bezstavové služby do jiného uzlu clusteru. MoveInstanceAsync Move-ServiceFabricInstance Elegantní
RemoveReplica Simuluje selhání repliky odebráním repliky z clusteru. Tím se replika zavře a převedou se na roli None (Žádná), čímž se odebere veškerý stav clusteru. RemoveReplicaAsync Remove-ServiceFabricReplica Elegantní
RestartDeployedCodePackage Simuluje selhání procesu balíčku kódu restartováním balíčku kódu nasazeného v uzlu v clusteru. Tím se přeruší proces balíčku kódu, který restartuje všechny repliky služby uživatele hostované v tomto procesu. RestartDeployedCodePackageAsync Restart-ServiceFabricDeployedCodePackage Ohavný
RestartNode Simuluje selhání uzlu clusteru Service Fabric restartováním uzlu. RestartNodeAsync Restart-ServiceFabricNode Ohavný
RestartPartition Simuluje scénář výpadku datového centra nebo výpadku clusteru restartováním některých nebo všech replik oddílu. RestartPartitionAsync Restart-ServiceFabricPartition Elegantní
RestartReplica Simuluje selhání repliky restartováním trvalé repliky v clusteru, zavřením repliky a jejím opětovným otevřením. RestartReplicaAsync Restart-ServiceFabricReplica Elegantní
StartNode Spustí uzel v clusteru, který je již zastavený. StartNodeAsync Start-ServiceFabricNode Nelze použít
StopNode Simuluje selhání uzlu zastavením uzlu v clusteru. Uzel zůstane v výpadku, dokud se nevolá StartNode. StopNodeAsync Stop-ServiceFabricNode Ohavný
ValidateApplication Ověří dostupnost a stav všech služeb Service Fabric v rámci aplikace, obvykle po vynucení určité chyby v systému. ValidateApplicationAsync Test-ServiceFabricApplication Nelze použít
ValidateService Ověří dostupnost a stav služby Service Fabric, obvykle po vynucení určité chyby v systému. ValidateServiceAsync Test-ServiceFabricService Nelze použít

Spuštění akce testovatelnosti pomocí PowerShellu

V tomto kurzu se dozvíte, jak spustit akci testovatelnosti pomocí PowerShellu. Dozvíte se, jak spustit akci testovatelnosti s místním clusterem (jedním rámečkem) nebo clusterem Azure. Microsoft.Fabric.Powershell.dll – modul Service Fabric PowerShellu – se nainstaluje automaticky při instalaci msi Microsoft Service Fabric. Modul se načte automaticky při otevření příkazového řádku PowerShellu.

Segmenty kurzu:

Spuštění akce proti clusteru s jedním rámečkem

Pokud chcete spustit akci testovatelnosti pro místní cluster, nejprve se připojte ke clusteru a otevřete příkazový řádek PowerShellu v režimu správce. Podívejme se na akci Restart-ServiceFabricNode .

Restart-ServiceFabricNode -NodeName Node1 -CompletionMode DoNotVerify

Zde se akce Restart-ServiceFabricNode spouští na uzlu s názvem Node1. Režim dokončení určuje, že by neměl ověřit, zda akce restart-node skutečně proběhla úspěšně. Zadání režimu dokončení jako Ověření způsobí, že ověří, jestli akce restartování skutečně proběhla úspěšně. Místo přímého zadání uzlu podle názvu ho můžete zadat prostřednictvím klíče oddílu a typu repliky následujícím způsobem:

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

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

Uzel Restart-ServiceFabricNode by se měl použít k restartování uzlu Service Fabric v clusteru. Tím se zastaví proces Fabric.exe, který restartuje všechny repliky systémové služby a uživatelské služby hostované na tomto uzlu. Použití tohoto rozhraní API k otestování služby pomáhá odhalit chyby v cestách zotavení po převzetí služeb při selhání. Pomáhá simulovat selhání uzlů v clusteru.

Následující snímek obrazovky ukazuje příkaz Restartovat-ServiceFabricNode testability v akci.

Snímek obrazovky se spuštěním příkazu Restart-ServiceFabricNode v PowerShellu

Výstup prvního modulu Get-ServiceFabricNode (rutina z modulu Service Fabric PowerShell) ukazuje, že místní cluster má pět uzlů: Node.1 až Node.5. Po provedení akce testability (rutina) Restart-ServiceFabricNode na uzlu s názvem Node.4 vidíme, že doba provozu uzlu byla resetována.

Spuštění akce s clusterem Azure

Spuštění akce testovatelnosti (pomocí PowerShellu) v clusteru Azure se podobá spuštění akce v místním clusteru. Jediným rozdílem je, že před spuštěním akce místo připojení k místnímu clusteru se musíte nejprve připojit ke clusteru Azure.

Spuštění akce testovatelnosti pomocí jazyka C#

Pokud chcete spustit akci testovatelnosti pomocí jazyka C#, musíte se nejprve připojit ke clusteru pomocí FabricClient. Potom získejte parametry potřebné ke spuštění akce. Ke spuštění stejné akce je možné použít různé parametry. Když se podíváte na akci RestartServiceFabricNode, jedním ze způsobů, jak ji spustit, je použít informace o uzlu (název uzlu a ID instance uzlu) v clusteru.

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

Vysvětlení parametrů:

  • CompleteMode určuje, že režim by neměl ověřit, zda akce restartování byla skutečně úspěšná. Zadání režimu dokončení jako Ověření způsobí, že ověří, jestli akce restartování skutečně proběhla úspěšně.
  • OperationTimeout nastaví dobu dokončení operace před vyvoláním výjimky TimeoutException.
  • CancellationToken umožňuje zrušení čekajícího volání.

Místo přímého zadání uzlu podle názvu ho můžete zadat prostřednictvím klíče oddílu a typu repliky.

Další informace najdete v tématu PartitionSelector a 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 a ReplicaSelector

PartitionSelector

PartitionSelector je pomocná rutina vystavená testovatelností a slouží k výběru konkrétního oddílu, na kterém se má provést některý z akcí testovatelnosti. Pokud je ID oddílu předem známé, můžete ho použít k výběru konkrétního oddílu. Nebo můžete zadat klíč oddílu a operace interně přeloží ID oddílu. Máte také možnost vybrat náhodný oddíl.

Chcete-li použít tuto pomocnou rutinu, vytvořte objekt PartitionSelector a vyberte oddíl pomocí jedné z metod Select*. Pak předejte objekt PartitionSelector rozhraní API, které ho vyžaduje. Pokud není vybraná žádná možnost, výchozí hodnota je náhodný oddíl.

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 je pomocná rutina vystavená v testovatelnosti a slouží k výběru repliky, na které se má provést jakákoli akce testovatelnosti. Můžete ho použít k výběru konkrétní repliky, pokud je ID repliky předem známé. Kromě toho máte možnost vybrat primární repliku nebo náhodnou sekundární. ReplikaSelector je odvozena z PartitionSelector, takže musíte vybrat repliku i oddíl, na kterém chcete provést operaci testovatelnosti.

Chcete-li použít tohoto pomocníka, vytvořte objekt ReplicaSelector a nastavte způsob, jakým chcete vybrat repliku a oddíl. Pak ho můžete předat do rozhraní API, které ho vyžaduje. Pokud není vybrána žádná možnost, výchozí hodnota je náhodný replika a náhodný oddíl.

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

Další kroky