Share via


Azure Service Fabric-värdmodell

Den här artikeln innehåller en översikt över programvärdmodeller som tillhandahålls av Azure Service Fabric och beskriver skillnaderna mellan modellerna Delad process och Exklusiv process . Den beskriver hur ett distribuerat program ser ut på en Service Fabric-nod och relationen mellan repliker (eller instanser) av tjänsten och processen för tjänstvärd.

Innan du fortsätter måste du vara säker på att du förstår de olika begreppen och relationerna som förklaras i Modellera ett program i Service Fabric.

Anteckning

I den här artikeln, såvida inte uttryckligen nämns som något annat:

  • Repliken refererar till både en replik av en tillståndskänslig tjänst och en instans av en tillståndslös tjänst.
  • CodePackage behandlas som likvärdigt med en ServiceHost-process som registrerar en ServiceType och är värd för repliker av tjänster av den ServiceType.

För att förstå värdmodellen ska vi gå igenom ett exempel. Anta att vi har en ApplicationType 'MyAppType', som har en ServiceType 'MyServiceType'. "MyServiceType" tillhandahålls av ServicePackage "MyServicePackage", som har ett CodePackage "MyCodePackage". "MyCodePackage" registrerar ServiceType "MyServiceType" när den körs.

Anta att vi har ett kluster med tre noder och vi skapar en programinfrastrukturresurs:/App1 av typen "MyAppType". I den här programinfrastrukturen:/App1 skapar vi en service fabric:/App1/ServiceA av typen "MyServiceType". Den här tjänsten har två partitioner (till exempel P1 och P2) och tre repliker per partition. Följande diagram visar vyn för det här programmet när det distribueras på en nod.

Diagram som visar vyn för det här programmet när det distribueras på en nod.

Service Fabric aktiverade "MyServicePackage", som startade "MyCodePackage", som är värd för repliker från båda partitionerna. Alla noder i klustret har samma vy eftersom vi valde att antalet repliker per partition ska vara lika med antalet noder i klustret. Nu ska vi skapa en annan tjänst, fabric:/App1/ServiceB, i programinfrastrukturen:/App1. Den här tjänsten har en partition (till exempel P3) och tre repliker per partition. Följande diagram visar den nya vyn på noden:

Diagram som visar den nya vyn på noden.

Service Fabric placerade den nya repliken för partition P3 i Service Fabric:/App1/ServiceB i den befintliga aktiveringen av "MyServicePackage". Nwo. nu ska vi skapa en annan programinfrastruktur:/App2 av typen "MyAppType". I infrastrukturresurser:/App2 skapar du en service fabric:/App2/ServiceA. Den här tjänsten har två partitioner (P4 och P5) och tre repliker per partition. Följande diagram visar den nya nodvyn:

Diagram som visar den nya nodvyn.

Service Fabric aktiverar en ny kopia av "MyServicePackage", som startar en ny kopia av "MyCodePackage". Repliker från båda partitionerna i Service Fabric:/App2/ServiceA (P4 och P5) placeras i den nya kopian "MyCodePackage".

Modell för delad process

I föregående avsnitt beskrivs standardvärdmodellen som tillhandahålls av Service Fabric, som kallas modellen för delad process. I den här modellen för ett visst program aktiveras endast en kopia av en viss ServicePackage på en nod (som startar alla CodePackages som finns i den). Alla repliker av alla tjänster i en viss ServiceType placeras i CodePackage som registrerar servicetypen. Med andra ord delar alla repliker av alla tjänster på en nod i en viss ServiceType samma process.

Exklusiv processmodell

Den andra värdmodellen som tillhandahålls av Service Fabric är exklusiv processmodell. I den här modellen, på en viss nod, lever varje replik i sin egen dedikerade process. Service Fabric aktiverar en ny kopia av ServicePackage (som startar alla CodePackages som finns i den). Repliker placeras i CodePackage som registrerade ServiceType för tjänsten som repliken tillhör.

Om du använder Service Fabric version 5.6 eller senare kan du välja modellen Exklusiv process när du skapar en tjänst (med hjälp av PowerShell, REST eller FabricClient). Ange ServicePackageActivationMode som "ExclusiveProcess".

