Testbaarheidsacties

Om een onbetrouwbare infrastructuur te simuleren, biedt Azure Service Fabric u, de ontwikkelaar, manieren om verschillende fouten in de echte wereld en statusovergangen te simuleren. Deze worden weergegeven als testbaarheidsacties. De acties zijn de API's op laag niveau die een specifieke foutinjectie, statusovergang of validatie veroorzaken. Door deze acties te combineren, kunt u uitgebreide testscenario's schrijven voor uw services.

Service Fabric biedt enkele algemene testscenario's die bestaan uit deze acties. We raden u ten zeerste aan gebruik te maken van deze ingebouwde scenario's, die zorgvuldig zijn gekozen om algemene statusovergangen en foutgevallen te testen. Acties kunnen echter worden gebruikt om aangepaste testscenario's te maken wanneer u dekking wilt toevoegen voor scenario's die nog niet worden gedekt door de ingebouwde scenario's of die zijn aangepast voor uw toepassing.

C#-implementaties van de acties zijn te vinden in de System.Fabric.dll assembly. De System Fabric PowerShell-module is te vinden in de Microsoft.ServiceFabric.Powershell.dll assembly. Als onderdeel van de runtime-installatie wordt de ServiceFabric PowerShell-module geïnstalleerd voor gebruiksgemak.

Sierlijke versus ondankbaar foutacties

Testbaarheidsacties worden ingedeeld in twee belangrijke buckets:

  • Foutieve fouten: deze fouten simuleren fouten zoals het opnieuw opstarten van de machine en het vastlopen van processen. In dergelijke gevallen van fouten stopt de uitvoeringscontext van het proces abrupt. Dit betekent dat er geen opschoning van de status kan worden uitgevoerd voordat de toepassing opnieuw wordt gestart.
  • Probleemloze fouten: deze fouten simuleren sierlijke acties, zoals replica-verplaatsingen en -dalingen die worden geactiveerd door taakverdeling. In dergelijke gevallen krijgt de service een melding van de sluiting en kan de status worden opgeschoond voordat deze wordt afgesloten.

Voor een betere kwaliteitsvalidatie voert u de service- en bedrijfsworkload uit, waarbij u verschillende sierlijke en ondankbaar fouten opwek. Ungraceful fouten oefening scenario's waarbij het serviceproces abrupt wordt afgesloten in het midden van een werkstroom. Hiermee wordt het herstelpad getest zodra de servicereplica is hersteld door Service Fabric. Dit helpt bij het testen van gegevensconsistentie en of de servicestatus correct wordt onderhouden na fouten. De andere set fouten (de probleemloze fouten) test of de service correct reageert op replica's die door Service Fabric worden verplaatst. Hiermee wordt de verwerking van annulering in de RunAsync-methode getest. De service moet controleren op het annuleringstoken dat wordt ingesteld, de status correct opslaan en de RunAsync-methode afsluiten.

Lijst met testbaarheidsacties

