Implantação sem tempo de inatividade para funções duráveis
O modelo de execução confiável de funções duráveis requer 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 da função de atividade ou na lógica do orquestrador, as instâncias de orquestração em andamento falham. Esta situação é especialmente um problema para instâncias de orquestrações de longa duração, que podem representar horas ou dias de trabalho.
Para evitar que essas falhas aconteçam, você tem duas opções:
- Atrase sua implantação até que todas as instâncias de orquestração em execução sejam concluídas.
- Certifique-se de que todas as instâncias de orquestração em execução usem as versões existentes de suas funções.
O gráfico a seguir compara as três principais estratégias para alcançar uma implantação de tempo de inatividade zero para funções duráveis:
Estratégia | Quando utilizar o | Prós | Contras |
---|---|---|---|
Controle de versão | Aplicativos que não sofrem alterações de quebra frequentes . | Simples de implementar. | Aumento do tamanho do aplicativo de função 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 duração que duram mais de 24 horas ou orquestrações frequentemente sobrepostas. | Base de código simples. Não requer gerenciamento de aplicativo de função adicional. |
Requer gerenciamento adicional de conta de armazenamento ou hub de tarefas. Requer períodos de tempo em que nenhuma orquestração está em execução. |
Roteamento de aplicativos | Um sistema que não tem períodos de tempo em que as orquestrações não estão em execução, como aqueles períodos de tempo com orquestrações que duram mais de 24 horas ou com orquestrações frequentemente sobrepostas. | Lida com novas versões de sistemas com orquestrações em execução contínua que têm alterações de rutura. | Requer um roteador de aplicativo inteligente. Pode maximizar o número de aplicativos de função permitidos pela sua assinatura. A predefinição é 100. |
O restante deste documento descreve essas estratégias com mais detalhes.
Nota
As descrições dessas estratégias de implantação de tempo de inatividade zero pressupõem que você esteja usando o provedor de Armazenamento do Azure padrão para Funções Duráveis. A orientação pode não ser apropriada 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 do provedor de armazenamento e como elas se comparam, consulte a documentação dos provedores de armazenamento Durable Functions.
Controlo 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 de uma função torna-se parte de seu nome. Como as versões anteriores das funções são preservadas, as instâncias de orquestração em voo podem continuar a fazer referência a elas. Enquanto isso, as solicitações de novas instâncias de orquestração exigem a versão mais recente, que sua função de cliente de orquestração pode referenciar a partir de uma configuração de aplicativo.
Nesta estratégia, todas as funções devem ser copiadas e as 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.
Nota
Essa estratégia usa slots de implantação para evitar 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
Enquanto a versão atual do aplicativo de função estiver sendo executada no slot de produção, implante a nova versão do aplicativo de função no slot de preparação. Antes de trocar os slots de produção e preparação, verifique se há instâncias de orquestração em execução. Depois que todas as instâncias de orquestração estiverem concluídas, você poderá fazer a troca. Essa estratégia funciona quando você tem períodos previsíveis em que nenhuma instância de orquestração está em voo. Esta é a melhor abordagem quando suas orquestrações não são de longa duração e quando suas execuções de orquestração não se sobrepõem com frequência.
Configuração do aplicativo de função
Use o procedimento a seguir para configurar esse cenário.
Adicione slots de implantação ao seu aplicativo de função para preparação e produção.
Para cada slot, defina a configuração do aplicativo AzureWebJobsStorage para a conexão de uma conta de armazenamento compartilhada. Essa conexão de conta de armazenamento é usada pelo tempo de execução do Azure Functions para armazenar com segurança as chaves de acesso das funções. Para obter o mais alto nível de segurança, você deve usar uma conexão de identidade gerenciada com sua conta de armazenamento.
Para cada slot, crie uma nova configuração de aplicativo, por exemplo,
DurableManagementStorage
. Defina seu valor para a cadeia de conexão de diferentes contas de armazenamento. Essas contas de armazenamento são usadas pela extensão Durable Functions para uma 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. Mais uma vez, as conexões gerenciadas baseadas em identidade são as mais seguras.Na seção durableTask do arquivo de host.json do seu aplicativo de função, especifique
connectionStringName
(Durable 2.x) ouazureStorageConnectionStringName
(Durable 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ção está sendo executada no slot de produção, enquanto a versão 1 permanece no slot de preparação.
host.json exemplos
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 implantar somente quando seu aplicativo de função não tiver instâncias de orquestração pendentes ou em execução. Ao usar o Azure Pipelines, você pode 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 aguardar até que nenhuma orquestração esteja em execução. Para obter mais informações, consulte Controle de implantação de liberação usando portões
O Azure Pipelines verifica seu aplicativo de função para executar instâncias de orquestração antes do início da implantação.
Agora, a nova versão do seu aplicativo de função deve ser implantada no slot de preparação.
Por fim, troque slots.
As configurações do aplicativo que não estão marcadas como configurações de 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 é rastreado 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.
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 dos slots e as configurações do HubName do aplicativo. Para saber mais, consulte Hubs de tarefas em funções duráveis.
Roteamento de aplicativos
Esta estratégia é a mais complexa. No entanto, ele pode ser usado para aplicativos de função que não têm tempo entre a execução de orquestrações.
Para essa estratégia, você deve criar um roteador de aplicativo na frente de suas funções duráveis. Este roteador pode ser implementado com funções duráveis. O router tem a responsabilidade de:
- Implante o aplicativo de função.
- Gerencie a versão do Durable Functions.
- Encaminhe solicitações de orquestração para aplicativos funcionais.
Na primeira vez que uma solicitação de orquestração é recebida, o roteador executa as seguintes tarefas:
- Cria um novo aplicativo de função no Azure.
- Implanta o código do seu aplicativo de função no novo aplicativo de função no Azure.
- Encaminha a solicitação de orquestração para o novo aplicativo.
O roteador gerencia o estado de qual versão do código do seu aplicativo é implantada em qual aplicativo de função no Azure.
O roteador direciona as solicitações de implantação e orquestração para o aplicativo de função 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 de rutura, você pode incrementar a versão do patch. O roteador implanta em seu aplicativo de função existente e envia solicitações para as versões antiga e nova do código, que são roteadas para o mesmo aplicativo de função.
Ao implantar uma nova versão do seu aplicativo com uma alteração de quebra, você pode incrementar a versão principal ou secundária. Em seguida, o roteador de aplicativos cria um novo aplicativo de função no Azure, implanta nele e roteia solicitações para a nova versão do seu aplicativo para ele. No diagrama a seguir, orquestrações em execução na versão 1.0.1 do aplicativo continuam em execução, mas as solicitações para a versão 1.1.0 são roteadas para o novo aplicativo de função.
O roteador monitora o status das orquestrações na versão 1.0.1 e remove aplicativos depois que todas as orquestrações são concluídas.
Rastreando as configurações da loja
Cada aplicativo de função deve usar filas de agendamento separadas, possivelmente em contas de armazenamento separadas. Se quiser consultar todas as instâncias de orquestração em todas as versões do seu aplicativo, você pode compartilhar tabelas de instâncias e histórico entre seus aplicativos de função. Você pode compartilhar tabelas definindo as trackingStoreConnectionStringName
configurações e trackingStoreNamePrefix
no arquivo de configurações host.json para que todas usem os mesmos valores.
Para obter mais informações, consulte Gerenciar instâncias em funções duráveis no Azure.