Share via


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 heeft RunToCompletion 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 zijn OnFailure en Never, met OnFailure 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. RunToCompletionCodePackage2pingt het loopback-adres een tijdje en sluit vervolgens af met een afsluitcode van, 01of 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 &amp;&amp; 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 &amp;&amp; set /a exitCode=%random% % 3 &amp;&amp; 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.

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 opgeven ServicePackageActivationMode="ExclusiveProcess" dat runToCompletion-semantiek moet worden gebruikt.

Volgende stappen