Testbarhetsscenarier för Service Fabric: Tjänstkommunikation

Mikrotjänster och tjänstorienterade arkitekturformat visas naturligt i Azure Service Fabric. I dessa typer av distribuerade arkitekturer består komponentbaserade mikrotjänstprogram vanligtvis av flera tjänster som behöver prata med varandra. I även de enklaste fallen har du vanligtvis minst en tillståndslös webbtjänst och en tillståndskänslig datalagringstjänst som behöver kommunicera.

Tjänst-till-tjänst-kommunikation är en kritisk integrationspunkt för ett program, eftersom varje tjänst exponerar ett fjärranslutet API för andra tjänster. Att arbeta med en uppsättning API-gränser som omfattar I/O kräver vanligtvis viss försiktighet, med en stor mängd testning och validering.

Det finns många saker att tänka på när dessa tjänstgränser kopplas samman i ett distribuerat system:

  • Transportprotokoll. Kommer du att använda HTTP för ökad samverkan eller ett anpassat binärt protokoll för maximalt dataflöde?
  • Felhantering. Hur kommer permanenta och tillfälliga fel att hanteras? Vad händer när en tjänst flyttas till en annan nod?
  • Tidsgränser och svarstider. Hur hanterar varje tjänstskikt svarstid genom stacken och användaren i program med flera nivåer?

Oavsett om du använder någon av de inbyggda komponenterna för tjänstkommunikation som tillhandahålls av Service Fabric eller om du skapar en egen, är det viktigt att testa interaktionerna mellan dina tjänster för att säkerställa återhämtning i ditt program.

Förbereda för att tjänster ska flyttas

Tjänstinstanser kan röra sig över tid. Detta gäller särskilt när de konfigureras med belastningsmått för anpassad optimal resursbalansering. Service Fabric flyttar dina tjänstinstanser för att maximera deras tillgänglighet även under uppgraderingar, redundansväxlingar, utskalning och andra situationer som inträffar under livslängden för ett distribuerat system.

När tjänsterna flyttas runt i klustret bör dina klienter och andra tjänster vara beredda att hantera två scenarier när de pratar med en tjänst:

  • Tjänstinstansen eller partitionsrepliken har flyttats sedan du senast pratade med den. Detta är en normal del av en tjänstlivscykel och det bör förväntas ske under programmets livslängd.
  • Tjänstinstansen eller partitionsrepliken håller på att flyttas. Även om redundansväxling av en tjänst från en nod till en annan sker mycket snabbt i Service Fabric, kan det uppstå en fördröjning i tillgängligheten om kommunikationskomponenten för tjänsten är långsam att starta.

Att hantera dessa scenarier på ett smidigt sätt är viktigt för ett smidigt system. Det gör du genom att tänka på att:

  • Varje tjänst som kan anslutas till har en adress som den lyssnar på (till exempel HTTP eller WebSockets). När en tjänstinstans eller partition flyttas ändras dess adressslutpunkt. (Den flyttas till en annan nod med en annan IP-adress.) Om du använder de inbyggda kommunikationskomponenterna hanterar de återlösande tjänstadresser åt dig.
  • Det kan uppstå en tillfällig ökning av tjänstfördröjningen när tjänstinstansen startar upp lyssnaren igen. Detta beror på hur snabbt tjänsten öppnar lyssnaren när tjänstinstansen har flyttats.
  • Alla befintliga anslutningar måste stängas och öppnas igen när tjänsten öppnas på en ny nod. En graciös nodavstängning eller omstart gör att befintliga anslutningar kan stängas av på ett smidigt sätt.

Testa det: Flytta tjänstinstanser

Genom att använda Testability Tools i Service Fabric kan du skapa ett testscenario för att testa dessa situationer på olika sätt:

  1. Flytta en tillståndskänslig tjänsts primära replik.

    Den primära repliken av en tillståndskänslig tjänstpartition kan flyttas av valfritt antal orsaker. Använd detta för att rikta in dig på den primära repliken av en specifik partition för att se hur dina tjänster reagerar på flytten på ett mycket kontrollerat sätt.

    
    PS > Move-ServiceFabricPrimaryReplica -PartitionId 6faa4ffa-521a-44e9-8351-dfca0f7e0466 -ServiceName fabric:/MyApplication/MyService
    
    
  2. Stoppa en nod.

    När en nod stoppas flyttar Service Fabric alla tjänstinstanser eller partitioner som fanns på noden till en av de andra tillgängliga noderna i klustret. Använd detta för att testa en situation där en nod går förlorad från klustret och alla tjänstinstanser och repliker på noden måste flyttas.

    Du kan stoppa en nod med hjälp av cmdleten PowerShell Stop-ServiceFabricNode :

    
    PS > Stop-ServiceFabricNode -NodeName Node_1
    
    

Underhålla tjänstens tillgänglighet

Som plattform är Service Fabric utformat för att ge hög tillgänglighet för dina tjänster. Men i extrema fall kan underliggande infrastrukturproblem fortfarande orsaka otillgänglighet. Det är också viktigt att testa för dessa scenarier.

Tillståndskänsliga tjänster använder ett kvorumbaserat system för att replikera tillstånd för hög tillgänglighet. Det innebär att ett kvorum med repliker måste vara tillgängligt för att kunna utföra skrivåtgärder. I sällsynta fall, till exempel ett omfattande maskinvarufel, kanske ett kvorum med repliker inte är tillgängligt. I dessa fall kommer du inte att kunna utföra skrivåtgärder, men du kommer fortfarande att kunna utföra läsåtgärder.

Testa det: Skrivåtgärden är otillgänglig

Genom att använda testverktygen i Service Fabric kan du mata in ett fel som leder till kvorumförlust som ett test. Även om ett sådant scenario är sällsynt är det viktigt att klienter och tjänster som är beroende av en tillståndskänslig tjänst är beredda att hantera situationer där de inte kan göra skrivbegäranden till den. Det är också viktigt att den tillståndskänsliga tjänsten själv är medveten om den här möjligheten och kan kommunicera den med anropare på ett smidigt sätt.

Du kan orsaka kvorumförlust med hjälp av cmdleten PowerShell Invoke-ServiceFabricPartitionQuorumLoss :


PS > Invoke-ServiceFabricPartitionQuorumLoss -ServiceName fabric:/Myapplication/MyService -QuorumLossMode QuorumReplicas -QuorumLossDurationInSeconds 20

I det här exemplet anger QuorumLossMode vi att QuorumReplicas vi vill inducera kvorumförlust utan att ta bort alla repliker. På så sätt är läsåtgärder fortfarande möjliga. Om du vill testa ett scenario där en hel partition inte är tillgänglig kan du ställa in den här växeln på AllReplicas.

Nästa steg

Läs mer om testbarhetsåtgärder

Läs mer om testbarhetsscenarier