RunToCompletion
Från och med version 7.1 stöder Service Fabric RunToCompletion-semantik för containrar och körbara gästprogram. Dessa semantik möjliggör program och tjänster som slutför en uppgift och avslutar, till skillnad från att alltid köra program och tjänster.
Innan du fortsätter med den här artikeln bör du känna till Service Fabric-programmodellen och Service Fabric-värdmodellen.
Kommentar
RunToCompletion-semantik stöds inte för tjänster som använder programmeringsmodellen Reliable Services .
RunToCompletion-semantik och specifikation
Du kan ange RunToCompletion-semantik som en ExecutionPolicy
när du importerar ServiceManifest. Alla CodePackages som består av ServiceManifest ärver den angivna principen. Följande kodfragment från ApplicationManifest.xml innehåller ett exempel:
<ServiceManifestImport>
<ServiceManifestRef ServiceManifestName="RunToCompletionServicePackage" ServiceManifestVersion="1.0"/>
<Policies>
<ExecutionPolicy Type="RunToCompletion" Restart="OnFailure"/>
</Policies>
</ServiceManifestImport>
ExecutionPolicy
tillåter två attribut:
Type
harRunToCompletion
som det enda tillåtna värdet.Restart
anger den omstartsprincip som ska tillämpas på CodePackages i ServicePackage vid fel. En CodePackage som avslutas med en slutkod som inte är noll anses ha misslyckats. Tillåtna värden för det här attributet ärOnFailure
ochNever
, medOnFailure
som standard.Med omstartsprincipen inställd på
OnFailure
, startar alla CodePackage som misslyckas med en slutkod som inte är noll, med back-offs mellan upprepade fel.Med omstartsprincipen inställd på
Never
, om någon CodePackage misslyckas, är distributionsstatusen för DeployedServicePackage markerad som Misslyckad, men andra CodePackages fortsätter att köras.
Om alla CodePackages i ServicePackage körs till slutförd med slutkoden 0
markeras distributionsstatusen för DeployedServicePackage som RanToCompletion.
Kodexempel med RunToCompletion-semantik
Nu ska vi titta på ett fullständigt exempel som använder RunToCompletion-semantik.
Viktigt!
I följande exempel förutsätter vi att du är bekant med att skapa Windows-containerprogram med Hjälp av Service Fabric och Docker.
Windows Server-containrar är inte kompatibla i alla versioner av ett värdoperativsystem. Det här exemplet refererar till mcr.microsoft.com/windows/nanoserver:1809
. Mer information finns i Windows-containerversionskompatibilitet.
Följande ServiceManifest.xml beskriver en ServicePackage som består av två CodePackages, som representerar containrar. RunToCompletionCodePackage1
loggar bara ett meddelande till stdout och avslutar. RunToCompletionCodePackage2
pingar loopback-adressen ett tag och avslutas sedan med en slutkod på antingen 0
, 1
eller 2
.
<?xml version="1.0" encoding="UTF-8"?>
<ServiceManifest Name="WindowsRunToCompletionServicePackage" Version="1.0" xmlns="http://schemas.microsoft.com/2011/01/fabric" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Description>Windows RunToCompletion Service</Description>
<ServiceTypes>
<StatelessServiceType ServiceTypeName="WindowsRunToCompletionServiceType" UseImplicitHost="true"/>
</ServiceTypes>
<CodePackage Name="RunToCompletionCodePackage1" Version="1.0">
<EntryPoint>
<ContainerHost>
<ImageName>mcr.microsoft.com/windows/nanoserver:1809</ImageName>
<Commands>/c,echo Hi from RunToCompletionCodePackage1 && exit 0</Commands>
<EntryPoint>cmd</EntryPoint>
</ContainerHost>
</EntryPoint>
</CodePackage>
<CodePackage Name="RunToCompletionCodePackage2" Version="1.0">
<EntryPoint>
<ContainerHost>
<ImageName>mcr.microsoft.com/windows/nanoserver:1809</ImageName>
<Commands>/v,/c,ping 127.0.0.1 && set /a exitCode=%random% % 3 && exit !exitCode!</Commands>
<EntryPoint>cmd</EntryPoint>
</ContainerHost>
</EntryPoint>
</CodePackage>
</ServiceManifest>
Följande ApplicationManifest.xml beskriver ett program baserat på de ServiceManifest.xml som beskrivs ovan. Koden anger RunToCompletion ExecutionPolicy för WindowsRunToCompletionServicePackage
med en omstartsprincip på OnFailure
.
Vid WindowsRunToCompletionServicePackage
aktivering startas dess komponenter CodePackages. RunToCompletionCodePackage1
avslutas vid den första aktiveringen. RunToCompletionCodePackage2
kan misslyckas med en slutkod som inte är noll och startas om eftersom omstartsprincipen är OnFailure
.
<?xml version="1.0" encoding="UTF-8"?>
<ApplicationManifest ApplicationTypeName="WindowsRunToCompletionApplicationType" ApplicationTypeVersion="1.0" xmlns="http://schemas.microsoft.com/2011/01/fabric" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Description>Windows RunToCompletion Application</Description>
<ServiceManifestImport>
<ServiceManifestRef ServiceManifestName="WindowsRunToCompletionServicePackage" ServiceManifestVersion="1.0"/>
<Policies>
<ExecutionPolicy Type="RunToCompletion" Restart="OnFailure"/>
</Policies>
</ServiceManifestImport>
<DefaultServices>
<Service Name="WindowsRunToCompletionService" ServicePackageActivationMode="ExclusiveProcess">
<StatelessService ServiceTypeName="WindowsRunToCompletionServiceType" InstanceCount="1">
<SingletonPartition />
</StatelessService>
</Service>
</DefaultServices>
</ApplicationManifest>
Frågedistributionsstatus för en DeployedServicePackage
Du kan fråga distributionsstatus för en DeployedServicePackage.
- Från PowerShell använder du Get-ServiceFabricDeployedServicePackage
- Från C#använder du FabricClient API GetDeployedServicePackageListAsync(String, Uri, String).
Överväganden för RunToCompletion-semantik
Överväg följande punkter om Stöd för RunToCompletion:
- RunToCompletion-semantik stöds endast för containrar och körbara gästprogram.
- Uppgraderingsscenarier för program med RunToCompletion-semantik tillåts inte. Du måste ta bort och återskapa sådana program om det behövs.
- Redundanshändelser kan leda till att CodePackages körs igen när det har slutförts, på samma nod eller på andra noder i klustret. Exempel på redundanshändelser är omstarter av noder och Service Fabric-körningsuppgraderingar på en nod.
- RunToCompletion är inte kompatibelt med
ServicePackageActivationMode="SharedProcess"
. Service Fabric Runtime version 9.0 och senare misslyckas med validering för sådana tjänster.SharedProcess
är standardvärdet, så du måste angeServicePackageActivationMode="ExclusiveProcess"
för att använda RunToCompletion-semantik.