PS C:\>New-ServiceFabricService -ApplicationName "fabric:/App1" -ServiceName "fabric:/App1/ServiceA" -ServiceTypeName "MyServiceType" -Stateless -PartitionSchemeSingleton -InstanceCount -1 -ServicePackageActivationMode "ExclusiveProcess"
var serviceDescription = new StatelessServiceDescription
{
    ApplicationName = new Uri("fabric:/App1"),
    ServiceName = new Uri("fabric:/App1/ServiceA"),
    ServiceTypeName = "MyServiceType",
    PartitionSchemeDescription = new SingletonPartitionSchemeDescription(),
    InstanceCount = -1,
    ServicePackageActivationMode = ServicePackageActivationMode.ExclusiveProcess
};

var fabricClient = new FabricClient(clusterEndpoints);
await fabricClient.ServiceManager.CreateServiceAsync(serviceDescription);

Om du har en standardtjänst i programmanifestet kan du välja modellen Exklusiv process genom att ange attributet ServicePackageActivationMode :

<DefaultServices>
  <Service Name="MyService" ServicePackageActivationMode="ExclusiveProcess">
    <StatelessService ServiceTypeName="MyServiceType" InstanceCount="1">
      <SingletonPartition/>
    </StatelessService>
  </Service>
</DefaultServices>

Nu ska vi skapa en annan tjänst, fabric:/App1/ServiceC, i application fabric:/App1. Den här tjänsten har två partitioner (till exempel P6 och P7) och tre repliker per partition. Du anger ServicePackageActivationMode till "ExclusiveProcess". Följande diagram visar ny vy på noden:

Diagram över nodvyn för distribuerat program

Som du ser aktiverade Service Fabric två nya kopior av "MyServicePackage" (en för varje replik från partitionen P6 och P7). Service Fabric placerade varje replik i sin dedikerade kopia av CodePackage. När du använder modellen Exklusiv process kan flera kopior av en viss ServicePackage vara aktiva på en nod för ett visst program. I föregående exempel är tre kopior av "MyServicePackage" aktiva för infrastrukturresurser:/App1. Var och en av dessa aktiva kopior av "MyServicePackage" har ett ServicePackageActivationId associerat med det. Det här ID:t identifierar den kopian i application fabric:/App1.

När du bara använder modellen för delad process för ett program finns det bara en aktiv kopia av ServicePackage på en nod. ServicePackageActivationId för den här aktiveringen av ServicePackage är en tom sträng. Detta är till exempel fallet med fabric:/App2.

Anteckning

  • Värdmodellen för delad process motsvarar ServicePackageActivationMode är lika med SharedProcess. Det här är standardvärdmodellen och ServicePackageActivationMode behöver inte anges när tjänsten skapas.

  • Värdmodellen Exklusiv process motsvarar ServicePackageActivationMode är lika med ExclusiveProcess. Om du vill använda den här inställningen bör du uttryckligen ange den när tjänsten skapas.

  • Om du vill visa värdmodellen för en tjänst frågar du tjänstbeskrivningen och tittar på värdet för ServicePackageActivationMode.

Arbeta med ett distribuerat tjänstpaket

En aktiv kopia av en ServicePackage på en nod kallas för ett distribuerat tjänstpaket. När du använder modellen Exklusiv process för att skapa tjänster kan det finnas flera distribuerade tjänstpaket för samma ServicePackage för ett visst program. Om du utför åtgärder som är specifika för ett distribuerat tjänstpaket bör du ange ServicePackageActivationId för att identifiera ett specifikt distribuerat tjänstpaket. Ange till exempel ID:t om du rapporterar hälsotillståndet för ett distribuerat tjänstpaket eller startar om kodpaketet för ett distribuerat tjänstpaket.

Du kan ta reda på ServicePackageActivationId för ett distribuerat tjänstpaket genom att fråga listan över distribuerade tjänstpaket på en nod. När du frågar efter de distribuerade tjänsttyperna, distribuerade repliker och distribuerade kodpaket på en nod innehåller frågeresultatet även ServicePackageActivationId för det överordnade distribuerade tjänstpaketet.

