Compartilhar via


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.

Próximas etapas