Share 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 duas opções:

  • Adiar a implantação até que todas as instâncias de orquestração em execução tenham sido concluídas.
  • 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 três principais estratégias para obter uma implantação sem tempo de inatividade para Durable Functions:

Estratégia Quando usar Vantagens Desvantagens
Controle de versão 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

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.

Versioning strategy

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 de aplicativo AzureWebJobsStorage como a cadeia de conexão de uma conta de armazenamento compartilhada. Essa cadeia de conexão da conta de armazenamento é usada pelo runtime Azure Functions para armazenar com segurança as chaves de acesso das funções.

  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.

  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.

Deployment slots and storage accounts

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

Deployment gate

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

Deployment gate (running)

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

Staging slot

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.

Deployment slot

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.

Application routing (first time)

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.

Application routing (no breaking change)

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.

Application routing (breaking change)

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.

Tracking store settings

Próximas etapas