RunToCompletion

Ab Version 7.1 unterstützt Service Fabric RunToCompletion-Semantik für Container- und ausführbare Gastanwendungen. Diese Semantik ermöglicht Anwendungen und Dienste, die einen Task abschließen und beendet werden, im Gegensatz zu Anwendungen und Diensten, die immer ausgeführt werden.

Bevor Sie mit diesem Artikel fortfahren, sollten Sie mit dem Service Fabric-Anwendungsmodell und dem Service Fabric-Hostingmodell vertraut sein.

Hinweis

RunToCompletion-Semantik wird nicht für Dienste unterstützt, die das Reliable Services-Programmiermodell verwenden.

RunToCompletion-Semantik und -Spezifikation

Sie können die RunToCompletion-Semantik als ExecutionPolicy angeben, wenn Sie das ServiceManifest importieren. Alle CodePackages, die das ServiceManifest enthalten, erben die angegebene Richtlinie. Der folgende Ausschnitt aus der Datei ApplicationManifest.xml enthält ein Beispiel:

<ServiceManifestImport>
  <ServiceManifestRef ServiceManifestName="RunToCompletionServicePackage" ServiceManifestVersion="1.0"/>
  <Policies>
    <ExecutionPolicy Type="RunToCompletion" Restart="OnFailure"/>
  </Policies>
</ServiceManifestImport>

ExecutionPolicy erlaubt zwei Attribute:

  • Type hat RunToCompletion als einzigen zulässigen Wert.

  • Restart gibt die Neustartrichtlinie an, die bei Ausfällen auf CodePackages in ServicePackage angewendet werden soll. Ein CodePackage, das mit einem Exitcode ungleich NULL beendet wird, wird als fehlgeschlagen betrachtet. Zulässige Werte für dieses Attribut sind OnFailure und Never. OnFailure ist dabei die Standardeinstellung.

    • Wenn die Neustartrichtlinie auf OnFailure festgelegt ist, wird jedes CodePackage, das mit einem Nicht-Null-Exit-Code fehlschlägt, neu gestartet, wobei Back-Offs zwischen wiederholten Fehlern ausgeführt werden.

    • Wenn die Richtlinie für Neustart auf Never festgelegt ist, wird der Bereitstellungsstatus von DeployedServicePackage als fehlgeschlagen gekennzeichnet, wenn ein CodePackage fehlschlägt. Andere CodePackages dürfen die Ausführung allerdings fortsetzen.

Wenn alle CodePackages im ServicePackage bis zum erfolgreichen Abschluss mit dem Exitcode 0 ausgeführt werden, lautet der Bereitstellungsstatus von DeployedServicePackage RanToCompletion.

Codebeispiel mit RunToCompletion-Semantik

Sehen wir uns ein vollständiges Beispiel mit RunToCompletion-Semantik an.

Wichtig

Im folgenden Beispiel wird davon ausgegangen, dass Sie mit der Erstellung von Windows-Containeranwendungen mit Service Fabric und Docker vertraut sind.

Windows Server-Container sind nicht mit allen Versionen eines Hostbetriebssystems kompatibel. In diesem Beispiel wird auf mcr.microsoft.com/windows/nanoserver:1809 verwiesen. Weitere Informationen finden Sie unter Versionskompatibilität von Windows-Containern.

In der folgenden Datei ServiceManifest.xml wird ein ServicePackage beschrieben, das aus zwei CodePackages besteht, die Container darstellen. RunToCompletionCodePackage1 protokolliert lediglich eine Meldung in stdout und wird dann beendet. RunToCompletionCodePackage2 pingt die Loopbackadresse eine Zeit lang und wird dann mit einem Exitcode von 0, 1 oder 2 beendet.

<?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 der folgenden Datei ApplicationManifest.xml wird eine Anwendung auf der Grundlage der oben erläuterten Datei ServiceManifest.xml beschrieben. Der Code stellt RunToCompletion ExecutionPolicy auf WindowsRunToCompletionServicePackage mit der Neustartrichtlinie OnFailure ein.

Bei Aktivierung von WindowsRunToCompletionServicePackage werden die zugehörigen CodePackages gestartet. RunToCompletionCodePackage1 sollten bei der ersten Aktivierung erfolgreich beendet werden. RunToCompletionCodePackage2 kann mit einem Exitcode ungleich 0 fehlschlagen und wird neu gestartet, da die Neustartrichtlinie OnFailure lautet.

<?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>

Bereitstellungsstatus eines DeployedServicePackage abfragen

Sie können den Bereitstellungsstatus eines DeployedServicePackage abfragen.

Überlegungen zur RunToCompletion-Semantik

Berücksichtigen Sie die folgenden Punkte zur Unterstützung von RunToCompletion:

  • Die RunToCompletion-Semantik wird nur für Container und ausführbare Gastanwendungen unterstützt.
  • Upgradeszenarien für Anwendungen mit RunToCompletion-Semantik sind unzulässig. Sie müssen solche Anwendungen ggf. löschen und neu erstellen.
  • Failoverereignisse können bewirken, dass CodePackages nach erfolgreichem Abschluss auf demselben Knoten oder auf anderen Knoten des Clusters erneut ausgeführt werden. Beispiele für Failoverereignisse sind Knotenneustarts und Service Fabric-Runtimeupgrades auf einem Knoten.
  • RunToCompletion ist nicht mit ServicePackageActivationMode="SharedProcess" kompatibel. In Service Fabric Runtime Version 9.0 und höher kann die Überprüfung für solche Dienste nicht erfolgreich ausgeführt werden. SharedProcess ist der Standardwert, sodass Sie die RunToCompletion-Semantik verwenden ServicePackageActivationMode="ExclusiveProcess" müssen.

Nächste Schritte