Compartir vía


RunToCompletion

A partir de la versión 7.1, Service Fabric admite la semántica de RunToCompletion para contenedores y aplicaciones ejecutables de invitado. Esta semántica habilita las aplicaciones y los servicios que completan una tarea y se cierran, a diferencia de las aplicaciones y los servicios que están siempre en ejecución.

Antes de continuar con este artículo, familiarícese con el modelo de aplicación de Service Fabric y con el modelo de hospedaje de Service Fabric.

Nota:

No se admite la semántica de RunToCompletion en los servicios con el modelo de programación Reliable Services.

Semántica y especificación de RunToCompletion

Puede especificar la semántica de RunToCompletion como ExecutionPolicy al importar ServiceManifest. Todos los CodePackages que componen ServiceManifest heredan la directiva especificada. El siguiente fragmento de código de ApplicationManifest.xml proporciona un ejemplo:

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

ExecutionPolicy tiene dos atributos:

  • Type tiene RunToCompletion como único valor permitido.

  • Restart especifica la directiva de reinicio que se va a aplicar a CodePackages en el ServicePackage en caso de error. Se considera que un CodePackage que se cierra con un código de salida distinto de cero se es erróneo. Los valores permitidos para este atributo son OnFailure y Never, donde OnFailure es el valor predeterminado.

    • Con la directiva de reinicio establecida en OnFailure, cualquier CodePackage que produzca un error con un código de salida distinto de cero se reinicia, con retrocesos entre errores repetidos.

    • Con la directiva de reinicio establecida en Never, si se produce un error en CodePackage, el estado de implementación de DeployedServicePackage se marca como Failed, pero otros CodePackages continúan la ejecución.

Si todos los CodePackages de ServicePackage se ejecutan hasta finalizar de manera correcta con el código de salida igual a 0, el estado de implementación de DeployedServicePackage se marca como RanToCompletion.

Ejemplo de código del uso de la semántica de RunToCompletion

Veamos un ejemplo completo del uso de la semántica de RunToCompletion.

Importante

En el siguiente ejemplo se supone que está familiarizado con la creación de aplicaciones de contenedor de Windows con Service Fabric y Docker.

Los contenedores de Windows Server no son compatibles con todas las versiones del sistema operativo de un host. En este ejemplo se hace referencia a mcr.microsoft.com/windows/nanoserver:1809. Para obtener más información, vea Compatibilidad con versiones de contenedores de Windows.

En el siguiente archivo ServiceManifest.xml se describe un ServicePackage que consta de dos CodePackages, que representan contenedores. RunToCompletionCodePackage1 simplemente registra un mensaje en stdout y se cierra. RunToCompletionCodePackage2 hace ping en la dirección de bucle invertido durante un tiempo y luego se cierra con un código de salida de 0, 1 o 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>

En el siguiente archivo ApplicationManifest.xml se describe una aplicación basada en el archivo ServiceManifest.xml descrito anteriormente. En el código se especifica RunToCompletion ExecutionPolicy para WindowsRunToCompletionServicePackage con una directiva de reintento de OnFailure.

Tras la activación de WindowsRunToCompletionServicePackage, se inician sus CodePackages constituyentes. RunToCompletionCodePackage1 debe salir correctamente en la primera activación. RunToCompletionCodePackage2 puede producir un error con un código de salida distinto de cero y se reiniciará porque la directiva de reinicio es 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>

Consulta del estado de implementación de un DeployedServicePackage

Puede consultr el estado de implementación de un DeployedServicePackage.

Consideraciones para la semántica de RunToCompletion

Tenga en cuenta los siguientes puntos sobre la compatibilidad con RunToCompletion:

  • La semántica de RunToCompletion se admite para contenedores y aplicaciones ejecutables de invitado.
  • No se permiten los escenarios de actualización para aplicaciones con semántica de RunToCompletion. Debe eliminar y volver a crear estas aplicaciones, de ser necesario.
  • Los eventos de conmutación por error pueden hacer que CodePackages se vuelva a ejecutar después de que se complete correctamente, en el mismo nodo o en otros nodos del clúster. Algunos ejemplos de eventos de conmutación por error son los reinicios de nodo y las actualizaciones en tiempo de ejecución de Service Fabric en un nodo.
  • RunToCompletion no es compatible con ServicePackageActivationMode="SharedProcess". Service Fabric runtime 9.0 y versiones posteriores produce un error en la validación de dichos servicios. SharedProcess es el valor predeterminado, por lo que debe especificar ServicePackageActivationMode="ExclusiveProcess" para usar la semántica de RunToCompletion.

Pasos siguientes