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
tieneRunToCompletion
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 sonOnFailure
yNever
, dondeOnFailure
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 && 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>
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.
- En PowerShell, use Get-ServiceFabricDeployedServicePackage
- En C#, use la API de FabricClientGetDeployedServicePackageListAsync(String, Uri, String).
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 especificarServicePackageActivationMode="ExclusiveProcess"
para usar la semántica de RunToCompletion.