Partilhar via


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 tem RunToCompletion 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ão OnFailure e Never, com OnFailure 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 0de 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 &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>

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.

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 especificar ServicePackageActivationMode="ExclusiveProcess" para usar a semântica RunToComplete.

Próximos passos