Orquestaciones infinitas en Durable Functions (Azure Functions)

Las orquestaciones infinitas son funciones de orquestador que nunca terminan. Son útiles si desea usar Durable Functions con agregadores y con cualquier escenario que requiera un bucle infinito.

Historial de orquestación

Como se explica en el tema del historial de orquestación, Durable Task Framework realiza un seguimiento del historial de cada función de orquestación. Este historial crecerá continuamente siempre y cuando la función de orquestador siga programando nuevo trabajo. Si la función de orquestador entra en un bucle infinito y programa trabajo continuamente, este historial podría alcanzar un tamaño crítico y provocar problemas de rendimiento considerables. El concepto de orquestación infinita se diseñó para mitigar este tipo de problemas en aplicaciones que necesitan bucles infinitos.

Restablecimiento y reinicio

En lugar de usar bucles infinitos, las funciones del orquestador restablecen su estado mediante una llamada al método continue-as-new del enlace del desencadenador de orquestación. Este método toma un parámetro serializable con JSON, que se convierte en la nueva entrada para la siguiente generación de función de orquestador.

Cuando se llama a continue-as-new, la instancia de orquestación se reinicia con el nuevo valor de entrada. Se mantiene el mismo identificador de instancia, pero se reinicia el historial de la función orquestadora.

Nota

El Durable Task Framework mantiene el mismo identificador de instancia pero crea internamente un nuevo identificador de ejecución para la función del orquestador que se reinicia con continue-as-new. Este identificador de ejecución no se expone externamente, pero puede ser útil conocerlo al depurar la ejecución de la orquestación.

Ejemplo de trabajo periódico

Un caso práctico de orquestaciones infinitas es el del código que se necesita para realizar trabajo 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

El ejemplo de C# anterior corresponde a Durable Functions 2.x. En el caso de Durable Functions 1.x, debe usar DurableOrchestrationContext en lugar de IDurableOrchestrationContext. Para obtener más información sobre las diferencias entre versiones, vea el artículo Versiones de Durable Functions.

La diferencia entre este ejemplo y una función desencadenada por temporizador es que aquí los tiempos del desencadenador de limpieza no se basan en una programación. Por ejemplo, una programación CRON que ejecuta una función cada hora lo hará a la 1:00, 2:00, 3:00, etc. y potencialmente podría encontrarse con problemas de superposición. Sin embargo, en este ejemplo, si la limpieza tarda 30 minutos, se programará a la 1:00, 2:30, 4:00, etc., de forma que no habrá posibilidad alguna de superposición.

Inicio de una orquestación infinita

Use el método de cliente durable start-new o schedule-new para iniciar una orquestación eterna, como lo haría con cualquier otra función de orquestación.

Nota

Si debe asegurarse de que se ejecuta una orquestación infinita singleton, es importante mantener el mismo id de instancia al iniciar la orquestación. Para más información, consulte el artículo sobre la administración de instancias.

[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

El código anterior corresponde a Durable Functions 2.x. En el caso de Durable Functions 1.x, debe usar el atributo OrchestrationClient en lugar del atributo DurableClient, además de usar el tipo de parámetro DurableOrchestrationClient en lugar de IDurableOrchestrationClient. Para obtener más información sobre las diferencias entre versiones, vea el artículo Versiones de Durable Functions.

Salir de una orquestación infinita

Si en algún momento fuera necesario completar una función de orquestador, lo único que debe hacer es no llamar a ContinueAsNew y dejar que la función se cierre.

Si una función del orquestador está en un bucle infinito y necesita detenerse, usa la API de finalizar del enlace del cliente de orquestación para detenerla. Para más información, consulte el artículo sobre la administración de instancias.

Pasos siguientes