Spuštění až do konce
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čení, na rozdíl od vždy spuštěných aplikací a služeb.
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
Sémantiku SpustitToCompletion můžete zadat jako sémantiku ExecutionPolicy
při importu 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:
Type
máRunToCompletion
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 jsouOnFailure
aNever
, sOnFailure
jako výchozí.Pokud je zásada restartování nastavená na
OnFailure
, všechny balíčky CodePackage, které se nezdaří s restartováním nenulového ukončovacího kódu, se zpětnými vypnutími mezi opakovanými selháními.Pokud dojde k
Never
selhání nějakého balíčku CodePackage, stav nasazení nasazeného balíčku ServicePackage je označený jako Neúspěšný, ale ostatní balíčky CodePackage budou pokračovat ve spouště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 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
stačí protokolovat zprávu do stdoutu a ukončit. RunToCompletionCodePackage2
příkazem ping na chvíli adresu zpětné smyčky a poté se ukončí s ukončovacím kódem 0
, 1
nebo 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>
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ěla ú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>
Stav nasazení dotazu nasazeného balíčku služby ServicePackage
Stav nasazení nasazeného balíčku ServicePackage můžete dotazovat.
- V PowerShellu použijte Rutinu Get-ServiceFabricDeployedServicePackage.
- V jazyce C# použijte rozhraní FabricClient API GetDeployedServicePackageListAsync(String, Uri, String).
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 opětovné spuštění balíčků CodePackage po úspěšném dokončení, na stejném uzlu nebo na jiných uzlech clusteru. Příklady událostí převzetí služeb při selhání jsou restartování uzlů a upgrady modulu runtime Service Fabric na uzlu.
- SpustitToCompletion 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é zadatServicePackageActivationMode="ExclusiveProcess"
, aby bylo možné použít sémantiku RunToCompletion.