지속성 함수의 타이머(Azure Functions)

Durable Functions는 오케스트레이터 함수에서 지연을 구현하거나 비동기 작업에 시간 제한을 설정하는 데 사용할 수 있는 지속성 타이머를 제공합니다. 지속성 타이머는 언어에 기본 제공될 수 있는 "절전 모드" 또는 "지연" API 대신 오케스트레이터 함수에 사용해야 합니다.

지속성 타이머는 아래와 같이 제공된 언어에 대한 적절한 "타이머 만들기" API를 사용하여 생성되고 기한 또는 기간을 인수로 사용하는 태스크입니다.

// Put the orchestrator to sleep for 72 hours
DateTime dueTime = context.CurrentUtcDateTime.AddHours(72);
await context.CreateTimer(dueTime, CancellationToken.None);

타이머 작업을 "대기"하면 오케스트레이터 함수는 지정된 만료 시간까지 절전 모드가 됩니다.

참고 항목

오케스트레이션은 타이머 태스크가 만료될 때까지 기다리는 동안 들어오는 다른 이벤트를 계속 처리합니다.

타이머 제한 사항

오후 4시 30분(UTC)에 만료되는 타이머를 만들면 기본 지속형 작업 프레임워크에서 오후 4시 30분(UTC)에만 표시되는 메시지를 큐에 넣습니다. 그동안 함수 앱이 0개의 인스턴스로 스케일 다운되는 경우 새로 표시되는 타이머 메시지는 함수 앱이 적절한 VM에서 다시 활성화되도록 합니다.

참고 항목

  • JavaScript, Python 및 PowerShell 앱의 경우 Durable 타이머는 6일로 제한됩니다. 이 제한을 해결하기 위해 while 루프에서 타이머 API를 사용하여 더 긴 지연을 시뮬레이트할 수 있습니다. 최신 .NET 및 Java 앱은 임의로 긴 타이머를 지원합니다.
  • 사용 중인 SDK 및 스토리지 공급자 버전에 따라, 6일 이상의 긴 타이머는 원하는 만료 시간에 도달할 때까지 일련의 짧은 타이머(예: 3일 기간)를 사용하여 내부적으로 구현될 수 있습니다. 기본 데이터 저장소에서 관찰할 수 있지만 오케스트레이션 동작에는 영향을 주지 않습니다.
  • 현재 시간을 가져오기 위해 기본 제공 날짜/시간 API를 사용하지 마세요. 타이머가 만료되는 이후 날짜를 계산할 때는 항상 오케스트레이터 함수의 현재 시간 API를 사용합니다. 자세한 내용은 오케스트레이터 함수 코드 제약 조건 문서를 참조하세요.

지연 사용

다음 예제에서는 실행 지연에 지속성 타이머를 사용하는 방법을 보여 줍니다. 예제에서는 청구 알림을 10일 동안 매일 실행합니다.

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

Warning

오케스트레이터 함수에는 무한 루프를 사용하지 않도록 방지하세요. 무한 루프 시나리오를 안전하고 효율적으로 구현하는 방법에 대한 자세한 내용은 영구 오케스트레이션을 참조 하세요.

시간 제한 사용

이 예제에서는 지속성 타이머를 사용하여 시간 제한을 구현하는 방법을 보여 줍니다.

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

Warning

.NET, JavaScript, Python 및 PowerShell에서 코드가 완료될 때까지 기다리지 않는 경우 생성된 지속성 타이머를 취소해야 합니다. 보류 중인 타이머를 취소하는 방법은 위의 예제를 참조하세요. Durable Task Framework에서는 지속형 타이머 태스크를 포함하여 처리 중인 모든 태스크가 완료되거나 취소될 때까지 오케스트레이션의 상태가 "완료됨"으로 변경되지 않습니다.

when-any 패턴을 사용하는 이 취소 메커니즘은 진행 중인 작업 함수 또는 하위 오케스트레이션 실행을 종료하지 않습니다. 대신 오케스트레이터 함수가 결과를 무시하고 계속 진행할 수 있습니다. 함수 앱에서 소비 계획을 사용하는 경우 중단된 작업 함수에서 사용한 시간 및 메모리에 대한 요금이 계속 청구됩니다. 기본적으로 소비 계획에서 실행되는 함수의 시간 제한은 5분입니다. 이 제한을 초과하면 모든 실행을 중지하고 런어웨이 청구 상황을 방지하기 위해 Azure Functions 호스트가 재활용됩니다. 함수 시간 제한을 구성할 수 있습니다.

오케스트레이터 함수에서 시간 제한을 구현하는 방법에 대한 자세한 예제는 사용자 상호 작용 및 시간 제한 - 전화 확인 문서를 참조하세요.

다음 단계