Compartilhar via


Implantação sem tempo de inatividade para Durable Functions

O modelo de execução confiável do Durable Functions exige que as orquestrações sejam determinísticas, o que cria um desafio adicional a ser considerado ao implantar atualizações. Quando uma implantação contém alterações nas assinaturas de função de atividade ou na lógica do Orchestrator, as instâncias de orquestração em andamento falham. Essa situação é especialmente um problema para instâncias de orquestrações de longa execução, que podem representar horas ou dias de trabalho.

Para evitar que essas falhas ocorram, você tem várias opções:

  • Adiar a implantação até que todas as instâncias de orquestração em execução tenham sido concluídas.
  • Use o controle de versão de orquestração para permitir que diferentes versões de orquestrações coexistam (recomendado).
  • Certificar-se de que qualquer instância de orquestração em execução use as versões existentes de suas funções.

O gráfico a seguir compara as quatro principais estratégias para obter uma implantação de tempo de inatividade zero para Durable Functions:

Estratégia Quando usar Vantagens Desvantagens
Versionamento de orquestração Aplicativos com alterações interruptivas, especialmente aqueles que precisam dar suporte à execução simultânea de diferentes versões de orquestração. Habilita implantações de tempo de inatividade zero com alterações interruptivas.
Funcionalidade embutida que requer configuração mínima.
Requer modificações cuidadosas de código do orquestrador para compatibilidade de versão.
Controle de versão baseado em nome Aplicativos que não experimentam alterações significativas frequentes. Simples de implantar. Maior tamanho do aplicativo de funções na memória e no número de funções.
Duplicação de código.
Verificação de status com slot Um sistema que não tem orquestrações de longa execução que duram mais de 24 horas ou orquestrações que se sobrepõem com frequência. Base de código simples.
Não requer gerenciamento de aplicativo de funções adicional.
Requer gerenciamento de hub de tarefas ou conta de armazenamento adicional.
Requer períodos de tempo em que nenhuma orquestração está em execução.
Roteamento de aplicativo Um sistema que não tem períodos de tempo em que as orquestrações não estão sendo executadas, como os períodos de tempo com orquestrações que duram mais de 24 horas ou com orquestrações que se sobrepõem com frequência. Lida com novas versões de sistemas com orquestrações continuamente em execução que têm alterações significativas. Requer um roteador de aplicativo inteligente.
Pode esgotar o número de aplicativos de funções permitidos pela sua assinatura. O padrão é 100.

O restante deste documento descreve essas estratégias mais detalhadamente.

Observação

As descrições dessas estratégias de implantação de tempo de inatividade zero presumem que você está usando o provedor de Armazenamento do Azure padrão para Durable Functions. As diretrizes podem não ser apropriadas se você estiver usando um provedor de armazenamento diferente do provedor de Armazenamento do Azure padrão. Para obter mais informações sobre as várias opções de provedor de armazenamento e como elas se comparam, consulte a documentação de provedores de armazenamento Durable Functions.

Controle de versão de orquestração

O recurso de controle de versão de orquestração permite que você faça alterações significativas nas orquestrações, evitando o tempo de inatividade durante as implantações. Esse recurso interno permite que diferentes versões de orquestrações coexistam e executem simultaneamente sem conflitos.

Com controle de versão de orquestração:

  • Cada instância de orquestração obtém uma versão permanentemente associada a ela quando criada.
  • Os trabalhadores que executam versões mais recentes do orquestrador podem continuar executando instâncias de versão mais antigas.
  • Os trabalhadores que executam versões de orquestração mais antigas não podem executar instâncias de versão mais recentes.
  • As funções do orquestrador podem examinar a versão e a execução da ramificação de forma adequada.

Essa abordagem facilita atualizações sem interrupção em que os trabalhadores que executam diferentes versões do seu aplicativo podem coexistir com segurança. É a estratégia recomendada para os aplicativos que precisam dar suporte às alterações interruptivas, mantendo implantações de tempo de inatividade zero. O recurso de versionamento de orquestração é independente de back-end, portanto, você pode usá-lo independentemente do back-end de armazenamento que seu aplicativo de Funções Duráveis está usando. Para obter diretrizes detalhadas de configuração e implementação, consulte Controle de versão de orquestração no Durable Functions.

