영구 오케스트레이션 은 끝나지 않는 오케스트레이터 함수입니다. 집계 및 무한 루프가 필요한 시나리오에 Durable Functions 를 사용하려는 경우에 유용합니다.
오케스트레이션 기록
오케스트레이션 기록 항목에 설명된 대로 지속성 작업 프레임워크는 각 함수 오케스트레이션의 기록을 추적합니다. 오케스트레이터 함수가 계속해서 새 작업을 예약하는 한 이 기록은 지속적으로 증가합니다. 오케스트레이터 함수가 무한 루프로 전환되고 지속적으로 작업을 예약하는 경우 이 기록이 크게 증가하고 심각한 성능 문제가 발생할 수 있습니다. 영구 오케스트레이션 개념은 무한 루프가 필요한 애플리케이션에 대해 이러한 종류의 문제를 완화하도록 설계되었습니다.
다시 설정 및 다시 시작
오케스트레이터 함수는 무한 루프를 사용하는 대신 continue-as-new의 메서드를 호출하여 상태를 다시 설정합니다. 이 메서드는 JSON 직렬화 가능 매개 변수를 사용합니다. 이 매개 변수는 다음 오케스트레이터 함수 생성을 위한 새 입력이 됩니다.
호출 continue-as-new하면 오케스트레이션 인스턴스가 새 입력 값으로 다시 시작됩니다. 동일한 인스턴스 ID가 유지되지만 오케스트레이터 함수의 기록이 다시 설정됩니다.
영구 오케스트레이션 고려 사항
오케스트레이션에서 메서드를 continue-as-new 사용할 때는 다음 사항을 고려해야 합니다.
오케스트레이터 함수가 메서드를 사용하여
continue-as-new다시 설정되면 Durable Task Framework는 동일한 인스턴스 ID를 유지하지만 내부적으로는 앞으로 새 실행 ID 를 만들고 사용합니다. 이 실행 ID는 외부에서 노출되지 않지만 오케스트레이션 실행을 디버깅할 때 유용할 수 있습니다.실행 중에 처리되지 않은 예외가 발생하면 오케스트레이션이 실패한 상태로 전환되고 실행이 종료됩니다. 이 상태에서는 try-catch 문의
finally블록에서 만들어진continue-as-new를 호출해도 오케스트레이션을 다시 시작할 수 없습니다.
중요합니다
실행 중에 오케스트레이션에서 처리되지 않은 예외가 발생하면 오케스트레이션은 "실패" 상태가 되고 실행이 완료됩니다. 특히 이는 블록 내에서도 finally 호출로 인해 캐치되지 않은 예외가 발생한 경우 오케스트레이션을 다시 시작하지 않는다는 것을 의미합니다.
주기적 작업 예제
영구 오케스트레이션의 한 가지 사용 사례는 무기한 주기적인 작업을 수행해야 하는 코드입니다.
[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의 경우, DurableOrchestrationContext 대신 IDurableOrchestrationContext를 사용해야 합니다. 버전 간의 차이점에 대한 자세한 내용은 Durable Functions 버전 문서를 참조하세요.
이 예제와 타이머 트리거 함수의 차이점은 정리 트리거 시간이 일정에 기반하지 않는다는 점입니다. 예를 들어 매시간 함수를 실행하는 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);
}
비고
이전 코드는 Durable Functions 2.x용입니다. Durable Functions 1.x의 경우 OrchestrationClient 특성을 대신하여 DurableClient 특성을 사용하고, IDurableOrchestrationClient 대신 DurableOrchestrationClient 매개 변수 형식을 사용합니다. 버전 간의 차이점에 대한 자세한 내용은 Durable Functions 버전 문서를 참조하세요.
영원한 오케스트레이션에서 벗어나다
오케스트레이터 함수가 결국 완료되어야 하는 경우 호출 ContinueAsNew 함수를 종료하기만 하면 됩니다.
오케스트레이터 함수가 무한 루프에 있고 중지해야 하는 경우 오케스트레이션 클라이언트 바인딩의 종료 API를 사용하여 중지합니다. 자세한 내용은 인스턴스 관리를 참조하세요.