Temporizadores en Durable Functions (Azure Functions)Timers in Durable Functions (Azure Functions)

Durable Functions proporciona temporizadores durables para usarlos en funciones de orquestador para implementar retrasos o configurar tiempos de expiración en acciones asincrónicas.Durable Functions provides durable timers for use in orchestrator functions to implement delays or to set up timeouts on async actions. Los temporizadores durables deben usarse en funciones de orquestador en lugar de Thread.Sleep y Task.Delay (C#), o setTimeout() y setInterval() (JavaScript).Durable timers should be used in orchestrator functions instead of Thread.Sleep and Task.Delay (C#), or setTimeout() and setInterval() (JavaScript).

Puede crear un temporizador durable si llama al método CreateTimer (.NET) o al método createTimer (JavaScript) del enlace del desencadenador de orquestación.You create a durable timer by calling the CreateTimer (.NET) method or the createTimer (JavaScript) method of the orchestration trigger binding. El método devuelve una tarea que se completa en una fecha y hora especificadas.The method returns a task that completes on a specified date and time.

Limitaciones de los temporizadoresTimer limitations

Cuando se crea un temporizador que expira a las 16:30, la instancia de Durable Task Framework subyacente pone en cola un mensaje que se vuelve visible solo a las 16:30.When you create a timer that expires at 4:30 pm, the underlying Durable Task Framework enqueues a message that becomes visible only at 4:30 pm. Al ejecutarse en el plan Consumo de Azure Functions, el mensaje del temporizador ahora visible garantiza que la aplicación de función se active en una máquina virtual adecuada.When running in the Azure Functions Consumption plan, the newly visible timer message will ensure that the function app gets activated on an appropriate VM.

Nota

  • Los temporizadores durables están limitados actualmente a 7 días.Durable timers are currently limited to 7 days. Si se necesitan retrasos más largos, se pueden simular mediante las API del temporizador en un bucle while.If longer delays are needed, they can be simulated using the timer APIs in a while loop.
  • Use siempre CurrentUtcDateTime en lugar de DateTime.UtcNow en .NET, o bien currentUtcDateTime en lugar de Date.now o Date.UTC en JavaScript al calcular el tiempo de activación de los temporizadores durables.Always use CurrentUtcDateTime instead of DateTime.UtcNow in .NET or currentUtcDateTime instead of Date.now or Date.UTC in JavaScript when computing the fire time for durable timers. Para más información, consulte el artículo sobre las restricciones de código de las funciones de orquestador.For more information, see the orchestrator function code constraints article.

Uso para retrasoUsage for delay

En el ejemplo siguiente se muestra cómo utilizar temporizadores durables para retrasar la ejecución.The following example illustrates how to use durable timers for delaying execution. En el ejemplo se emite una notificación de facturación cada día durante 10 días.The example is issuing a billing notification every day for 10 days.

[FunctionName("BillingIssuer")]
public static async Task Run(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    for (int i = 0; i < 10; i++)
    {
        DateTime deadline = context.CurrentUtcDateTime.Add(TimeSpan.FromDays(1));
        await context.CreateTimer(deadline, CancellationToken.None);
        await context.CallActivityAsync("SendBillingEvent");
    }
}

Nota

El ejemplo de C# anterior corresponde a Durable Functions 2.x.The previous C# example targets Durable Functions 2.x. En el caso de Durable Functions 1.x, debe usar DurableOrchestrationContext en lugar de IDurableOrchestrationContext.For Durable Functions 1.x, you must use DurableOrchestrationContext instead of IDurableOrchestrationContext. Para obtener más información sobre las diferencias entre versiones, vea el artículo Versiones de Durable Functions.For more information about the differences between versions, see the Durable Functions versions article.

Advertencia

Evite bucles infinitos en funciones de orquestador.Avoid infinite loops in orchestrator functions. Para más información acerca de cómo implementar de forma segura y eficaz escenarios de bucle infinito, consulte Orquestaciones infinitas.For information about how to safely and efficiently implement infinite loop scenarios, see Eternal Orchestrations.

Uso para tiempo de expiraciónUsage for timeout

En este ejemplo se muestra cómo utilizar temporizadores durables para implementar tiempos de expiración.This example illustrates how to use durable timers to implement timeouts.

[FunctionName("TryGetQuote")]
public static async Task<bool> Run(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    TimeSpan timeout = TimeSpan.FromSeconds(30);
    DateTime deadline = context.CurrentUtcDateTime.Add(timeout);

    using (var cts = new CancellationTokenSource())
    {
        Task activityTask = context.CallActivityAsync("GetQuote");
        Task timeoutTask = context.CreateTimer(deadline, cts.Token);

        Task winner = await Task.WhenAny(activityTask, timeoutTask);
        if (winner == activityTask)
        {
            // success case
            cts.Cancel();
            return true;
        }
        else
        {
            // timeout case
            return false;
        }
    }
}

Nota

El ejemplo de C# anterior corresponde a Durable Functions 2.x.The previous C# example targets Durable Functions 2.x. En el caso de Durable Functions 1.x, debe usar DurableOrchestrationContext en lugar de IDurableOrchestrationContext.For Durable Functions 1.x, you must use DurableOrchestrationContext instead of IDurableOrchestrationContext. Para obtener más información sobre las diferencias entre versiones, vea el artículo Versiones de Durable Functions.For more information about the differences between versions, see the Durable Functions versions article.

Advertencia

Use CancellationTokenSource (.NET) o llame a cancel() en el elemento TimerTask devuelto (JavaScript) para cancelar un temporizador durable si el código no va a esperar a que se complete.Use a CancellationTokenSource (.NET) or call cancel() on the returned TimerTask (JavaScript) to cancel a durable timer if your code will not wait for it to complete. Durable Task Framework no cambiará el estado de una orquestación a "Completed" (Completado) hasta que todas las tareas pendientes se hayan completado o cancelado.The Durable Task Framework will not change an orchestration's status to "completed" until all outstanding tasks are completed or canceled.

Este mecanismo de cancelación no finaliza las ejecuciones de suborquestación o función de actividad en curso.This cancellation mechanism doesn't terminate in-progress activity function or sub-orchestration executions. En su lugar, simplemente permite que la función de orquestador pase por alto el resultado y continúe.Rather, it simply allows the orchestrator function to ignore the result and move on. Si la aplicación de función usa el plan Consumo, se le sigue facturando por el tiempo y la memoria consumidos por la función de actividad abandonada.If your function app uses the Consumption plan, you'll still be billed for any time and memory consumed by the abandoned activity function. De manera predeterminada, las funciones en ejecución en el plan de consumo tienen un tiempo de expiración de cinco minutos.By default, functions running in the Consumption plan have a timeout of five minutes. Si se supera este límite, el host de Azure Functions se recicla para detener toda la ejecución y evitar una situación de facturación descontrolada.If this limit is exceeded, the Azure Functions host is recycled to stop all execution and prevent a runaway billing situation. El tiempo de expiración de la función se puede configurar.The function timeout is configurable.

Para obtener un ejemplo más detallado de cómo implementar tiempos de espera en funciones de orquestador, vea el artículo Las interacciones humanas en Durable Functions: comprobación telefónica de ejemplo.For a more in-depth example of how to implement timeouts in orchestrator functions, see the Human Interaction & Timeouts - Phone Verification article.

Pasos siguientesNext steps