Delen via


Testbaarheidsacties

Om een onbetrouwbare infrastructuur te simuleren, biedt Azure Service Fabric u, de ontwikkelaar, manieren om verschillende echte fouten 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 veelvoorkomende testscenario's die bestaan uit deze acties. We raden u ten zeerste aan deze ingebouwde scenario's te gebruiken, die zorgvuldig zijn gekozen om veelvoorkomende statusovergangen en foutcases 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 aangepast zijn op maat voor uw toepassing.

C#-implementaties van de acties vindt u in de System.Fabric.dll assembly. De System Fabric PowerShell-module vindt u in de Microsoft.ServiceFabric.Powershell.dll assembly. Als onderdeel van de runtime-installatie wordt de ServiceFabric PowerShell-module geïnstalleerd om gebruiksgemak mogelijk te maken.

Graceful versus ondankbaar foutacties

Testbaarheidsacties worden geclassificeerd in twee grote buckets:

  • Ondankbaar 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 plotseling. Dit betekent dat de status niet kan worden opgeschoond voordat de toepassing opnieuw wordt gestart.
  • Respijtieve fouten: deze fouten simuleren respijtieve acties, zoals verplaatsingen van replica's en druppels die worden geactiveerd door taakverdeling. In dergelijke gevallen krijgt de service een melding van de sluiting en kan de status opschonen voordat deze wordt afgesloten.

Voor een betere kwaliteitsvalidatie voert u de service- en bedrijfsworkload uit en zorgt u voor verschillende probleemloze en ondankbaar fouten. Onbeheerde fouten oefening scenario's waarbij het serviceproces plotseling 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 graceful fouten) testen dat de service correct reageert op replica's die worden verplaatst door Service Fabric. Deze tests verwerken de annulering in de RunAsync-methode. De service moet controleren of het annuleringstoken is ingesteld, de status correct opslaat en de Methode RunAsync afsluit.

Lijst met testbaarheidsacties

Actie Beschrijving Beheerde API PowerShell-cmdlet Probleemloze/ondanklijke 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 Sierlijk
InvokeQuorumLoss Hiermee wordt een bepaalde stateful servicepartitie in quorumverlies geplaatst. InvokeQuorumLossAsync Invoke-ServiceFabricQuorumLoss Sierlijk
MovePrimary Hiermee verplaatst u de opgegeven primaire replica van een stateful service naar het opgegeven clusterknooppunt. MovePrimaryAsync Move-ServiceFabricPrimaryReplica Sierlijk
MoveSecondary Hiermee verplaatst u de huidige secundaire replica van een stateful service naar een ander clusterknooppunt. MoveSecondaryAsync Move-ServiceFabricSecondaryReplica Sierlijk
MoveInstance Hiermee verplaatst u het huidige exemplaar van een stateless service naar een ander clusterknooppunt. MoveInstanceAsync Move-ServiceFabricInstance Sierlijk
RemoveReplica Simuleert een replicafout door een replica uit een cluster te verwijderen. Hiermee wordt de replica gesloten en wordt deze overgestapt op rol None, waarbij alle status van de replica uit het cluster wordt verwijderd. RemoveReplicaAsync Remove-ServiceFabricReplica Sierlijk
RestartDeployedCodePackage Simuleert een fout in het codepakketproces door een codepakket opnieuw te starten dat is geïmplementeerd op een knooppunt in een cluster. Hierdoor wordt het codepakketproces afgebroken, waarmee alle replica's van de gebruikersservice die in dat proces worden gehost, opnieuw worden gestart. RestartDeployedCodePackageAsync Restart-ServiceFabricDeployedCodePackage Ondankbaar
RestartNode Simuleert een Service Fabric-clusterknooppuntfout door een knooppunt opnieuw op te starten. RestartNodeAsync Restart-ServiceFabricNode Ondankbaar
RestartPartition Simuleert een black-out van een datacenter of een black-outscenario voor clusters door enkele of alle replica's van een partitie opnieuw op te starten. RestartPartitionAsync Restart-ServiceFabricPartition Sierlijk
RestartReplica Simuleert een replicafout door een persistente replica in een cluster opnieuw te starten, de replica te sluiten en deze vervolgens opnieuw te openen. RestartReplicaAsync Restart-ServiceFabricReplica Sierlijk
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 Ondankbaar
ValidateApplication Valideert de beschikbaarheid en status van alle Service Fabric-services binnen een toepassing, meestal na enige 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 leert u hoe u een testbaarheidsactie uitvoert met behulp van PowerShell. U leert hoe u een testbaarheidsactie uitvoert op een lokaal (een-box) cluster of een Azure-cluster. Microsoft.Fabric.Powershell.dll de Service Fabric PowerShell-module wordt automatisch geïnstalleerd wanneer u de Msi van Microsoft Service Fabric 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 voor een lokaal cluster, maakt u eerst verbinding met het cluster en opent u de PowerShell-prompt in de beheerdersmodus. Laten we de actie Restart-ServiceFabricNode bekijken.

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 deze niet moet controleren of de actie voor het opnieuw opstarten van het knooppunt daadwerkelijk is geslaagd. Als u de voltooiingsmodus opgeeft als 'Verifiëren', wordt gecontroleerd of de opstartactie daadwerkelijk is geslaagd. 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, als volgt:

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. Hierdoor wordt het Fabric.exe proces gestopt, waarmee alle systeemservice- en gebruikersservicereplica's die op dat knooppunt worden gehost, opnieuw worden opgestart. Met deze API kunt u uw service testen om fouten op te sporen in de paden voor failoverherstel. 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 naar 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) voor een Azure-cluster is vergelijkbaar met het uitvoeren van de actie voor een lokaal cluster. Het enige verschil is dat u voordat u de actie kunt uitvoeren, in plaats van eerst verbinding te maken met het lokale cluster, verbinding moet maken met het Azure-cluster.

Een testbaarheidsactie uitvoeren met 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. Verschillende parameters kunnen worden gebruikt om dezelfde actie uit te voeren. Als u de actie RestartServiceFabricNode bekijkt, kunt u deze op één manier uitvoeren met behulp van de knooppuntgegevens (naam van het knooppunt en de id van het knooppuntexemplaren) in het cluster.

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

Uitleg van parameters:

  • CompleteMode geeft aan dat de modus niet moet controleren of de herstartactie daadwerkelijk is geslaagd. Als u de voltooiingsmodus opgeeft als 'Verifiëren', wordt gecontroleerd of de opstartactie daadwerkelijk is geslaagd.
  • Met OperationTimeout wordt de hoeveelheid tijd ingesteld waarop de bewerking moet worden voltooid voordat er een TimeoutException-uitzondering wordt gegenereerd.
  • Met CancellationToken kan een in behandeling zijnde oproep 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 beschikbaar is 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 en met de bewerking wordt de partitie-id intern 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 waarvoor dit is vereist. Als er geen optie is geselecteerd, wordt standaard een willekeurige partitie gebruikt.

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 beschikbaar is in testbaarheid en wordt gebruikt om een replica te selecteren waarop een van de testbaarheidsacties moet worden uitgevoerd. Het 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. Daarom moet u 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 waarvoor deze is 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