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 a RunToCompletion 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 sont OnFailure et Never, 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 &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>

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.

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écifier ServicePackageActivationMode="ExclusiveProcess" pour utiliser la sémantique RunToCompletion.

Étapes suivantes