Orquestrações eternas nas Funções Duráveis (Azure Functions)
Orquestrações eternas são funções de orquestração que nunca chegam ao fim. Elas são úteis quando você deseja usar Funções Duráveis para agregadores e para qualquer cenário que exige um loop infinito.
Histórico de orquestração
Conforme explicado no tópico do histórico de orquestração, o Framework de Tarefa Durável acompanha o histórico de cada orquestração de função. Esse histórico cresce continuamente, desde que a função de orquestrador continue agendando novos trabalhos. Se a função de orquestrador entrar em um loop infinito e agendar trabalho continuamente, esse histórico poderá ficar muito grande e causar problemas de desempenho significativos. O conceito de orquestração eterna foi criado para mitigar esse tipo de problema para aplicativos que precisam de loops infinitos.
Redefinir e reiniciar
Em vez de usar loops infinitos, as funções de orquestrador redefinem seu estado chamando o método continue-as-new da associação de gatilho de orquestração. Esse método usa um parâmetro serializável em JSON, que se torna a nova entrada para geração da próxima função de orquestrador.
Quando continue-as-new é chamado, a instância de orquestração é reiniciada com o novo valor de entrada. A mesma ID de instância é mantida, mas o histórico da função de orquestrador é redefinido.
Observação
O Durable Task Framework mantém a mesma ID de instância, mas internamente cria uma nova ID de execução para a função de orquestrador que é redefinida por continue-as-new. Essa ID de execução não é exposta externamente, mas pode ser útil conhecê-la ao depurar a execução da orquestração.
Exemplo de trabalho periódico
Um caso de uso das orquestrações eternas é o código que precisa realizar trabalho periódico indefinidamente.
[FunctionName("Periodic_Cleanup_Loop")]
public static async Task Run(
[OrchestrationTrigger] IDurableOrchestrationContext context)
{
await context.CallActivityAsync("DoCleanup", null);
// sleep for one hour between cleanups
DateTime nextCleanup = context.CurrentUtcDateTime.AddHours(1);
await context.CreateTimer(nextCleanup, CancellationToken.None);
context.ContinueAsNew(null);
}
Observação
O exemplo C# anterior é para o Durable Functions 2.x. Para Durable Functions 1.x, você deve usar DurableOrchestrationContext
em vez de IDurableOrchestrationContext
. Para obter mais informações sobre as diferenças entre versões, confira o artigo Versões do Durable Functions.
A diferença entre esse exemplo e uma função disparada por temporizador é que os tempos de gatilho de limpeza aqui não se baseiam em uma agenda. Por exemplo, uma agenda CRON que executa uma função a cada hora a executará às 1:00, 2:00, 3:00 etc. e, potencialmente, poderia se deparar com problemas de sobreposição. Neste exemplo, no entanto, se a limpeza levar 30 minutos, ela será agendada às 1:00, 2:30, 4:00 etc. e não haverá chance de sobreposição.
Iniciando uma orquestração eterna
Use o método de cliente durável start-new ou schedule-new para iniciar uma orquestração eterna, assim como você faria com qualquer outra função de orquestração.
Observação
Se você precisar garantir que uma orquestração singleton eterna esteja em execução, é importante manter a mesma instância id
ao iniciar a orquestração. Para obter mais informações, consulte Gerenciamento de Instâncias.
[FunctionName("Trigger_Eternal_Orchestration")]
public static async Task<HttpResponseMessage> OrchestrationTrigger(
[HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequestMessage request,
[DurableClient] IDurableOrchestrationClient client)
{
string instanceId = "StaticId";
await client.StartNewAsync("Periodic_Cleanup_Loop", instanceId);
return client.CreateCheckStatusResponse(request, instanceId);
}
Observação
O código anterior é para Durable Functions 2.x. Para o Durable Functions 1.x, você deve usar o atributo OrchestrationClient
em vez do atributo DurableClient
, e deve usar o tipo de parâmetro DurableOrchestrationClient
em vez de IDurableOrchestrationClient
. Para obter mais informações sobre as diferenças entre versões, confira o artigo Versões do Durable Functions.
Sair de uma orquestração eterna
Se uma função de orquestrador precisar ser concluída, tudo que você precisa fazer é não chamar ContinueAsNew
e permitir que a função saia.
Se uma função de orquestrador estiver em um loop infinito e precisar ser interrompida, use a API terminar da Associação de cliente de orquestração para interrompê-la. Para obter mais informações, consulte Gerenciamento de Instâncias.