지속성 함수의 영구 오케스트레이션(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를 사용하여 중지합니다. 자세한 내용은 인스턴스 관리를 참조하세요.