RunToCompletion
A partir da versão 7.1, o Service Fabric oferece suporte à semântica RunToCompletion para contêineres e aplicativos executáveis de convidados. Essa semântica habilita aplicativos e serviços que completam uma tarefa e saem, ao contrário de sempre executar aplicativos e serviços.
Antes de continuar lendo este artigo, familiarize-se com o modelo de aplicativo do Service Fabric e o modelo de hospedagem do Service Fabric.
Observação
A semântica RunToCompletion não tem suporte para serviços que usam o modelo de programação Reliable Services.
Semântica e especificação RunToCompletion
Você pode especificar a semântica RunToCompletion como um ExecutionPolicy
quando importar o ServiceManifest. Todos os CodePackages que compõem o ServiceManifest herdam a política especificada. O seguinte trecho de ApplicationManifest.xml fornece um exemplo:
<ServiceManifestImport>
<ServiceManifestRef ServiceManifestName="RunToCompletionServicePackage" ServiceManifestVersion="1.0"/>
<Policies>
<ExecutionPolicy Type="RunToCompletion" Restart="OnFailure"/>
</Policies>
</ServiceManifestImport>
ExecutionPolicy
permite dois atributos:
Type
temRunToCompletion
como o único valor permitido.Restart
especifica a política de reinicialização a ser aplicada a CodePackages no ServicePackage em caso de falha. Um CodePackage que sai com um código de saída diferente de zero é considerado como falha. Os valores permitidos para esse atributo sãoOnFailure
eNever
, comOnFailure
como padrão.Com a política de reinicialização definida como
OnFailure
, qualquer CodePackage que falha com um código de saída diferente de zero é reiniciado, com back-offs entre falhas repetidas.Com a política de reinicialização definida como
Never
, se qualquer CodePackage falhar, o status de implantação do DeployedServicePackage é marcado como Falha, mas outros CodePackages continuarão a execução.
Se todos os CodePackages no ServicePackage forem executados até a conclusão com êxito com código de saída 0
, o status de implantação de DeployedServicePackage será marcado como RanToCompletion.
Exemplo de código usando a semântica RunToCompletion
Confira um exemplo completo que usa a semântica RunToCompletion.
Importante
O exemplo a seguir pressupõe familiaridade com a criação de aplicativos de contêiner do Windows usando o Service Fabric e o Docker.
Os contêineres do Windows Server não são compatíveis em todas as versões de um sistema operacional do host. Este exemplo faz referência a mcr.microsoft.com/windows/nanoserver:1809
. Para obter mais informações, confira Compatibilidade da versão do contêiner do Windows.
O ServiceManifest.xml a seguir descreve um ServicePackage que consiste em dois CodePackages, que representam contêineres. RunToCompletionCodePackage1
apenas registra uma mensagem em stdout e sai. RunToCompletionCodePackage2
executa ping no endereço de loopback por um tempo e, em seguida, sai com um código de saída de 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>
O ApplicationManifest.xml a seguir descreve um aplicativo baseado no ServiceManifest.xml discutido acima. O código especifica ExecutionPolicy de RunToCompletion para WindowsRunToCompletionServicePackage
com uma política de reinicialização de OnFailure
.
Após a ativação WindowsRunToCompletionServicePackage
, seus CodePackages constituintes são iniciados. RunToCompletionCodePackage1
deve sair com êxito na primeira ativação. RunToCompletionCodePackage2
pode falhar com um código de saída diferente de zero e será reiniciado porque a política de reinicialização é 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>
Consultar o status de implantação de um DeployedServicePackage
É possível consultar o status de implantação de um DeployedServicePackage.
- No PowerShell, use o Get-ServiceFabricDeployedServicePackage
- Em C#, use a API do FabricClientGetDeployedServicePackageListAsync(String, Uri, String).
Considerações sobre a semântica RunToCompletion
Considere os seguintes pontos sobre o suporte ao RunToCompletion:
- A semântica RunToCompletion tem suporte apenas para contêineres e aplicativos executáveis de convidado.
- Cenários de atualização para aplicativos com semântica RunToCompletion não são permitidos. Você precisa excluir e recriar esses aplicativos, se necessário.
- Os eventos de failover podem fazer com que CodePackages seja reexecutada após a conclusão bem-sucedida, no mesmo nó ou em outros nós do cluster. Exemplos de eventos de failover são reinicializações de nós e atualizações de tempo de execução do Service Fabric em um nó.
- RunToCompletion é incompatível com
ServicePackageActivationMode="SharedProcess"
. O runtime versão 9.0 e superiores do Service Fabric falha na validação de tais serviços.SharedProcess
é o valor padrão, portanto, você deve especificarServicePackageActivationMode="ExclusiveProcess"
para usar a semântica RunToCompletion.