Orquestrações eternas em Durable Functions (Funções do Azure)
Orquestrações eternas são funções orquestradoras que nunca terminam. São úteis quando pretende utilizar Durable Functions para agregadores e qualquer cenário que exija um ciclo infinito.
Histórico de orquestrações
Conforme explicado no tópico de história da orquestração , o Durable Task Framework mantém um registo da história de cada orquestração de funções. Esta história cresce continuamente, desde que a função do orquestrador continue a agendar novos trabalhos. Se a função do orquestrador entrar num ciclo infinito e agendar continuamente o trabalho, este histórico poderá aumentar de forma crítica e causar problemas de desempenho significativos. O conceito de orquestração eterna foi concebido para mitigar este tipo de problemas para aplicações que precisam de ciclos infinitos.
Repor e reiniciar
Em vez de utilizar ciclos infinitos, as funções do orquestrador repõem o respetivo estado ao chamar o método continue-as-new do enlace do acionador de orquestração. Este método utiliza um parâmetro serializável JSON, que se torna a nova entrada para a próxima geração de funções do orquestrador.
Quando continua como novo é chamado, a instância de orquestração reinicia-se com o novo valor de entrada. O mesmo ID de instância é mantido, mas o histórico da função do orquestrador é reposto.
Nota
O Durable Task Framework mantém o mesmo ID de instância, mas cria internamente um novo ID de execução para a função orchestrator que é reposta por continue-as-new. Este ID de execução não é exposto externamente, mas pode ser útil saber quando depurar a execução da orquestração.
Exemplo de trabalho periódico
Um caso de utilização para orquestrações eternas é o código que precisa de fazer 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);
}
Nota
O exemplo C# anterior é para Durable Functions 2.x. Para Durable Functions 1.x, tem de utilizar DurableOrchestrationContext
em vez de IDurableOrchestrationContext
. Para obter mais informações sobre as diferenças entre versões, consulte o artigo Durable Functions versões.
A diferença entre este exemplo e uma função acionada pelo temporizador é que os tempos de acionador de limpeza aqui não se baseiam numa agenda. Por exemplo, uma agenda CRON que executa uma função a cada hora irá executá-la às 1:00, 2:00, 3:00, etc. e pode potencialmente encontrar problemas de sobreposição. Neste exemplo, no entanto, se a limpeza demorar 30 minutos, será agendada às 1:00, 2:30, 4:00, etc. e não há hipótese de sobreposição.
Iniciar uma orquestração eterna
Utilize o método start-new ou schedule-new durable client para iniciar uma orquestração eterna, tal como faria com qualquer outra função de orquestração.
Nota
Se precisar de garantir que uma orquestração eterna singleton está em execução, é importante manter a mesma instância id
ao iniciar a orquestração. Para obter mais informações, veja Gestão 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);
}
Nota
O código anterior destina-se a Durable Functions 2.x. Para Durable Functions 1.x, tem de utilizar OrchestrationClient
o atributo em vez do DurableClient
atributo e tem de utilizar o DurableOrchestrationClient
tipo de parâmetro em vez de IDurableOrchestrationClient
. Para obter mais informações sobre as diferenças entre versões, consulte o artigo Durable Functions versões.
Sair de uma orquestração eterna
Se uma função do orquestrador precisar de ser concluída eventualmente, tudo o que precisa de fazer é não ligar ContinueAsNew
e deixar a função sair.
Se uma função de orquestrador estiver num ciclo infinito e precisar de ser parada, utilize a API de terminação do enlace do cliente de orquestração para a parar. Para obter mais informações, veja Gestão de Instâncias.