Actie Beschrijving Beheerde API PowerShell-cmdlet Sierlijke/ondankbaar fouten
CleanTestState Hiermee verwijdert u alle teststatus uit het cluster in het geval van een ongeldige afsluiting van het teststuurprogramma. CleanTestStateAsync Remove-ServiceFabricTestState Niet van toepassing
InvokeDataLoss Veroorzaakt gegevensverlies in een servicepartitie. InvokeDataLossAsync Invoke-ServiceFabricPartitionDataLoss Sierlijke
InvokeQuorumLoss Hiermee wordt een bepaalde stateful servicepartitie in quorumverlies geplaatst. InvokeQuorumLossAsync Invoke-ServiceFabricQuorumLoss Sierlijke
MovePrimary Verplaatst de opgegeven primaire replica van een stateful service naar het opgegeven clusterknooppunt. MovePrimaryAsync Move-ServiceFabricPrimaryReplica Sierlijke
MoveSecondary Verplaatst de huidige secundaire replica van een stateful service naar een ander clusterknooppunt. MoveSecondaryAsync Move-ServiceFabricSecondaryReplica Sierlijke
MoveInstance Verplaatst het huidige exemplaar van een stateless service naar een ander clusterknooppunt. MoveInstanceAsync Move-ServiceFabricInstance Sierlijke
RemoveReplica Simuleert een replicafout door een replica uit een cluster te verwijderen. Hiermee wordt de replica gesloten en wordt deze overgezet naar de rol 'Geen', waarbij alle statussen uit het cluster worden verwijderd. RemoveReplicaAsync Remove-ServiceFabricReplica Sierlijke
RestartDeployedCodePackage Simuleert een fout in een codepakketproces door een codepakket opnieuw te starten dat is geïmplementeerd op een knooppunt in een cluster. Hiermee wordt het codepakketproces afgebroken, waardoor alle replica's van de gebruikersservice die in dat proces worden gehost, opnieuw worden gestart. RestartDeployedCodePackageAsync Restart-ServiceFabricDeployedCodePackage Ungraceful
RestartNode Simuleert een fout in een Service Fabric-clusterknooppunt door een knooppunt opnieuw op te starten. RestartNodeAsync Restart-ServiceFabricNode Ungraceful
RestartPartition Simuleert een scenario voor een black-out of cluster black-out van een datacenter door sommige of alle replica's van een partitie opnieuw op te starten. RestartPartitionAsync Restart-ServiceFabricPartition Sierlijke
RestartReplica Simuleert een replicafout door een persistente replica in een cluster opnieuw te starten, de replica te sluiten en opnieuw te openen. RestartReplicaAsync Restart-ServiceFabricReplica Sierlijke
StartNode Hiermee start u een knooppunt in een cluster dat al is gestopt. StartNodeAsync Start-ServiceFabricNode Niet van toepassing
StopNode Simuleert een knooppuntfout door een knooppunt in een cluster te stoppen. Het knooppunt blijft offline totdat StartNode wordt aangeroepen. StopNodeAsync Stop-ServiceFabricNode Ungraceful
ValidateApplication Valideert de beschikbaarheid en status van alle Service Fabric-services binnen een toepassing, meestal na het veroorzaken van een fout in het systeem. ValidateApplicationAsync Test-ServiceFabricApplication Niet van toepassing
ValidateService Valideert de beschikbaarheid en status van een Service Fabric-service, meestal na het veroorzaken van een fout in het systeem. ValidateServiceAsync Test-ServiceFabricService Niet van toepassing

Een testbaarheidsactie uitvoeren met behulp van PowerShell

In deze zelfstudie ziet u hoe u een testbaarheidsactie uitvoert met behulp van PowerShell. U leert hoe u een testbaarheidsactie uitvoert op een lokaal (one-box) cluster of een Azure-cluster. Microsoft.Fabric.Powershell.dll, de Service Fabric PowerShell-module, wordt automatisch geïnstalleerd wanneer u de Microsoft Service Fabric MSI installeert. De module wordt automatisch geladen wanneer u een PowerShell-prompt opent.

Zelfstudiesegmenten:

Een actie uitvoeren op een one-box-cluster

Als u een testbaarheidsactie wilt uitvoeren op een lokaal cluster, maakt u eerst verbinding met het cluster en opent u de PowerShell-prompt in de beheerdersmodus. Laten we eens kijken naar de actie Restart-ServiceFabricNode .

Restart-ServiceFabricNode -NodeName Node1 -CompletionMode DoNotVerify

Hier wordt de actie Restart-ServiceFabricNode uitgevoerd op een knooppunt met de naam 'Node1'. De voltooiingsmodus geeft aan dat niet mag worden gecontroleerd of de actie opnieuw opstarten van het knooppunt daadwerkelijk is geslaagd. Als u de voltooiingsmodus opgeeft als 'Verifiëren', wordt gecontroleerd of de actie voor opnieuw opstarten daadwerkelijk is geslaagd. In plaats van het knooppunt rechtstreeks op te geven op basis van de naam, kunt u het als volgt opgeven via een partitiesleutel en het type replica:

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

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

Restart-ServiceFabricNode moet worden gebruikt om een Service Fabric-knooppunt in een cluster opnieuw op te starten. Hiermee stopt het Fabric.exe-proces, waardoor alle systeemservice- en gebruikersservicereplica's die op dat knooppunt worden gehost, opnieuw worden gestart. Als u deze API gebruikt om uw service te testen, kunt u fouten in de herstelpaden voor failovers ontdekken. Hiermee kunt u knooppuntfouten in het cluster simuleren.