Anteckning

  • Under värdmodellen Delad process aktiveras endast en kopia av en ServicePackage på en viss nod för ett visst program. Den har ett ServicePackageActivationId som är lika med en tom sträng och behöver inte anges när åtgärder som är relaterade till det distribuerade tjänstpaketet utförs.

  • Under värdmodellen Exklusiv process kan en eller flera kopior av ett ServicePackage vara aktiva på en viss nod för ett visst program. Varje aktivering har ett icke-tomtServicePackageActivationId som anges när åtgärder som är relaterade till det distribuerade tjänstpaketet utförs.

  • Om ServicePackageActivationId utelämnas är standardsträngen tom. Om det finns ett distribuerat tjänstpaket som har aktiverats under modellen för delad process utförs åtgärden på den. Annars misslyckas åtgärden.

  • Fråga inte en gång och cachelagrade inte ServicePackageActivationId. ID:t genereras dynamiskt och kan ändras av olika skäl. Innan du utför en åtgärd som behöver ServicePackageActivationId bör du först fråga listan över distribuerade tjänstpaket på en nod. Använd sedan ServicePackageActivationId från frågeresultatet för att utföra den ursprungliga åtgärden.

Körbara gästprogram och containerprogram

Service Fabric behandlar körbara gästprogram och containerprogram som tillståndslösa tjänster, som är fristående. Det finns ingen Service Fabric-körning i ServiceHost (en process eller container). Eftersom dessa tjänster är fristående gäller inte antalet repliker per ServiceHost för dessa tjänster. Den vanligaste konfigurationen som används med dessa tjänster är en partition, med InstanceCount lika med -1 (en kopia av tjänstkoden som körs på varje nod i klustret).

StandardtjänstenPackageActivationMode för dessa tjänster är SharedProcess. I så fall aktiverar Service Fabric bara en kopia av ServicePackage på en nod för ett visst program. Det innebär att endast en kopia av tjänstkoden kör en nod. Om du vill att flera kopior av tjänstkoden ska köras på en nod anger du ServicePackageActivationMode som ExclusiveProcess när tjänsten skapas. Du kan till exempel göra detta när du skapar flera tjänster (Service1 till ServiceN) av ServiceType (anges i ServiceManifest) eller när tjänsten är flera partitionerad.

Ändra värdmodellen för en befintlig tjänst

För närvarande kan du inte ändra värdmodellen för en befintlig tjänst från Delad process till Exklusiv process (eller vice versa).

Välj mellan värdmodellerna

Du bör utvärdera vilken värdmodell som passar dina behov bäst. Modellen delad process använder operativsystemresurser bättre eftersom färre processer skapas och flera repliker i samma process kan dela portar. Men om en av replikerna har ett fel där den behöver ta ned tjänstvärden, påverkar det alla andra repliker i samma process.

Modellen Exklusiv process ger bättre isolering, med varje replik i sin egen process. Om en av replikerna har ett fel påverkar det inte andra repliker. Den här modellen är användbar för fall där portdelning inte stöds av kommunikationsprotokollet. Det underlättar möjligheten att tillämpa resursstyrning på repliknivå. Den exklusiva processen förbrukar dock fler operativsystemresurser eftersom den skapar en process för varje replik på noden.

Överväganden för exklusiv processmodell och programmodell

För de flesta program kan du modellera ditt program i Service Fabric genom att behålla en ServiceType per ServicePackage.

I vissa fall tillåter Service Fabric också mer än en ServiceType per ServicePackage (och en CodePackage kan registrera fler än en ServiceType). Följande är några av de scenarier där dessa konfigurationer kan vara användbara:

  • Du vill optimera resursutnyttjandet genom att skapa färre processer och ha högre repliktäthet per process.
  • Repliker från olika ServiceTypes måste dela vissa vanliga data som har en hög initierings- eller minneskostnad.
  • Du har ett kostnadsfritt tjänsterbjudande och du vill begränsa resursutnyttjandet genom att placera alla repliker av tjänsten i samma process.

