Нескончаемые оркестрации в устойчивых функциях (Функции Azure)

Нескончаемые оркестрации — это функции оркестрации, которые никогда не останавливаются. Они позволяют создать устойчивые функции для агрегаторов или в любых других ситуациях, когда нужен бесконечный цикл.

Журнал оркестраций

Как описано в разделе, посвященном истории оркестрации, платформа устойчивых задач сохраняет журнал оркестраций для каждой функции. Этот журнал постоянно растет, пока функция оркестрации продолжает планировать новые работы. Если функция оркестрации уходит в бесконечный цикл и продолжает планировать работы, этот журнал может достигнуть критического размера, что приведет к существенным проблемам с производительностью. Для устранения таких проблем в приложениях с бесконечными циклами была разработана концепция нескончаемой оркестрации.

Сброс и перезапуск

Вместо использования бесконечных циклов функции оркестратора сбрасывают свое состояние, вызывая метод continue-as-new для привязки триггера оркестрации. Этот метод принимает параметр в формате JSON, который используется входных данных для функции оркестрации нового поколения.

При вызове метода continue-as-new экземпляр оркестрации перезапускается с новым входным значением. Идентификатор экземпляра сохраняется, но журнал функции оркестратора сбрасывается.

Примечание

Для функции оркестрации, которая выполняет сброс с помощью метода continue-as-new, платформа устойчивых задач сохраняет идентификатор экземпляра, но создает новый внутренний идентификатор выполнения. Этот идентификатор выполнения не передается наружу, но его можно использовать при отладке выполнения оркестрации.

Пример периодической работы

Нескончаемые оркестрации могут быть полезны, например, в коде, который должен неограниченно долго выполнять периодические работы.

[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);
}

Примечание

Предыдущий пример C# предназначен для расширения "Устойчивые функции" версии 2.x. Для расширения "Устойчивые функции" версии 1.x необходимо использовать DurableOrchestrationContext вместо IDurableOrchestrationContext. Дополнительные сведения о различиях между версиями см. в статье Версии устойчивых функций.

Разница между этим примером и запуском функции по таймеру заключается в том, что триггер очистки здесь можно не привязывать к расписанию. Например, если функция выполняется каждый час по расписанию CRON, она будет запущена в 1:00, 2:00, 3:00 и т.д., что может привести к проблемам наложения. А в нашем варианте, если очистка продолжается 30 минут, функция будет выполняться в 1:00, 2:30, 4:00, т. д., что позволяет избежать наложения.

Запуск нескончаемой оркестрации

Используйте для запуска нескончаемой оркестрации метод start-new или schedule-new точно так же, как при запуске любой другой функции оркестрации.

Примечание

Если вам нужно убедиться, что выполняется отдельная нескончаемая оркестрация, важно сохранить тот же экземпляр id при запуске оркестрации. Дополнительные сведения см. в статье об управлении экземплярами.

[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);
}

Примечание

Предыдущий пример предназначен для Устойчивых функций версии 2.x. Для Устойчивых функций версии 1.x нужно указать атрибут OrchestrationClient вместо DurableClient и тип параметра DurableOrchestrationClient вместо IDurableOrchestrationClient. Дополнительные сведения о различиях между версиями см. в статье Версии устойчивых функций.

Выход из нескончаемой оркестрации

Если потребуется завершить функцию оркестрации, достаточно лишь не вызывать метод ContinueAsNew и дождаться обычного выхода из функции.

Если функция оркестратора находится в бесконечном цикле и ее необходимо остановить, используйте API terminate из клиентской привязки оркестрации. Дополнительные сведения см. в статье об управлении экземплярами.

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