In de volgende schermopname ziet u de testbaarheidsopdracht Restart-ServiceFabricNode in actie.

Schermopname van het uitvoeren van de opdracht Restart-ServiceFabricNode in PowerShell.

De uitvoer van de eerste Get-ServiceFabricNode (een cmdlet van de Service Fabric PowerShell-module) laat zien dat het lokale cluster vijf knooppunten heeft: Node.1 tot Node.5. Nadat de testbaarheidsactie (cmdlet) Restart-ServiceFabricNode is uitgevoerd op het knooppunt met de naam Node.4, zien we dat de uptime van het knooppunt opnieuw is ingesteld.

Een actie uitvoeren op een Azure-cluster

Het uitvoeren van een testbaarheidsactie (met behulp van PowerShell) op een Azure-cluster is vergelijkbaar met het uitvoeren van de actie op een lokaal cluster. Het enige verschil is dat u, voordat u de actie kunt uitvoeren, in plaats van verbinding te maken met het lokale cluster, eerst verbinding moet maken met het Azure-cluster.

Een testbaarheidsactie uitvoeren met behulp van C #

Als u een testbaarheidsactie wilt uitvoeren met behulp van C#, moet u eerst verbinding maken met het cluster met behulp van FabricClient. Haal vervolgens de parameters op die nodig zijn om de actie uit te voeren. Er kunnen verschillende parameters worden gebruikt om dezelfde actie uit te voeren. Als u de actie RestartServiceFabricNode bekijkt, kunt u deze onder andere uitvoeren met behulp van de knooppuntgegevens (knooppuntnaam en knooppuntexemplaar-id) in het cluster.

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

Uitleg van parameters:

  • CompleteMode geeft aan dat de modus niet mag controleren of de actie voor opnieuw opstarten daadwerkelijk is geslaagd. Als u de voltooiingsmodus opgeeft als 'Verifiëren', wordt gecontroleerd of de actie voor opnieuw opstarten daadwerkelijk is geslaagd.
  • OperationTimeout stelt de hoeveelheid tijd in voordat de bewerking moet worden voltooid voordat een TimeoutException-uitzondering wordt gegenereerd.
  • Met CancellationToken kan een aanroep in behandeling worden geannuleerd.

In plaats van het knooppunt rechtstreeks op te geven op basis van de naam, kunt u het opgeven via een partitiesleutel en het type replica.

Zie PartitionSelector en ReplicaSelector voor meer informatie.

// 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 en ReplicaSelector

PartitionSelector

PartitionSelector is een helper die wordt weergegeven in testbaarheid en wordt gebruikt om een specifieke partitie te selecteren waarop een van de testbaarheidsacties moet worden uitgevoerd. Het kan worden gebruikt om een specifieke partitie te selecteren als de partitie-id van tevoren bekend is. U kunt ook de partitiesleutel opgeven, waarna de partitie-id intern wordt omgezet. U kunt ook een willekeurige partitie selecteren.

Als u deze helper wilt gebruiken, maakt u het PartitionSelector-object en selecteert u de partitie met behulp van een van de Select*-methoden. Geef vervolgens het PartitionSelector-object door aan de API die dit vereist. Als er geen optie is geselecteerd, wordt deze standaard ingesteld op een willekeurige partitie.

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 is een helper die wordt weergegeven in testbaarheid en wordt gebruikt om een replica te selecteren waarop een van de testbaarheidsacties moet worden uitgevoerd. Deze kan worden gebruikt om een specifieke replica te selecteren als de replica-id van tevoren bekend is. Daarnaast hebt u de mogelijkheid om een primaire replica of een willekeurige secundaire replica te selecteren. ReplicaSelector is afgeleid van PartitionSelector, dus u moet zowel de replica als de partitie selecteren waarop u de testbaarheidsbewerking wilt uitvoeren.

Als u deze helper wilt gebruiken, maakt u een ReplicaSelector-object en stelt u de manier in waarop u de replica en de partitie wilt selecteren. U kunt deze vervolgens doorgeven aan de API die dit vereist. Als er geen optie is geselecteerd, wordt standaard een willekeurige replica en willekeurige partitie gebruikt.

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

Volgende stappen