함수 체이닝은 특정 순서로 일련의 함수를 실행하는 패턴을 나타냅니다. 종종 한 함수의 출력을 다른 함수의 입력에 적용해야 합니다. 이 문서에서는 Durable Functions 빠른 시작(C#, JavaScript, TypeScript, Python, PowerShell 또는 Java)을 완료할 때 생성되는 체이닝 시퀀스에 대해 설명합니다. Durable Functions에 대한 자세한 내용은 Durable Functions 개요를 참조하세요.
Azure Functions용 Node.js 프로그래밍 모델 버전 4가 일반 공급됩니다. 새로운 v4 모델은 JavaScript 및 TypeScript 개발자에게 보다 유연하고 직관적인 환경을 제공하도록 설계되었습니다. 마이그레이션 가이드에서 v3과 v4의 차이점에 대해 자세히 알아봅니다.
다음 코드 조각에서 JavaScript(PM4)는 새로운 환경인 프로그래밍 모델 V4를 나타냅니다.
함수
이 문서에서는 샘플 앱의 다음 함수에 대해 설명합니다.
E1_HelloSequence: 시퀀스에서 E1_SayHello를 여러 번 호출하는 오케스트레이터 함수입니다. E1_SayHello 호출의 출력을 저장하고 결과를 기록합니다.
모든 C# 오케스트레이션 함수에는 Microsoft.Azure.WebJobs.Extensions.DurableTask 어셈블리에 있는 DurableOrchestrationContext 유형 매개 변수가 있어야 합니다. 이 컨텍스트 개체를 사용하면 다른 작업 함수를 호출하고 해당 CallActivityAsync 메서드를 사용하여 입력 매개 변수를 전달할 수 있습니다.
코드에서는 여러 매개 변수 값을 사용하여 E1_SayHello을 순서대로 세 번 호출합니다. 각 호출의 반환 값은 함수의 끝에서 반환되는 outputs 목록에 추가됩니다.
function.json
Visual Studio Code 또는 Azure Portal을 사용하여 개발하는 경우 오케스트레이터 함수에 대한 function.json 파일의 내용이 여기에 있습니다. 대부분의 오케스트레이터 function.json 파일은 거의 이와 비슷합니다.
중요한 것은 orchestrationTrigger 바인딩 형식입니다. 오케스트레이터 함수는 모두 이 트리거 형식을 사용해야 합니다.
Warning
오케스트레이터 함수의 "I/O 없음" 규칙을 준수하려면 orchestrationTrigger 트리거 바인딩을 사용할 때 입력 또는 출력 바인딩을 사용하지 마세요. 다른 입력 또는 출력 바인딩이 필요하면 오케스트레이터에서 호출하는 activityTrigger 함수의 컨텍스트에서 대신 사용해야 합니다. 자세한 내용은 오케스트레이터 함수 코드 제약 조건 문서를 참조하세요.
모든 JavaScript 오케스트레이션 함수는 durable-functions 모듈을 포함해야 합니다. JavaScript에서 Durable Functions를 작성할 수 있게 해주는 라이브러리입니다. 오케스트레이터 함수 및 다른 JavaScript 함수 사이에는 다음과 같은 세 가지 중요한 차이점이 있습니다.
동기 함수여야 합니다. '오케스트레이터' 메서드가 'context.done'에 대한 최종 호출을 처리하므로 함수는 단순히 '반환'만 하면 됩니다.
context 개체에는 다른 작업 함수를 호출하고 해당 callActivity 메서드를 사용하여 입력 매개 변수를 전달할 수 있는 df 지속형 오케스트레이션 컨텍스트 개체가 포함되어 있습니다. 코드는 다른 매개 변수 값을 사용하여 E1_SayHello를 순차적으로 3번 호출하고, yield를 사용하여 비동기 작업 함수 호출이 반환될 때까지 실행을 대기해야 함을 나타냅니다. 각 호출의 반환 값은 함수의 끝에서 반환되는 outputs 배열에 추가됩니다.
모든 JavaScript 오케스트레이션 함수는 durable-functions 모듈을 포함해야 합니다. 이 모듈에서는 JavaScript에서 Durable Functions를 작성할 수 있습니다. V4 노드 프로그래밍 모델을 사용하려면 durable-functions의 미리 보기 v3.x 버전을 설치해야 합니다.
오케스트레이터 함수 및 다른 JavaScript 함수 사이에는 다음과 같은 두 가지 중요한 차이점이 있습니다.
context 개체에는 다른 작업 함수를 호출하고 해당 callActivity 메서드를 사용하여 입력 매개 변수를 전달할 수 있는 df 지속형 오케스트레이션 컨텍스트 개체가 포함되어 있습니다. 코드는 다른 매개 변수 값을 사용하여 sayHello를 순차적으로 3번 호출하고, yield를 사용하여 비동기 작업 함수 호출이 반환될 때까지 실행을 대기해야 함을 나타냅니다. 각 호출의 반환 값은 함수의 끝에서 반환되는 outputs 배열에 추가됩니다.
참고 항목
Python Durable Functions은 Functions 3.0 런타임에서만 사용할 수 있습니다.
function.json
Visual Studio Code 또는 Azure Portal을 사용하여 개발하는 경우 오케스트레이터 함수에 대한 function.json 파일의 내용이 여기에 있습니다. 대부분의 오케스트레이터 function.json 파일은 거의 이와 비슷합니다.
중요한 것은 orchestrationTrigger 바인딩 형식입니다. 오케스트레이터 함수는 모두 이 트리거 형식을 사용해야 합니다.
Warning
오케스트레이터 함수의 "I/O 없음" 규칙을 준수하려면 orchestrationTrigger 트리거 바인딩을 사용할 때 입력 또는 출력 바인딩을 사용하지 마세요. 다른 입력 또는 출력 바인딩이 필요하면 오케스트레이터에서 호출하는 activityTrigger 함수의 컨텍스트에서 대신 사용해야 합니다. 자세한 내용은 오케스트레이터 함수 코드 제약 조건 문서를 참조하세요.
모든 Python 오케스트레이션 함수는 durable-functions 패키지를 포함해야 합니다. Python에서 Durable Functions을 작성할 수 있게 해주는 라이브러리입니다. 오케스트레이터 함수 및 다른 Python 함수 사이에는 다음과 같은 두 가지 중요한 차이점이 있습니다.
파일은 파일 끝에 main = df.Orchestrator.create(<orchestrator function name>)를 지정하여 오케스트레이터 함수를 오케스트레이터로 등록해야 합니다. 이를 통해 파일에 선언된 다른 도우미 함수와 구별할 수 있습니다.
context 개체를 사용하면 다른 작업 함수를 호출하고 해당 call_activity 메서드를 사용하여 입력 매개 변수를 전달할 수 있습니다. 코드는 다른 매개 변수 값을 사용하여 E1_SayHello를 순차적으로 3번 호출하고, yield를 사용하여 비동기 작업 함수 호출이 반환될 때까지 실행을 대기해야 함을 나타냅니다. 각 호출의 반환 값은 함수의 끝에 반환됩니다.
오케스트레이션 함수에서 호출하는 모든 작업 함수는 activityTrigger 바인딩을 사용해야 합니다.
E1_SayHello의 구현은 비교적 간단한 문자열 형식 지정 작업입니다.
E1_SayHello/index.js
module.exports = function (context) {
context.done(null, `Hello ${context.bindings.name}!`);
};
오케스트레이션 함수와 달리 작업 함수에는 특별한 설정이 필요하지 않습니다. 오케스트레이터 함수에 의해 전달되는 입력은 activityTrigger 바인딩 이름(이 경우 context.bindings.name) 아래의 context.bindings 개체에 있습니다. 바인딩 이름은 내보낸 함수의 매개 변수로 설정되고 직접 액세스될 수 있습니다. 샘플 코드는 이 작업을 수행합니다.
오케스트레이터를 관리하고 상호 작용하려면 함수에 durableClient 입력 바인딩이 있어야 합니다. 함수를 등록할 때 extraInputs 인수에 이 바인딩을 지정해야 합니다. durableClient 입력은 df.input.durableClient()를 호출하여 가져올 수 있습니다.
df.getClient 개체를 가져오려면 DurableClient를 사용합니다. 클라이언트를 사용하여 오케스트레이션을 시작합니다. 또한 새 오케스트레이션의 상태를 확인하기 위해 URL이 포함된 HTTP 응답을 반환하는 데 도움이 될 수 있습니다.
오케스트레이터와 상호 작용하려면 함수에 durableClient 입력 바인딩이 포함되어야 합니다.
HttpStart/__init__.py
import logging
import azure.functions as func
import azure.durable_functions as df
async def main(req: func.HttpRequest, starter: str) -> func.HttpResponse:
client = df.DurableOrchestrationClient(starter)
instance_id = await client.start_new(req.route_params["functionName"], None, None)
logging.info(f"Started orchestration with ID = '{instance_id}'.")
return client.create_check_status_response(req, instance_id)
DurableOrchestrationClient 생성자를 사용하여 Durable Functions 클라이언트를 가져옵니다. 클라이언트를 사용하여 오케스트레이션을 시작합니다. 또한 새 오케스트레이션의 상태를 확인하기 위해 URL이 포함된 HTTP 응답을 반환하는 데 도움이 될 수 있습니다.
샘플 실행
E1_HelloSequence 오케스트레이션을 실행하려면 다음 HTTP POST 요청을 HttpStart 함수로 전송합니다.
POST http://{host}/orchestrators/E1_HelloSequence
참고 항목
이전 HTTP 코드 조각에서는 모든 HTTP 트리거 함수 URL에서 기본 api/ 접두사를 제거하는 항목이 host.json 파일에 있다고 가정합니다. 샘플의 host.json 파일에서 이 구성에 대한 변경 내용을 찾을 수 있습니다.
예를 들어 "myfunctionapp"이라는 함수 앱에서 샘플을 실행하는 경우 "{host}"를 "myfunctionapp.azurewebsites.net"으로 바꿉니다.
이 시점에서 오케스트레이션은 큐에서 대기한 다음 즉시 실행되기 시작합니다. Location 헤더의 URL을 사용하여 실행 상태를 확인할 수 있습니다.
GET http://{host}/runtime/webhooks/durabletask/instances/96924899c16d43b08a536de376ac786b?taskHub=DurableFunctionsHub&connection=Storage&code={systemKey}
결과는 오케스트레이션의 상태입니다. 빠르게 실행되고 완료되므로 다음과 같은 응답과 함께 완료됨 상태로 표시됩니다(간결하게 정리되었음).