Värdmodellen exklusiv process är inte konsekvent med en programmodell som har flera ServiceTypes per ServicePackage. Detta beror på att flera ServiceTypes per ServicePackage är utformade för att uppnå högre resursdelning mellan repliker och möjliggör högre replikdensitet per process. Exklusiv processmodell är utformad för att uppnå olika resultat.

Överväg fallet med flera ServiceTypes per ServicePackage, där olika CodePackage registrerar varje ServiceType. Anta att vi har en ServicePackage "MultiTypeServicePackage", som har två CodePackages:

  • "MyCodePackageA", som registrerar ServiceType 'MyServiceTypeA'.
  • "MyCodePackageB", som registrerar ServiceType "MyServiceTypeB".

Anta nu att vi skapar ett program, fabric:/SpecialApp. I infrastrukturresurser:/SpecialApp skapar vi följande två tjänster med modellen Exklusiv process:

  • Service fabric:/SpecialApp/ServiceA av typen "MyServiceTypeA", med två partitioner (till exempel P1 och P2) och tre repliker per partition.
  • Service fabric:/SpecialApp/ServiceB av typen "MyServiceTypeB", med två partitioner (P3 och P4) och tre repliker per partition.

På en viss nod har båda tjänsterna två repliker vardera. Eftersom vi använde modellen Exklusiv process för att skapa tjänsterna aktiverar Service Fabric en ny kopia av "MyServicePackage" för varje replik. Varje aktivering av "MultiTypeServicePackage" startar en kopia av "MyCodePackageA" och "MyCodePackageB". Men bara en av "MyCodePackageA" eller "MyCodePackageB" är värd för repliken som MultiTypeServicePackage har aktiverats för. Följande diagram visar nodvyn:

Diagram som visar nodvyn.

I aktiveringen av "MultiTypeServicePackage" för repliken av partition P1 i Service Fabric:/SpecialApp/ServiceA är "MyCodePackageA" värd för repliken. "MyCodePackageB" körs. I aktiveringen av "MultiTypeServicePackage" för repliken av partition P3 i Service Fabric:/SpecialApp/ServiceB är "MyCodePackageB" värd för repliken. "MyCodePackageA" körs. Ju större antal CodePackages (registrera olika ServiceTypes) per ServicePackage, desto högre är den redundanta resursanvändningen.

Men om vi skapar services fabric:/SpecialApp/ServiceA och fabric:/SpecialApp/ServiceB med modellen Delad process aktiverar Service Fabric bara en kopia av "MultiTypeServicePackage" för programinfrastrukturen:/SpecialApp. "MyCodePackageA" är värd för alla repliker för service fabric:/SpecialApp/ServiceA. "MyCodePackageB" är värd för alla repliker för service fabric:/SpecialApp/ServiceB. Följande diagram visar nodvyn i den här inställningen:

Diagram över nodvyn för distribuerat program

I föregående exempel kanske du tror att om "MyCodePackageA" registrerar både "MyServiceTypeA" och "MyServiceTypeB", och det inte finns någon "MyCodePackageB", så finns det ingen redundant CodePackage som körs. Även om detta är korrekt överensstämmer inte den här programmodellen med värdmodellen Exklusiv process. Om målet är att placera varje replik i sin egen dedikerade process behöver du inte registrera båda ServiceTypes från samma CodePackage. I stället placerar du helt enkelt varje ServiceType i sitt eget ServicePackage.

Reliable Services och aktörsförgreningsunderprocesser

Service Fabric stöder inte tillförlitliga tjänster och därefter tillförlitliga aktörer som förgrenar underprocesser. Ett exempel på varför det inte stöds är CodePackageActivationContext kan inte användas för att registrera en underprocess som inte stöds, och annulleringstoken skickas endast till registrerade processer. resulterar i alla typer av problem, till exempel uppgraderingsfel, när underprocesser inte stängs när den överordnade processen har tagit emot en annulleringstoken.

Nästa steg

Paketera ett program och gör det redo att distribuera.

Distribuera och ta bort program. Den här artikeln beskriver hur du använder PowerShell för att hantera programinstanser.