Sdílet prostřednictvím


Dokončení spuštění

Service Fabric od verze 7.1 podporuje sémantiku RunToCompletion pro kontejnery a spustitelné aplikace hosta. Tato sémantika umožňuje aplikacím a službám, které dokončí úlohu a ukončí se, na rozdíl od aplikací a služeb, které běží neustále.

Než budete pokračovat v tomto článku, seznamte se s aplikačním modelem Service Fabric a modelem hostování Service Fabric.

Poznámka:

Sémantika RunToCompletion není podporována pro služby, které používají programovací model Reliable Services .

Sémantika a specifikace RunToCompletion

Můžete zadat sémantiku RunToCompletion jako ExecutionPolicy když importujete ServiceManifest. Všechny balíčky CodePackage, které tvoří ServiceManifest, dědí zadanou zásadu. Následující fragment kódu z ApplicationManifest.xml poskytuje příklad:

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

ExecutionPolicy umožňuje dva atributy:

  • TypeRunToCompletion jako jedinou povolenou hodnotu.

  • Restart určuje zásadu restartování, která se má použít pro balíčky CodePackage v balíčku ServicePackage při selhání. Balíček CodePackage, který se ukončí s nenulovým ukončovacím kódem, se považuje za neúspěšný. Povolené hodnoty pro tento atribut jsou OnFailure a Never, s OnFailure jako výchozí.

    • Pokud je zásada restartování nastavena na OnFailure, všechny balíčky CodePackage, které skončí s nenulovým ukončovacím kódem, se restartují, s prodlevami mezi opakovanými selháními.

    • Pokud je politika restartu nastavena na Never, při selhání některého balíčku CodePackage je stav nasazení nasazeného balíčku ServicePackage označen jako Neúspěšný, ale ostatní balíčky CodePackage pokračují v provádění.

Pokud se všechny balíčky CodePackage ve službě ServicePackage spustí k úspěšnému dokončení s ukončovacím kódem 0, stav nasazení nasazeného balíčkuServicePackage se označí jako RanToCompletion.

Příklad kódu s využitím sémantiky RunToCompletion

Podívejme se na úplný příklad, který používá sémantiku RunToCompletion.

Důležité

Následující příklad předpokládá znalost vytváření kontejnerových aplikací pro Windows pomocí Service Fabric a Dockeru.

Kontejnery Windows Serveru nejsou kompatibilní ve všech verzích hostitelského operačního systému. Tento příklad odkazuje na mcr.microsoft.com/windows/nanoserver:1809. Další informace najdete v tématu Kompatibilita verzí kontejneru Windows.

Následující ServiceManifest.xml popisuje ServicePackage sestávající ze dvou balíčků CodePackage, které představují kontejnery. RunToCompletionCodePackage1 pouze zaznamená zprávu do stdoutu a ukončí se. RunToCompletionCodePackage2 příkazem ping na chvíli adresu zpětné smyčky a poté se ukončí s ukončovacím kódem 0, 1nebo 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>

Následující ApplicationManifest.xml popisuje aplikaci na základě ServiceManifest.xml popsané výše. Kód určuje RunToCompletion ExecutionPolicy pro WindowsRunToCompletionServicePackage pomocí zásady restartování .OnFailure

Po WindowsRunToCompletionServicePackage aktivaci se spustí základní balíčky CodePackage. RunToCompletionCodePackage1 by se mělo úspěšně ukončit při první aktivaci. RunToCompletionCodePackage2 může selhat s nenulovým ukončovacím kódem a restartuje, protože zásada restartování je 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>

Dotaz na stav nasazení nasazeného balíčku služby ServicePackage

Stav nasazení nasazeného balíčku ServicePackage můžete dotazovat.

Důležité informace o sémantice RunToCompletion

Zvažte následující body týkající se podpory RunToCompletion:

  • Sémantika RunToCompletion se podporuje jenom pro kontejnery a spustitelné aplikace hosta.
  • Scénáře upgradu pro aplikace s sémantikou RunToCompletion nejsou povolené. V případě potřeby je potřeba tyto aplikace odstranit a znovu vytvořit.
  • Události převzetí služeb při selhání můžou způsobit, že se balíček CodePackage opakovaně spustí po úspěšném dokončení, a to na stejném uzlu nebo na jiných uzlech clusteru. Příklady událostí převzetí služeb při selhání zahrnují restartování uzlů a aktualizace modulu runtime Service Fabric na uzlu.
  • RunToCompletion není kompatibilní s ServicePackageActivationMode="SharedProcess". Pro tyto služby selže ověření modulu runtime Service Fabric verze 9.0 a vyšší. SharedProcess je výchozí hodnota, takže je nutné zadat ServicePackageActivationMode="ExclusiveProcess" , aby bylo možné použít sémantiku RunToCompletion.

Další kroky