RunToCompletion
A partir da versão 7.1, o Service Fabric oferece suporte à semântica RunToCompletion para contêineres e aplicativos executáveis convidados. Essas semânticas permitem que aplicativos e serviços concluam uma tarefa e saiam, em contraste com aplicativos e serviços sempre em execução.
Antes de prosseguir com este artigo, familiarize-se com o modelo de aplicativo do Service Fabric e o modelo de hospedagem do Service Fabric.
Nota
A semântica RunToCompletion não é suportada 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 uma ExecutionPolicy
ao importar o ServiceManifest. Todos os CodePackages que compõem o ServiceManifest herdam a política especificada. O seguinte trecho do 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 ú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 tendo falhado. Os valores permitidos para este atributo sãoOnFailure
eNever
, comOnFailure
como padrão.Com a política de reinicialização definida como
OnFailure
, qualquer CodePackage que falhe 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 algum CodePackage falhar, o status de implantação do DeployedServicePackage será marcado como Falha, mas outros CodePackages continuarão a execução.
Se todos os CodePackages no ServicePackage forem executados até a conclusão bem-sucedida com o código 0
de saída, o status de implantação do DeployedServicePackage será marcado como RanToCompletion.
Exemplo de código usando semântica RunToCompletion
Vejamos um exemplo completo que usa a semântica RunToComplete.
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 com todas as versões de um sistema operacional host. Este exemplo faz referência a mcr.microsoft.com/windows/nanoserver:1809
. Para obter mais informações, consulte Compatibilidade de versão de contêiner do Windows.
A ServiceManifest.xml a seguir descreve um ServicePackage que consiste em dois CodePackages, que representam contêineres. RunToCompletionCodePackage1
apenas registra uma mensagem para stdout e sai. RunToCompletionCodePackage2
pings o 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>
A ApplicationManifest.xml a seguir descreve um aplicativo com base no ServiceManifest.xml discutido acima. O código especifica RunToCompletion ExecutionPolicy para WindowsRunToCompletionServicePackage
com uma política de reinicialização de OnFailure
.
Após WindowsRunToCompletionServicePackage
a ativação, 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
Você pode consultar o status de implantação de um DeployedServicePackage.
- No PowerShell, use o Get-ServiceFabricDeployedServicePackage
- Em C#, use a API FabricClient GetDeployedServicePackageListAsync(String, Uri, String).
Considerações sobre a semântica RunToCompletion
Considere os seguintes pontos sobre o suporte a RunToComplete:
- A semântica RunToCompletion é suportada apenas para contêineres e aplicativos executáveis convidados.
- Cenários de atualização para aplicativos com semântica RunToCompletion não são permitidos. Você precisa excluir e recriar tais aplicativos, se necessário.
- Os eventos de failover podem fazer com que CodePackages seja reexecutado 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ó e atualizações de tempo de execução do Service Fabric em um nó.
- RunToCompletion é incompatível com
ServicePackageActivationMode="SharedProcess"
o . O tempo de execução do Service Fabric versão 9.0 e superior falha na validação desses serviços.SharedProcess
é o valor padrão, portanto, você deve especificarServicePackageActivationMode="ExclusiveProcess"
para usar a semântica RunToComplete.