지속성 함수의 영구 오케스트레이션(Azure Functions)

영구 오케스트레이션은 절대로 종료하지 않는 오케스트레이터 함수이며, 집계기 및 무한 루프가 필요한 모든 시나리오에 지속성 함수를 사용하려는 경우에 유용합니다.

오케스트레이션 기록

오케스트레이션 기록 주제에서 설명한 것처럼 지속성 작업 프레임워크는 각 기능 오케스트레이션의 기록을 추적합니다. 이 기록은 오케스트레이터 함수에서 새 작업을 계속 예약하는 한 지속적으로 증가합니다. 오케스트레이터 함수가 무한 루프에 들어가 지속적으로 작업을 예약하는 경우 이 기록이 매우 크게 증가할 수 있으며 심각한 성능 문제가 발생할 수 있습니다. 영구 오케스트레이션 개념은 무한 루프가 필요한 애플리케이션에서 이러한 종류의 문제를 완화하도록 설계되었습니다.

다시 설정 및 다시 시작

오케스트레이터 함수는 무한 루프를 사용하는 대신 오케스트레이션 트리거 바인딩continue-as-new 메서드를 호출하여 상태를 다시 설정합니다. 이 메서드는 다음 오케스트레이터 함수 생성을 위한 새 입력이 되는 JSON 직렬화 가능 매개 변수를 사용합니다.

continue-as-new가 호출되면 오케스트레이션 인스턴스가 새 입력 값으로 다시 시작됩니다. 동일한 인스턴스 ID를 유지하지만 오케스트레이터 함수의 기록이 재설정됩니다.

참고 항목

지속성 작업 프레임워크는 동일한 인스턴스 ID를 유지하지만, continue-as-new로 다시 설정되는 오케스트레이터 함수에 대해 내부적으로 새 실행 ID를 만듭니다. 이 실행 ID는 외부적으로 노출되지 않지만 오케스트레이션 실행을 디버그할 때 알고 있으면 유용할 수 있습니다.

정기 작업 예제

영구 오케스트레이션을 위한 한 가지 사용 사례는 무한정 주기적으로 작업해야 하는 코드입니다.

[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# 예제는 Durable Functions 2.x용입니다. Durable Functions 1.x의 경우 IDurableOrchestrationContext 대신 DurableOrchestrationContext를 사용해야 합니다. 버전 간 차이점에 관한 자세한 내용은 Durable Functions 버전 문서를 참조하세요.

이 예제와 타이머 트리거 함수 간의 차이점은 여기서 정리 타이머 시간이 일정에 기반하지 않는다는 것입니다. 예를 들어 매시간 함수를 실행하는 CRON 일정은 1시, 2시, 3시 등에 실행되며 잠재적으로 겹침 문제가 발생할 수 있습니다. 그러나 이 예제에서 정리에 30분이 걸리면 1시, 2시 30분, 4시 등으로 예약되며 겹쳐질 가능성이 없습니다.

영구 오케스트레이션 시작

다른 오케스트레이션 함수와 마찬가지로 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);
}

참고 항목

이전 코드는 Durable Functions 2.x용입니다. Durable Functions 1.x의 경우 DurableClient 특성 대신 OrchestrationClient 특성을 사용해야 하며 IDurableOrchestrationClient 대신 DurableOrchestrationClient 매개 변수 형식을 사용해야 합니다. 버전 간 차이점에 관한 자세한 내용은 Durable Functions 버전 문서를 참조하세요.

영구 오케스트레이션 종료

오케스트레이터 함수가 결국 완료되어야 하는 경우에는 ContinueAsNew호출하지 않고 함수가 종료되도록 해야 합니다.

오케스트레이터 함수가 무한 루프에 있고 중지해야 하는 경우 오케스트레이션 클라이언트 바인딩terminate API를 사용하여 중지합니다. 자세한 내용은 인스턴스 관리를 참조하세요.

다음 단계