지속성 함수의 외부 이벤트 처리(Azure Functions)

오케스트레이터 함수에는 외부 이벤트를 대기 및 수신 대기하는 기능이 있습니다. 지속성 함수의 이 기능은 종종 인간 상호 작용 또는 다른 외부 트리거를 처리하는 데 유용합니다.

참고 항목

외부 이벤트는 단방향 비동기 작업입니다. 이 이벤트는 이벤트를 보내는 클라이언트가 오케스트레이터 기능의 동기 응답을 요구하는 상황에서는 적합하지 않습니다.

이벤트 대기

오케스트레이션 트리거 바인딩"wait-for-external-event" API를 사용하면 오케스트레이터 함수가 외부 클라이언트에서 전달한 이벤트를 비동기적으로 기다리고 수신 대기할 수 있습니다. 수신 오케스트레이터는 이벤트의 이름과 수신할 것으로 예상되는 데이터의 셰이프를 선언합니다.

[FunctionName("BudgetApproval")]
public static async Task Run(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    bool approved = await context.WaitForExternalEvent<bool>("Approval");
    if (approved)
    {
        // approval granted - do the approved action
    }
    else
    {
        // approval denied - send a notification
    }
}

참고 항목

이전 C# 코드는 Durable Functions 2.x용입니다. Durable Functions 1.x의 경우 IDurableOrchestrationContext 대신 DurableOrchestrationContext를 사용해야 합니다. 버전 간 차이점에 관한 자세한 내용은 Durable Functions 버전 문서를 참조하세요.

앞의 예제에서는 특정 단일 이벤트를 수신 대기하고, 이 이벤트가 수신되면 작업을 수행합니다.

수신 가능한 세 가지 이벤트 알림 중 하나를 기다리는 다음 예제와 같이 여러 이벤트를 동시에 수신 대기할 수 있습니다.

[FunctionName("Select")]
public static async Task Run(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    var event1 = context.WaitForExternalEvent<float>("Event1");
    var event2 = context.WaitForExternalEvent<bool>("Event2");
    var event3 = context.WaitForExternalEvent<int>("Event3");

    var winner = await Task.WhenAny(event1, event2, event3);
    if (winner == event1)
    {
        // ...
    }
    else if (winner == event2)
    {
        // ...
    }
    else if (winner == event3)
    {
        // ...
    }
}

참고 항목

이전 C# 코드는 Durable Functions 2.x용입니다. Durable Functions 1.x의 경우 IDurableOrchestrationContext 대신 DurableOrchestrationContext를 사용해야 합니다. 버전 간 차이점에 관한 자세한 내용은 Durable Functions 버전 문서를 참조하세요.

앞의 예제에서는 여러 이벤트 중 하나를 수신 대기합니다. 모든 이벤트를 기다릴 수도 있습니다.

[FunctionName("NewBuildingPermit")]
public static async Task Run(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    string applicationId = context.GetInput<string>();

    var gate1 = context.WaitForExternalEvent("CityPlanningApproval");
    var gate2 = context.WaitForExternalEvent("FireDeptApproval");
    var gate3 = context.WaitForExternalEvent("BuildingDeptApproval");

    // all three departments must grant approval before a permit can be issued
    await Task.WhenAll(gate1, gate2, gate3);

    await context.CallActivityAsync("IssueBuildingPermit", applicationId);
}

참고 항목

이전 코드는 Durable Functions 2.x용입니다. Durable Functions 1.x의 경우 IDurableOrchestrationContext 대신 DurableOrchestrationContext를 사용해야 합니다. 버전 간 차이점에 관한 자세한 내용은 Durable Functions 버전 문서를 참조하세요.

.NET에서 이벤트 페이로드를 필요한 T 형식으로 변환할 수 없으면 예외가 throw됩니다.

"wait-for-external-event" API는 일부 입력을 무기한 대기합니다. 함수 앱은 기다리는 동안 안전하게 언로드될 수 있습니다. 이 오케스트레이션 인스턴스에 이벤트가 도착하면 인스턴스가 자동으로 활성화하고 해당 이벤트를 즉시 처리합니다.

참고 항목

함수 앱이 Consumption Plan을 사용하는 경우 대기 시간에 관계없이 오케스트레이터 함수에서 외부 이벤트 작업을 기다리는 동안에 대한 요금은 청구되지 않습니다.

이벤트 보내기

오케스트레이션 클라이언트 바인딩에서 정의한 "raise-event" API를 사용하여 외부 이벤트를 오케스트레이션으로 보낼 수 있습니다. 기본 제공된 이벤트 발생 HTTP API를 사용하여 외부 이벤트를 오케스트레이션에 보낼 수도 있습니다.

발생한 이벤트에는 인스턴스 ID, eventNameeventData가 매개 변수로 포함되어 있습니다. 오케스트레이터 함수는 "wait-for-external-event" API를 사용하여 해당 이벤트를 처리합니다. 이벤트를 처리하려면 송신 측과 수신 측 모두에서 eventName이 일치해야 합니다. 이벤트 데이터는 JSON 직렬화도 가능해야 합니다.

"raise-event" 메커니즘은 내부적으로 대기 중인 오케스트레이터 함수에서 선택된 메시지를 큐에 넣습니다. 인스턴스가 지정된 이벤트 이름에서 대기하고 있지 않으면 이벤트 메시지가 메모리 내 큐에 추가됩니다. 오케스트레이션 인스턴스에서 나중에 해당 이벤트 이름에 대한 수신 대기를 시작하는 경우 이벤트 메시지가 큐에 있는지 확인합니다.

참고 항목

지정된 인스턴스 ID가 있는 오케스트레이션 인스턴스가 없으면 이벤트 메시지가 삭제됩니다.

다음은 오케스트레이터 함수 인스턴스에 "승인" 이벤트를 보내는 큐 트리거 함수 예제입니다. 오케스트레이션 인스턴스 ID는 큐 메시지 본문에서 가져옵니다.

[FunctionName("ApprovalQueueProcessor")]
public static async Task Run(
    [QueueTrigger("approval-queue")] string instanceId,
    [DurableClient] IDurableOrchestrationClient client)
{
    await client.RaiseEventAsync(instanceId, "Approval", true);
}

참고 항목

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

"raise-event" API는 내부적으로 대기 중인 오케스트레이터 함수에서 선택된 메시지를 큐에 넣습니다. 인스턴스가 지정된 이벤트 이름에서 대기하고 있지 않으면 이벤트 메시지가 메모리 내 버퍼에 추가됩니다. 나중에 오케스트레이션 인스턴스가 해당 이벤트 이름을 수신 대기하기 시작하면 버퍼에서 이벤트 메시지를 확인하고 대기 중인 작업을 트리거합니다.

참고 항목

지정된 인스턴스 ID가 있는 오케스트레이션 인스턴스가 없으면 이벤트 메시지가 삭제됩니다.

HTTP

다음은 오케스트레이션 인스턴스에 “승인” 이벤트를 발생시키는 HTTP 요청의 예입니다.

POST /runtime/webhooks/durabletask/instances/MyInstanceId/raiseEvent/Approval&code=XXX
Content-Type: application/json

"true"

이 경우 인스턴스 ID는 MyInstanceId로 하드 코드됩니다.

다음 단계