Таймеры в устойчивых функциях (Функции Azure)Timers in Durable Functions (Azure Functions)

Устойчивые функции предоставляют устойчивые таймеры, которые используются в функциях оркестраторов для реализации задержек или настройки времени ожидания в асинхронных действиях.Durable Functions provides durable timers for use in orchestrator functions to implement delays or to set up timeouts on async actions. Устойчивые таймеры следует использовать в функциях оркестраторов вместо Thread.Sleep (C#) или Task.Delay``setTimeout()``setInterval() (JavaScript).Durable timers should be used in orchestrator functions instead of Thread.Sleep and Task.Delay (C#), or setTimeout() and setInterval() (JavaScript).

Устойчивый таймер создается путем вызова метода CreateTimer (.NET) или метода createTimer (JavaScript) привязки триггера оркестрации.You create a durable timer by calling the CreateTimer (.NET) method or the createTimer (JavaScript) method of the orchestration trigger binding. Метод возвращает задачу, которая завершается в указанные дату и время.The method returns a task that completes on a specified date and time.

Ограничения таймераTimer limitations

При создании таймера, срок действия которого истекает до 4:30 PM, базовая платформа устойчивых задач ставит в очередь сообщение, которое станет видимым только в 4: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. При запуске в плане потребления функций Azure вновь видимое сообщение таймера обеспечит активацию приложения функции на соответствующей виртуальной машине.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.

Примечание

  • Устойчивые таймеры в настоящее время ограничены 7 днями.Durable timers are currently limited to 7 days. Если требуется больше задержек, их можно имитировать с помощью API-интерфейсов таймера в цикле while.If longer delays are needed, they can be simulated using the timer APIs in a while loop.
  • Всегда используйте CurrentUtcDateTime вместо DateTime.UtcNow в .NET или currentUtcDateTime вместо Date.now или Date.UTC в JavaScript при вычислении времени срабатывания для устойчивых таймеров.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. Дополнительные сведения см. в статье ограничения кода функции Orchestrator .For more information, see the orchestrator function code constraints article.

Использование для задержкиUsage for delay

В следующем примере показано, как использовать устойчивые таймеры для задержки выполнения.The following example illustrates how to use durable timers for delaying execution. В этом примере выдается уведомление о выставлении счетов каждый день в течение 10 дней.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");
    }
}

Примечание

Предыдущий C# пример предназначен для устойчивые функции 2. x.The previous C# example targets Durable Functions 2.x. Для Устойчивые функции 1. x необходимо использовать DurableOrchestrationContext вместо IDurableOrchestrationContext.For Durable Functions 1.x, you must use DurableOrchestrationContext instead of IDurableOrchestrationContext. Дополнительные сведения о различиях между версиями см. в статье устойчивые функции версии .For more information about the differences between versions, see the Durable Functions versions article.

Предупреждение

Избегайте бесконечных циклов в функциях оркестраторов.Avoid infinite loops in orchestrator functions. Сведения о том, как безопасно и эффективно реализовать сценарии с бесконечным циклом, см. в описании внешних оркестраций.For information about how to safely and efficiently implement infinite loop scenarios, see Eternal Orchestrations.

Использование для установки времени ожиданияUsage for timeout

В этом примере показано, как использовать устойчивые таймеры для реализации времени ожидания.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;
        }
    }
}

Примечание

Предыдущий C# пример предназначен для устойчивые функции 2. x.The previous C# example targets Durable Functions 2.x. Для Устойчивые функции 1. x необходимо использовать DurableOrchestrationContext вместо IDurableOrchestrationContext.For Durable Functions 1.x, you must use DurableOrchestrationContext instead of IDurableOrchestrationContext. Дополнительные сведения о различиях между версиями см. в статье устойчивые функции версии .For more information about the differences between versions, see the Durable Functions versions article.

Предупреждение

Используйте CancellationTokenSource (.NET) или вызовите cancel() на возвращенном TimerTask (JavaScript), чтобы отменить устойчивый таймер, если ваш код не будет ждать его завершения.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. Платформа устойчивых задач не изменит состояние оркестрации на "завершено" до тех пор, пока все невыполненные задачи не будут завершены или отменены.The Durable Task Framework will not change an orchestration's status to "completed" until all outstanding tasks are completed or canceled.

Этот механизм отмены не прерывает выполняющиеся действия по выполнению функций или подorchestration.This cancellation mechanism doesn't terminate in-progress activity function or sub-orchestration executions. Вместо этого он просто позволяет функции оркестратора игнорировать результат и двигаться дальше.Rather, it simply allows the orchestrator function to ignore the result and move on. Если приложение-функция использует план потребления, плата за все время и память, потребляемые прерванной функцией действия, будет взиматься.If your function app uses the Consumption plan, you'll still be billed for any time and memory consumed by the abandoned activity function. По умолчанию для функций, выполняемых в плане потребления, устанавливается время ожидания в пять минут.By default, functions running in the Consumption plan have a timeout of five minutes. При превышении этого ограничения узел Функций Azure перезапускается для остановки выполнения всех процессов и предотвращения неконтролируемого выставления счетов.If this limit is exceeded, the Azure Functions host is recycled to stop all execution and prevent a runaway billing situation. Время ожидания функции можно настроить.The function timeout is configurable.

Более подробный пример реализации времени ожидания в функциях Orchestrator см. в статье взаимодействие с человеком & время ожидания — Проверка телефона .For a more in-depth example of how to implement timeouts in orchestrator functions, see the Human Interaction & Timeouts - Phone Verification article.

Дальнейшие действияNext steps