RunToCompletion
Vanaf versie 7.1 biedt Service Fabric ondersteuning voor RunToCompletion-semantiek voor containers en uitvoerbare gasttoepassingen. Deze semantiek maken toepassingen en services mogelijk die een taak voltooien en afsluiten, in tegenstelling tot het altijd uitvoeren van toepassingen en services.
Voordat u verdergaat met dit artikel, moet u bekend zijn met het Service Fabric-toepassingsmodel en het Service Fabric-hostingmodel.
Notitie
RunToCompletion-semantiek wordt niet ondersteund voor services die gebruikmaken van het Reliable Services-programmeermodel .
RunToCompletion-semantiek en -specificatie
U kunt RunToCompletion-semantiek opgeven als een ExecutionPolicy
wanneer u servicemanifest importeert. Alle CodePackages die het ServiceManifest omvatten, nemen het opgegeven beleid over. Het volgende fragment uit ApplicationManifest.xml bevat een voorbeeld:
<ServiceManifestImport>
<ServiceManifestRef ServiceManifestName="RunToCompletionServicePackage" ServiceManifestVersion="1.0"/>
<Policies>
<ExecutionPolicy Type="RunToCompletion" Restart="OnFailure"/>
</Policies>
</ServiceManifestImport>
ExecutionPolicy
staat twee kenmerken toe:
Type
heeftRunToCompletion
als de enige toegestane waarde.Restart
hiermee geeft u het beleid voor opnieuw opstarten dat moet worden toegepast op CodePackages in de ServicePackage bij fout. Een CodePackage die wordt afgesloten met een niet-nul afsluitcode, wordt beschouwd als mislukt. Toegestane waarden voor dit kenmerk zijnOnFailure
enNever
, metOnFailure
als standaardwaarde.Als het beleid voor opnieuw opstarten is ingesteld op
OnFailure
, mislukt elke CodePackage die mislukt met een niet-nul afsluitcode opnieuw wordt opgestart, met back-offs tussen herhaalde fouten.Als het beleid voor opnieuw opstarten is ingesteld op
Never
, als codepackage mislukt, wordt de implementatiestatus van de DeployedServicePackage gemarkeerd als Mislukt, maar andere CodePackages blijven uitvoeren.
Als alle CodePackages in de ServicePackage-uitvoering zijn voltooid met afsluitcode 0
, wordt de implementatiestatus van de DeployedServicePackage gemarkeerd als RanToCompletion.
Codevoorbeeld met runToCompletion-semantiek
Laten we eens kijken naar een volledig voorbeeld waarin runToCompletion-semantiek wordt gebruikt.
Belangrijk
In het volgende voorbeeld wordt ervan uitgegaan dat u bekend bent met het maken van Windows-containertoepassingen met behulp van Service Fabric en Docker.
Windows Server-containers zijn niet compatibel in alle versies van een host-besturingssysteem. In dit voorbeeld wordt verwezen naar mcr.microsoft.com/windows/nanoserver:1809
. Zie compatibiliteit van windows-containerversies voor meer informatie.
In de volgende ServiceManifest.xml wordt een ServicePackage beschreven die bestaat uit twee CodePackages, die containers vertegenwoordigen. RunToCompletionCodePackage1
registreert alleen een bericht naar stdout en wordt afgesloten. RunToCompletionCodePackage2
pingt het loopback-adres een tijdje en sluit vervolgens af met een afsluitcode van, 0
1
of 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>
In de volgende ApplicationManifest.xml wordt een toepassing beschreven op basis van de hierboven besproken ServiceManifest.xml . De code specificeert RunToCompletion ExecutionPolicy voor WindowsRunToCompletionServicePackage
met een beleid voor opnieuw opstarten van OnFailure
.
Na WindowsRunToCompletionServicePackage
de activering worden de samenstellende CodePackages gestart. RunToCompletionCodePackage1
moet worden afgesloten bij de eerste activering. RunToCompletionCodePackage2
kan mislukken met een niet-nul afsluitcode en wordt opnieuw opgestart omdat het beleid voor opnieuw opstarten is 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>
Query-implementatiestatus van een DeployedServicePackage
U kunt de implementatiestatus van een DeployedServicePackage opvragen.
- Gebruik vanuit PowerShell de Get-ServiceFabricDeployedServicePackage
- Gebruik vanuit C# de FabricClient-API GetDeployedServicePackageListAsync(String, Uri, String).
Overwegingen voor semantiek runToCompletion
Houd rekening met de volgende punten over ondersteuning voor RunToCompletion:
- RunToCompletion-semantiek wordt alleen ondersteund voor containers en uitvoerbare gasttoepassingen.
- Upgradescenario's voor toepassingen met RunToCompletion-semantiek zijn niet toegestaan. U moet dergelijke toepassingen zo nodig verwijderen en opnieuw maken.
- Failovergebeurtenissen kunnen ertoe leiden dat CodePackages na voltooiing opnieuw worden uitgevoerd, op hetzelfde knooppunt of op andere knooppunten van het cluster. Voorbeelden van failover-gebeurtenissen zijn opnieuw opstarten van knooppunten en Service Fabric-runtime-upgrades op een knooppunt.
- RunToCompletion is niet compatibel met
ServicePackageActivationMode="SharedProcess"
. Service Fabric-runtimeversie 9.0 en hoger mislukt de validatie voor dergelijke services.SharedProcess
is de standaardwaarde, dus u moet opgevenServicePackageActivationMode="ExclusiveProcess"
dat runToCompletion-semantiek moet worden gebruikt.