타이머를 사용하여 장기 실행 태스크 제어

완료됨

장기 실행 워크플로를 사용하는 경우 몇 가지 추가 시나리오를 고려하는 것이 중요합니다. 예를 들어, 태스크가 허용 가능한 기간 내에 완료되지 않으면 어떻게 해야 하는가? 태스크의 상태를 확인할 수 있는 방법은 무엇인가? 시간 제한 및 에스컬레이션 경로를 사용하여 이러한 문제를 해결할 수 있는가?

예제 시나리오에서는 프로젝트 디자인 제안서가 제때에 승인되지 않으면 조치를 취하는 에스컬레이션 단계를 통합하도록 새 워크플로를 수정하라는 요청을 받았습니다.

이 단원에서는 지속형 타이머를 사용하여 장기 실행 작업을 제어하는 방법과 타이머에 기반하여 에스컬레이션 경로를 추가하는 방법을 알아봅니다.

Durable Functions의 타이머

Durable Functions는 오케스트레이터 함수에서 사용할 타이머를 제공합니다. 이 타이머는 지연을 구현하거나 비동기 작업에 대한 제한 시간을 설정하는 데 사용할 수 있습니다. setTimeout()setInterval() 함수 대신 오케스트레이터 함수의 지속성 타이머를 사용해야 합니다.

지속형 타이머는 DurableOrchestrationContextcreateTimer() 메서드를 호출하여 만들 수 있습니다. 이 메서드는 지정된 날짜 및 시간에 다시 시작하는 작업을 반환합니다.

지연에 타이머 사용

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

const df = require("durable-functions");
const moment = require("moment");

module.exports = df.orchestrator(function*(context) {
    for (let i = 0; i < 10; i++) {
        const deadline = moment.utc(context.df.currentUtcDateTime).add(i, 'd');
        yield context.df.createTimer(deadline.toDate());
        yield context.df.callActivity("SendReminder");
    }
});

항상 Date.now 또는 Date.UTC 대신 currentUtcDateTime을 사용하여 현재 날짜 및 시간을 가져와야 합니다.

시간 제한에 타이머 사용

다음 예제에서는 시간 제한에 지속성 타이머를 사용하는 방법을 보여 줍니다. 이 타이머는 시간 초과가 발생하면 다른 경로를 실행합니다. 이 예제에서 함수는 GetQuote 활동 함수가 완료되거나 최종 기한 타이머가 만료될 때까지 기다립니다. 활동 함수가 코드를 완료되면 코드는 성공 사례를 따르고, 그렇지 않은 경우 시간 초과 사례를 따릅니다.

const df = require("durable-functions");
const moment = require("moment");

module.exports = df.orchestrator(function*(context) {
    const deadline = moment.utc(context.df.currentUtcDateTime).add(30, "s");

    const activityTask = context.df.callActivity("GetQuote");
    const timeoutTask = context.df.createTimer(deadline.toDate());

    const winner = yield context.df.Task.any([activityTask, timeoutTask]);
    if (winner === activityTask) {
        // success case
        timeoutTask.cancel();
        return true;
    }
    else
    {
        // timeout case
        return false;
    }
});

다음 연습에서는 이 정보를 사용하여 오케스트레이터 함수에서 샘플 시나리오에 대한 에스컬레이션 경로를 추가합니다.