Controle de versão baseado em nome

Defina novas versões de suas funções e deixe as versões antigas em seu aplicativo de funções. Como você pode ver no diagrama, a versão da função se torna parte do seu nome. Como as versões anteriores das funções são preservadas, as instâncias de orquestração em andamento podem continuar a referenciá-las. Enquanto isso, as solicitações para novas instâncias de orquestração chamam a versão mais recente, à qual sua função de cliente de orquestração pode fazer referência a partir de uma configuração de aplicativo.

Estratégia de controle de versão

Nessa estratégia, cada função deve ser copiada e suas referências a outras funções devem ser atualizadas. Você pode facilitar escrevendo um script. Aqui está um projeto de exemplo com um script de migração.

Observação

Essa estratégia usa slots de implantação para evitar o tempo de inatividade durante a implantação. Para obter informações mais detalhadas sobre como criar e usar novos slots de implantação, consulte Slots de implantação do Azure Functions.

Verificação de status com slot

Embora a versão atual do seu aplicativo de funções esteja em execução no slot de produção, implante a nova versão do seu aplicativo de funções em seu slot de preparo. Antes de trocar os slots de produção e de preparo, verifique se há alguma instância de orquestração em execução. Depois que todas as instâncias de orquestração forem concluídas, você poderá fazer a troca. Essa estratégia funciona quando você tem períodos previsíveis em que não há instâncias de orquestração em andamento. Essa é a melhor abordagem quando suas orquestrações não são de execução longa e quando suas execuções de orquestração não se sobrepõem com frequência.

Configuração do aplicativo de funções

Use o procedimento a seguir para configurar esse cenário.

  1. Adicione slots de implantação ao seu aplicativo de funções para preparo e produção.

  2. Para cada slot, defina a Configuração do aplicativo AzureWebJobsStorage à conexão de uma conta de armazenamento compartilhado. Essa conexão da conta de armazenamento é usada pelo runtime do Azure Functions para armazenar com segurança as chaves de acesso das funções. Quanto ao nível mais alto de segurança, você deve usar uma conexão de identidade gerenciada à sua conta de armazenamento.

  3. Para cada slot, crie uma nova configuração de aplicativo, por exemplo, DurableManagementStorage. Defina seu valor para a cadeia de conexão de contas de armazenamento diferentes. Essas contas de armazenamento são usadas pela extensão de Durable Functions para execução confiável. Use uma conta de armazenamento separada para cada slot. Não marque essa configuração como uma configuração de slot de implantação. Novamente, as conexões baseadas em identidade gerenciada são as mais seguras.

  4. Na seção durableTask do arquivo host.json, especifique connectionStringName (Durável 2.x) ou azureStorageConnectionStringName (Durável 1.x) como o nome da configuração do aplicativo que você criou na etapa 3.

O diagrama a seguir mostra a configuração descrita de slots de implantação e contas de armazenamento. Nesse cenário potencial de pré-implantação, a versão 2 de um aplicativo de funções está em execução no slot de produção, enquanto a versão 1 permanece no slot de preparo.

Slots de implantação e contas de armazenamento

exemplos host.json

Os fragmentos JSON a seguir são exemplos da configuração da cadeia de conexão no arquivo host.json.

Funções 2.0

{
  "version": 2.0,
  "extensions": {
    "durableTask": {
      "hubName": "MyTaskHub",
      "storageProvider": {
        "connectionStringName": "DurableManagementStorage"
      }
    }
  }
}

Funções 1.x

{
  "durableTask": {
    "azureStorageConnectionStringName": "DurableManagementStorage"
  }
}

Configuração de pipeline de CI/CD

Configure seu pipeline de CI/CD para implantação somente quando seu aplicativo de funções não tiver instâncias de orquestração pendentes ou em execução. Quando você estiver usando Azure Pipelines, poderá criar uma função que verifica essas condições, como no exemplo a seguir:

