RunToCompletion
Począwszy od wersji 7.1, usługa Service Fabric obsługuje semantyka RunToCompletion dla kontenerów i aplikacji wykonywalnych gościa. Semantyka ta umożliwia aplikacjom i usługom, które zakończą zadanie i zakończą działanie, w przeciwieństwie do zawsze uruchomionych aplikacji i usług.
Przed kontynuowaniem pracy z tym artykułem zapoznaj się z modelem aplikacji usługi Service Fabric i modelem hostingu usługi Service Fabric.
Uwaga
Semantyka RunToCompletion nie jest obsługiwana w przypadku usług korzystających z modelu programowania usług Reliable Services .
Semantyka i specyfikacja runToCompletion
Semantyka RunToCompletion można określić jako semantykę ExecutionPolicy
podczas importowania pliku ServiceManifest. Wszystkie pakiety CodePackage składające się z pliku ServiceManifest dziedziczą określone zasady. Poniższy fragment kodu z ApplicationManifest.xml zawiera przykład:
<ServiceManifestImport>
<ServiceManifestRef ServiceManifestName="RunToCompletionServicePackage" ServiceManifestVersion="1.0"/>
<Policies>
<ExecutionPolicy Type="RunToCompletion" Restart="OnFailure"/>
</Policies>
</ServiceManifestImport>
ExecutionPolicy
zezwala na dwa atrybuty:
Type
maRunToCompletion
jako jedyną dozwoloną wartość.Restart
określa zasady ponownego uruchamiania, które mają być stosowane do pakietu CodePackage w usłudze ServicePackage po awarii. Pakiet CodePackage, który kończy działanie z kodem zakończenia bez zera, jest uznawany za niepowodzenie. Dozwolone wartości dla tego atrybutu toOnFailure
iNever
, z wartościami domyślnymiOnFailure
.Po ustawieniu zasad ponownego uruchamiania na
OnFailure
wartość wszystkie pakiety CodePackage, które kończą się niepowodzeniem z ponownym uruchomieniem kodu zakończenia bez zera, z wycofywaniem między powtarzającymi się awariami.Po ustawieniu zasad ponownego uruchamiania na
Never
wartość , jeśli jakikolwiek pakiet CodePackage zakończy się niepowodzeniem, stan wdrożenia pakietu DeployedServicePackage jest oznaczony jako Niepowodzenie, ale inne pakiety CodePackage kontynuują wykonywanie.
Jeśli wszystkie pakiety CodePackage w usłudze ServicePackage zostaną uruchomione w celu pomyślnego ukończenia z kodem 0
zakończenia, stan wdrożenia wdrożonego pakietuServicePackage zostanie oznaczony jako RanToCompletion.
Przykład kodu używający semantyki RunToCompletion
Przyjrzyjmy się kompletnego przykładu, który używa semantyki RunToCompletion.
Ważne
W poniższym przykładzie założono, że znajomość tworzenia aplikacji kontenera systemu Windows przy użyciu usługi Service Fabric i platformy Docker.
Kontenery systemu Windows Server nie są zgodne ze wszystkimi wersjami systemu operacyjnego hosta. Ten przykład odwołuje się do mcr.microsoft.com/windows/nanoserver:1809
. Aby uzyskać więcej informacji, zobacz zgodność wersji kontenera systemu Windows.
W poniższej ServiceManifest.xml opisano pakiet ServicePackage składający się z dwóch elementów CodePackage, które reprezentują kontenery. RunToCompletionCodePackage1
po prostu rejestruje komunikat do stdout i kończy. RunToCompletionCodePackage2
wysyła polecenie ping do adresu sprzężenia zwrotnego przez pewien czas, a następnie kończy działanie za pomocą kodu 0
zakończenia polecenia , 1
lub 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>
W poniższej ApplicationManifest.xml opisano aplikację opartą na ServiceManifest.xml omówionych powyżej. Kod określa element RunToCompletion ExecutionPolicy dla WindowsRunToCompletionServicePackage
polecenia z zasadami ponownego uruchamiania .OnFailure
Po WindowsRunToCompletionServicePackage
aktywacji uruchamiane są jego składowe pakiety CodePackage. RunToCompletionCodePackage1
powinno zakończyć się pomyślnie podczas pierwszej aktywacji. RunToCompletionCodePackage2
może zakończyć się niepowodzeniem z kodem zakończenia niezerowym i zostanie uruchomiony ponownie, ponieważ zasady ponownego uruchamiania to 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>
Stan wdrożenia zapytania wdrożonego pakietuServicePackage
Stan wdrożenia wdrożonego pakietuServicePackage można wykonać względem zapytania.
- W programie PowerShell użyj polecenia Get-ServiceFabricDeployedServicePackage
- W języku C# użyj interfejsu API FabricClient GetDeployedServicePackageListAsync(String, Uri, String).
Zagadnienia dotyczące semantyki RunToCompletion
Rozważ następujące kwestie dotyczące obsługi elementu RunToCompletion:
- Semantyka RunToCompletion jest obsługiwana tylko w przypadku kontenerów i aplikacji wykonywalnych gościa.
- Scenariusze uaktualniania aplikacji z semantykami RunToCompletion nie są dozwolone. W razie potrzeby należy usunąć i ponownie utworzyć takie aplikacje.
- Zdarzenia trybu failover mogą spowodować ponowne wykonanie pakietów CodePackage po pomyślnym zakończeniu w tym samym węźle lub w innych węzłach klastra. Przykładami zdarzeń trybu failover są ponowne uruchomienia węzła i uaktualnienia środowiska uruchomieniowego usługi Service Fabric w węźle.
- Element RunToCompletion jest niezgodny z elementem
ServicePackageActivationMode="SharedProcess"
. Sprawdzanie poprawności takich usług kończy się niepowodzeniem w środowisku uruchomieniowym usługi Service Fabric w wersji 9.0 lub nowszej.SharedProcess
jest wartością domyślną, dlatego należy określićServicePackageActivationMode="ExclusiveProcess"
, aby używać semantyki RunToCompletion.