RunToCompletion
Depuis la version 7.1, Service Fabric prend en charge la sémantique de RunToCompletion pour les conteneurs et les applications exécutables invité. Cette sémantique permet d’utiliser des applications et services qui accomplissent une tâche puis se ferment, par opposition aux applications et services toujours en cours d’exécution.
Avant de poursuivre la lecture de cet article, familiarisez-vous avec le modèle d’application Service Fabric et le modèle d’hébergement Service Fabric.
Notes
La sémantique de RunToCompletion n’est pas prise en charge pour les services qui utilisent le modèle de programmation Reliable Services.
Sémantique et spécification de RunToCompletion
Vous pouvez spécifier la sémantique RunToCompletion comme ExecutionPolicy
une fois que vous importez le ServiceManifest. La stratégie spécifiée est héritée par tous les CodePackages composant le ServiceManifest. L’extrait suivant issu du fichier ApplicationManifest.xml fournit un exemple :
<ServiceManifestImport>
<ServiceManifestRef ServiceManifestName="RunToCompletionServicePackage" ServiceManifestVersion="1.0"/>
<Policies>
<ExecutionPolicy Type="RunToCompletion" Restart="OnFailure"/>
</Policies>
</ServiceManifestImport>
ExecutionPolicy
autorise deux attributs :
Type
aRunToCompletion
comme seule valeur autorisée.Restart
spécifie la stratégie de redémarrage à appliquer aux CodePackages dans le ServicePackage en cas d’échec. Un CodePackage qui se ferme avec un code de sortie différent de zéro est considéré comme ayant échoué. Les valeurs autorisées pour cet attribut sontOnFailure
etNever
,OnFailure
étant la valeur par défaut.Avec la stratégie de redémarrage définie sur
OnFailure
, tout CodePackage qui échoue avec un code de sortie différent de zéro redémarre, avec des temporisations entre des échecs répétés.Avec une stratégie de redémarrage définie sur
Never
, en cas de défaillance d’un CodePackage, l’état de déploiement du DeployedServicePackage est marqué comme Failed mais l’exécution des autres CodePackages peut continuer.
Si tous les CodePackages composant le ServicePackage s’exécutent avec succès avec le code de sortie 0
, l’état de déploiement du DeployedServicePackage est marqué comme RanToCompletion.
Exemple de code utilisant la sémantique de RunToCompletion
Examinons un exemple complet utilisant la sémantique de RunToCompletion.
Important
L’exemple suivant part du principe que vous êtes familiarisé avec la création d’applications de conteneur Windows à l’aide de Service Fabric et de Docker.
Les conteneurs Windows Server ne sont pas compatibles avec toutes les versions d’un système d’exploitation hôte. Cet exemple fait référence à mcr.microsoft.com/windows/nanoserver:1809
. Pour plus d’informations, consultez Compatibilité des versions de conteneurs Windows.
Le fichier ServiceManifest.xml suivant décrit un ServicePackage constitué de deux CodePackages qui représentent des conteneurs. La commande RunToCompletionCodePackage1
enregistre simplement un message sur stdout, puis se ferme. RunToCompletionCodePackage2
effectue un test ping de l’adresse de bouclage pendant un certain temps, puis se ferme avec un code de sortie 0
, 1
ou 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>
Le fichier ApplicationManifest.xml suivant décrit une application basée sur le fichier ServiceManifest.xml mentionné ci-dessus. Le code spécifie RunToCompletion ExecutionPolicy pour WindowsRunToCompletionServicePackage
avec une stratégie de redémarrage de OnFailure
.
Lors de l’activation de WindowsRunToCompletionServicePackage
, ses CodePackages constitutifs sont démarrés. La commande RunToCompletionCodePackage1
doit se fermer correctement lors de la première activation. RunToCompletionCodePackage2
peut échouer avec un code de sortie différent de zéro et redémarrera, car la stratégie de redémarrage est 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>
Interrogation de l’état de déploiement d’un DeployedServicePackage
Vous pouvez interroger l’état de déploiement d’un DeployedServicePackage.
- À partir de PowerShell, utilisez Get-ServiceFabricDeployedServicePackage
- À partir de C#, utilisez l’API FabricClientGetDeployedServicePackageListAsync(String, Uri, String).
Considérations relatives à la sémantique RunToCompletion
Tenez compte des points suivants sur la prise en charge de RunToCompletion :
- La sémantique RunToCompletion n’est prise en charge que pour des conteneurs et des applications exécutables invité.
- Les scénarios de mise à niveau pour applications avec la sémantique de RunToCompletion ne sont pas autorisés. Vous devez supprimer et recréer ces applications si nécessaire.
- Des événements de basculement peuvent entraîner la réexécution de CodePackages une fois ceux-ci correctement exécutés, sur le même nœud ou d’autres nœuds du cluster. Des événements de basculement sont, par exemple, des redémarrages de nœud et des mises à niveau du runtime Service Fabric sur un nœud.
- RunToCompletion est incompatible avec
ServicePackageActivationMode="SharedProcess"
. Le runtime de Service Fabric version 9.0 ou ultérieure échoue à la validation de ces services.SharedProcess
est la valeur par défaut. Vous devez donc spécifierServicePackageActivationMode="ExclusiveProcess"
pour utiliser la sémantique RunToCompletion.