[FunctionName("StatusCheck")]
public static async Task<IActionResult> StatusCheck(
    [HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequestMessage req,
    [DurableClient] IDurableOrchestrationClient client,
    ILogger log)
{
    var runtimeStatus = new List<OrchestrationRuntimeStatus>();

    runtimeStatus.Add(OrchestrationRuntimeStatus.Pending);
    runtimeStatus.Add(OrchestrationRuntimeStatus.Running);

    var result = await client.ListInstancesAsync(new OrchestrationStatusQueryCondition() { RuntimeStatus = runtimeStatus }, CancellationToken.None);
    return (ActionResult)new OkObjectResult(new { HasRunning = result.DurableOrchestrationState.Any() });
}

Em seguida, configure o portão de preparo para esperar até que nenhuma orquestração esteja em execução. Para obter mais informações, consulte Liberar controle de implantação usando portões

Portão de implantação

Azure Pipelines verifica seu aplicativo de funções para executar instâncias de orquestração antes do início da implantação.

Portão de implantação (em execução)

Agora, a nova versão do seu aplicativo de funções deve ser implantada no slot de preparo.

Slot de preparo

Por fim, troque os slots.

As configurações do aplicativo que não são marcadas como configurações do slot de implantação também são trocadas, portanto, o aplicativo da versão 2 mantém sua referência à conta de armazenamento A. Como o estado de orquestração é acompanhado na conta de armazenamento, todas as orquestrações em execução no aplicativo da versão 2 continuam a ser executadas no novo slot sem interrupção.

Slot de implantação

Para usar a mesma conta de armazenamento para ambos os slots, você pode alterar os nomes dos hubs de tarefas. Nesse caso, você precisa gerenciar o estado de seus slots e as configurações de HubName do seu aplicativo. Para saber mais, confira hubs de tarefas em Durable Functions.

Roteamento de aplicativo

Essa estratégia é a mais complexa. No entanto, ele pode ser usado para aplicativos de funções que não têm tempo entre orquestrações em execução.

Para essa estratégia, você deve criar um roteador de aplicativo na frente de seu Durable functions. Esse roteador pode ser implementado com Durable Functions. O roteador tem a responsabilidade de:

  • Implantar o aplicativo de funções.
  • Gerenciar a versão do Durable Functions.
  • Rotear solicitações de orquestração para aplicativos de funções.

Na primeira vez que uma solicitação de orquestração é recebida, o roteador realiza as seguintes tarefas:

  1. Cria um novo aplicativo de funções no Azure.
  2. Implanta o código do aplicativo de funções no novo aplicativo de funções no Azure.
  3. Encaminha a solicitação de orquestração para o novo aplicativo.

O roteador gerencia o estado cuja versão do código do aplicativo é implantada no aplicativo de funções no Azure.

Roteamento de aplicativos (primeira vez)

O roteador direciona as solicitações de implantação e orquestração para o aplicativo de funções apropriado com base na versão enviada com a solicitação. Ele ignora a versão do patch.

Ao implantar uma nova versão do seu aplicativo sem uma alteração significativa, você pode incrementar a versão do patch. O roteador é implantado em seu aplicativo de funções existente e envia solicitações para as versões antigas e novas do código, que são roteadas para o mesmo aplicativo de funções.

Roteamento de aplicativos (sem alteração significativa)

Ao implantar uma nova versão do seu aplicativo com uma alteração significativa, você pode incrementar a versão principal ou secundária. Em seguida, o roteador de aplicativo cria um novo aplicativo de funções no Azure, implanta-o e roteia solicitações para a nova versão do seu aplicativo para ele. No diagrama a seguir, a execução de orquestrações na versão 1.0.1 do aplicativo continua em execução, mas as solicitações para a versão 1.1.0 são roteadas para o novo aplicativo de funções.

Roteamento de aplicativos (alteração significativa)

O roteador monitora o status das orquestrações na versão 1.0.1 e remove os aplicativos após a conclusão de todas as orquestrações.

Configurações do repositório de rastreamento

Cada aplicativo de funções deve usar filas de agendamento separadas, possivelmente em contas de armazenamento separadas. Se você quiser consultar todas as instâncias de orquestrações em todas as versões do seu aplicativo, você pode compartilhar instâncias e tabelas de histórico em seus aplicativos de funções. Você pode compartilhar tabelas configurando trackingStoreConnectionStringName e trackingStoreNamePrefix configurações no arquivo configurações host.json para que todas usem os mesmos valores.

Para obter mais informações, consulte Gerenciar instâncias no Durable Functions no Azure.

Configurações do repositório de rastreamento

Próximas etapas