Durable Functions 확장에는 오케스트레이터, 엔터티 및 작업 함수의 실행을 제어하는 세 가지 트리거 바인딩이 도입되었습니다. 또한 Durable Functions 런타임의 클라이언트 역할을 하는 출력 바인딩을 소개합니다.
이 문서에서는 이러한 네 가지 바인딩의 사용에 대해 설명하고 코드 샘플을 제공합니다. 또한 함수 앱의 모든 함수에 영향을 주는 설정을 포함하는 메타데이터 파일인 host.json지속성 함수 구성 속성에 대한 정보를 제공합니다.
문서의 맨 위에 있는 Durable Functions 개발 언어를 선택해야 합니다.
Azure Functions용 Python 프로그래밍 모델의 두 버전은 모두 Durable Functions에서 지원됩니다. Python v2가 권장 버전이므로 이 문서의 예제에서는 이 버전만 제공합니다.
필수 조건
- Durable Functions SDK는 PyPI(Python 패키지 인덱스) 패키지
azure-functions-durable이며, 버전1.2.2또는 그 이후의 버전입니다. - host.json 프로젝트 파일에 설정된 확장 번들 버전 4.x(이상 버전)
Python용 Durable Functions SDK 리포지토리에서 피드백과 제안을 제공할 수 있습니다.
오케스트레이션 트리거
오케스트레이션 트리거를 사용하여 지속성 오케스트레이터 함수를 개발할 수 있습니다. 이 트리거는 새 오케스트레이션 인스턴스가 예약되고 기존 오케스트레이션 인스턴스가 이벤트를 수신할 때 실행됩니다. 오케스트레이터 함수를 트리거할 수 있는 이벤트의 예로는 지속성 타이머 만료, 활동 함수 응답 및 외부 클라이언트에서 발생한 이벤트가 있습니다.
.NET에서 함수를 개발할 때 OrchestrationTriggerAttribute .NET 특성을 사용하여 오케스트레이션 트리거를 구성합니다.
Java의 경우 주석을 @DurableOrchestrationTrigger 사용하여 오케스트레이션 트리거를 구성합니다.
Node.js 프로그래밍 모델의 버전 4를 사용하여 함수를 개발하는 경우 모듈에서 개체를 app@azure/functions npm 가져옵니다. 그런 다음 함수 코드에서 Durable Functions API의 메서드를 직접 호출 app.orchestration 합니다. 이 메서드는 Durable Functions 프레임워크에 오케스트레이터 함수를 등록합니다.
오케스트레이터 함수를 작성할 때 bindings 파일 배열에서 다음 JSON 개체를 사용하여 오케스트레이션 트리거를 정의합니다.
{
"name": "<name-of-input-parameter-in-function-signature>",
"orchestration": "<optional-name-of-orchestration>",
"type": "orchestrationTrigger",
"direction": "in"
}
값은 orchestration 클라이언트가 오케스트레이터 함수의 새 인스턴스를 시작하려는 경우 사용해야 하는 오케스트레이션의 이름입니다. 이 속성은 선택 사항입니다. 지정하지 않으면 함수 이름이 사용됩니다.
Python v2 프로그래밍 모델을 사용하는 경우 Python 함수 코드에서 직접 데코레이터를 orchestration_trigger 사용하여 오케스트레이션 트리거를 정의할 수 있습니다.
v2 모델에서는 DFApp 인스턴스를 통해 Durable Functions의 트리거 및 바인딩에 액세스합니다. 이 하위 클래스를 FunctionApp 사용하여 Durable Functions와 관련된 데코레이터를 내보낼 수 있습니다.
내부적으로 이 트리거 바인딩은 구성된 내구성 있는 저장소에서 새 오케스트레이션 이벤트를 폴링합니다. 이벤트의 예로는 오케스트레이션 시작 이벤트, 지속성 타이머 만료 이벤트, 활동 함수 응답 이벤트 및 다른 함수에서 발생하는 외부 이벤트가 있습니다.
트리거 동작
오케스트레이션 트리거에 대한 몇 가지 참고 사항은 다음과 같습니다.
- 단일 스레딩: 단일 디스패처 스레드는 단일 호스트 인스턴스의 모든 오케스트레이터 함수 실행에 사용됩니다. 이러한 이유로 오케스트레이터 함수 코드가 효율적이며 I/O 작업을 수행하지 않도록 하는 것이 중요합니다. 지속성 함수와 관련된 작업 유형을 기다리는 경우를 제외하고 이 스레드가 비동기 작업을 수행하지 않도록 하는 것도 중요합니다.
- 포이즌 메시지 처리: 오케스트레이션 트리거에는 포이즌 메시지가 지원되지 않습니다.
- 메시지 표시 여부: 오케스트레이션 트리거 메시지는 큐에서 제거되고 구성 가능한 기간 동안 보이지 않게 유지됩니다. 함수 앱이 실행되고 정상적으로 작동하는 동안 이러한 메시지의 가시성이 자동으로 갱신됩니다.
- 반환 값: 반환 값은 JSON으로 직렬화되고 Azure Table Storage의 오케스트레이션 기록 테이블에 유지됩니다. 이러한 반환 값은 나중에 설명하는 오케스트레이션 클라이언트 바인딩을 통해 쿼리할 수 있습니다.
경고
오케스트레이터 함수는 오케스트레이션 트리거 바인딩 이외의 입력 또는 출력 바인딩을 사용하면 안 됩니다. 다른 바인딩을 사용하면 해당 바인딩이 단일 스레딩 및 I/O 규칙을 준수하지 않을 수 있으므로 지속성 작업 확장에 문제가 발생할 수 있습니다. 다른 바인딩을 사용하려면 오케스트레이터 함수에서 호출된 작업 함수에 추가합니다. 오케스트레이터 함수의 코딩 제약 조건에 대한 자세한 내용은 Orchestrator 함수 코드 제약 조건을 참조하세요.
경고
오케스트레이터 함수는 선언해서는 안 됩니다 async.
트리거 사용
오케스트레이션 트리거 바인딩은 입력 및 출력을 모두 지원합니다. 다음은 입력 및 출력 처리에 대한 몇 가지 참고 사항입니다.
- 입력: 입력이 있는 오케스트레이션 트리거를 호출할 수 있습니다. 입력은 컨텍스트 입력 개체를 통해 액세스됩니다. 모든 입력은 JSON 직렬화 가능해야 합니다.
- 출력: 오케스트레이션 트리거는 출력 및 입력 값을 모두 지원합니다. 함수의 반환 값은 출력 값을 할당하는 데 사용됩니다. 반환 값은 JSON 직렬화 가능해야 합니다.
트리거 샘플
다음 코드는 기본 Hello World 오케스트레이터 함수의 예를 제공합니다. 이 예제 오케스트레이터는 작업을 예약하지 않습니다.
트리거를 정의하는 데 사용하는 특성은 Functions 호스트 프로세스와 동일한 프로세스에서 또는 격리된 작업자 프로세스에서 C# 함수를 실행할지 여부에 따라 달라집니다.
[FunctionName("HelloWorld")]
public static string RunOrchestrator([OrchestrationTrigger] IDurableOrchestrationContext context)
{
string name = context.GetInput<string>();
return $"Hello {name}!";
}
비고
앞의 코드는 Durable Functions 2.x용입니다. Durable Functions 1.x의 경우, DurableOrchestrationContext 대신 IDurableOrchestrationContext를 사용해야 합니다. 버전 간의 차이점에 대한 자세한 내용은 Durable Functions 버전 개요를 참조하세요.
const { app } = require('@azure/functions');
const df = require('durable-functions');
df.app.orchestration('helloOrchestrator', function* (context) {
const name = context.df.getInput();
return `Hello ${name}`;
});
비고
이 라이브러리는 durable-functions 생성기 함수가 종료되면 동기 context.done 메서드를 호출합니다.
import azure.functions as func
import azure.durable_functions as df
myApp = df.DFApp(http_auth_level=func.AuthLevel.ANONYMOUS)
@myApp.orchestration_trigger(context_name="context")
def my_orchestrator(context):
result = yield context.call_activity("Hello", "Tokyo")
return result
param($Context)
$InputData = $Context.Input
$InputData
@FunctionName("HelloWorldOrchestration")
public String helloWorldOrchestration(
@DurableOrchestrationTrigger(name = "ctx") TaskOrchestrationContext ctx) {
return String.format("Hello %s!", ctx.getInput(String.class));
}
대부분의 오케스트레이터 함수는 작업 함수를 호출합니다. 다음 코드는 활동 함수를 호출하는 방법을 보여 주는 Hello World 예제를 제공합니다.
[FunctionName("HelloWorld")]
public static async Task<string> RunOrchestrator(
[OrchestrationTrigger] IDurableOrchestrationContext context)
{
string name = context.GetInput<string>();
string result = await context.CallActivityAsync<string>("SayHello", name);
return result;
}
비고
앞의 코드는 Durable Functions 2.x용입니다. Durable Functions 1.x의 경우, DurableOrchestrationContext 대신 IDurableOrchestrationContext를 사용해야 합니다. 버전 간의 차이점에 대한 자세한 내용은 Durable Functions 버전 개요를 참조하세요.
const { app } = require('@azure/functions');
const df = require('durable-functions');
const activityName = 'hello';
df.app.orchestration('helloOrchestrator', function* (context) {
const name = context.df.getInput();
const result = yield context.df.callActivity(activityName, name);
return result;
});
@FunctionName("HelloWorld")
public String helloWorldOrchestration(
@DurableOrchestrationTrigger(name = "ctx") TaskOrchestrationContext ctx) {
String input = ctx.getInput(String.class);
String result = ctx.callActivity("SayHello", input, String.class).await();
return result;
}
활동 트리거
작업 트리거를 사용하여 오케스트레이터 함수에 의해 호출되는 활동 함수 라고 하는 함수를 개발할 수 있습니다.
ActivityTriggerAttribute .NET 특성을 사용하여 활동 트리거를 구성합니다.
@DurableActivityTrigger 주석을 사용하여 활동 트리거를 구성합니다.
활동 함수를 등록하려면 app 모듈에서 @azure/functions npm 개체를 가져옵니다. 그런 다음 함수 코드에서 Durable Functions API의 메서드를 직접 호출 app.activity 합니다.
활동 트리거를 정의하려면 bindings배열에서 다음 JSON 개체를 사용합니다.
{
"name": "<name-of-input-parameter-in-function-signature>",
"activity": "<optional-name-of-activity>",
"type": "activityTrigger",
"direction": "in"
}
값은 activity 활동의 이름입니다. 이 값은 오케스트레이터 함수가 이 작업 함수를 호출하는 데 사용하는 이름입니다. 이 속성은 선택 사항입니다. 지정하지 않으면 함수 이름이 사용됩니다.
Python 함수 코드에서 직접 데코레이터를 activity_trigger 사용하여 활동 트리거를 정의할 수 있습니다.
내부적으로 이 트리거 바인딩은 구성된 영구 저장소를 주기적으로 확인하여 새 활동 실행 이벤트를 탐색합니다.
트리거 동작
다음은 활동 트리거에 대한 몇 가지 참고 사항입니다.
- 스레딩: 오케스트레이션 트리거와 달리 작업 트리거에는 스레딩 또는 I/O 작업에 대한 제한이 없습니다. 일반 함수처럼 처리할 수 있습니다.
- 포이즌 메시지 처리: 활동 트리거에서 포이즌 메시지에 대한 지원은 없습니다.
- 메시지 표시 여부: 활동 트리거 메시지는 큐에서 제거되고 구성 가능한 기간 동안 보이지 않게 유지됩니다. 함수 앱이 실행되고 정상적으로 작동하는 동안 이러한 메시지의 가시성이 자동으로 갱신됩니다.
- 반환 값: 반환 값은 JSON으로 직렬화되고 구성된 지속성 저장소에 유지됩니다.
트리거 사용
작업 트리거 바인딩은 오케스트레이션 트리거와 마찬가지로 입력 및 출력을 모두 지원합니다. 다음은 입력 및 출력 처리에 대한 몇 가지 참고 사항입니다.
- 입력: 오케스트레이터 함수의 입력으로 활동 트리거를 호출할 수 있습니다. 모든 입력은 JSON 직렬화 가능해야 합니다.
- 출력: 활동 함수는 출력 및 입력 값을 모두 지원합니다. 함수의 반환 값은 출력 값을 할당하는 데 사용되며 JSON 직렬화 가능해야 합니다.
-
메타데이터: .NET 활동 함수는 매개 변수에 바인딩하여
string instanceId호출 오케스트레이션의 인스턴스 ID를 가져올 수 있습니다.
트리거 샘플
다음 코드는 기본 Hello World 활동 함수의 예를 제공합니다.
[FunctionName("SayHello")]
public static string SayHello([ActivityTrigger] IDurableActivityContext helloContext)
{
string name = helloContext.GetInput<string>();
return $"Hello {name}!";
}
.NET ActivityTriggerAttribute 바인딩의 기본 매개 변수 형식은 IDurableActivityContext (또는 Durable Functions 1.x의 경우 DurableActivityContext )입니다. 그러나 .NET 작업 트리거는 JSON 직렬화 가능 형식(기본 형식 포함)에 직접 바인딩을 지원하므로 다음과 같은 간단한 버전의 함수를 사용할 수도 있습니다.
[FunctionName("SayHello")]
public static string SayHello([ActivityTrigger] string name)
{
return $"Hello {name}!";
}
const { app } = require('@azure/functions');
const df = require('durable-functions');
const activityName = 'hello';
df.app.activity(activityName, {
handler: (input) => {
return `Hello, ${input}`;
},
});
import azure.functions as func
import azure.durable_functions as df
myApp = df.DFApp(http_auth_level=func.AuthLevel.ANONYMOUS)
@myApp.activity_trigger(input_name="myInput")
def my_activity(myInput: str):
return "Hello " + myInput
param($name)
"Hello $name!"
@FunctionName("SayHello")
public String sayHello(@DurableActivityTrigger(name = "name") String name) {
return String.format("Hello %s!", name);
}
입력 및 출력 바인딩 사용
활동 트리거 바인딩 외에도 일반 입력 및 출력 바인딩을 사용할 수도 있습니다.
예를 들어 작업 함수는 오케스트레이터 함수에서 입력을 받을 수 있습니다. 그런 다음 활동 함수는 해당 입력을 Azure Event Hubs에 메시지로 보낼 수 있습니다.
const { app } = require('@azure/functions');
const df = require('durable-functions');
df.app.orchestration('helloOrchestrator', function* (context) {
const input = context.df.getInput();
yield context.df.callActivity('sendToEventHub', input);
return `Message sent: ${input}`;
});
const { EventHubProducerClient } = require("@azure/event-hubs");
const connectionString = process.env.EVENT_HUB_CONNECTION_STRING;
const eventHubName = process.env.EVENT_HUB_NAME;
df.app.activity("sendToEventHub", {
handler: async (message, context) => {
const producer = new EventHubProducerClient(connectionString, eventHubName);
try {
const batch = await producer.createBatch();
batch.tryAdd({ body: message });
await producer.sendBatch(batch);
context.log(`Message sent to Event Hubs: ${message}`);
} catch (err) {
context.log.error("Failed to send message to Event Hubs:", err);
throw err;
} finally {
await producer.close();
}
},
});
app.storageQueue('helloQueueStart', {
queueName: 'start-orchestration',
extraInputs: [df.input.durableClient()],
handler: async (message, context) => {
const client = df.getClient(context);
const orchestratorName = message.orchestratorName || 'helloOrchestrator';
const input = message.input || null;
const instanceId = await client.startNew(orchestratorName, { input });
context.log(`Started orchestration with ID = '${instanceId}'`);
},
});
오케스트레이션 클라이언트
오케스트레이션 클라이언트 바인딩을 사용하여 오케스트레이터 함수와 상호 작용하는 함수를 작성할 수 있습니다. 이러한 함수를 클라이언트 함수라고도 합니다. 예를 들어 다음과 같은 방법으로 오케스트레이션 인스턴스에 대해 작업할 수 있습니다.
- 인스턴스를 시작합니다.
- 상태를 조회합니다.
- 그들을 종료하라.
- 실행하는 동안 이벤트를 보냅니다.
- 인스턴스 기록을 제거합니다.
DurableClientAttribute 특성을 사용하여 오케스트레이션 클라이언트에 바인딩할 수 있습니다 (Durable Functions 1.x의 OrchestrationClientAttribute).
@DurableClientInput 주석을 사용하여 오케스트레이션 클라이언트에 바인딩할 수 있습니다.
클라이언트 함수를 등록하려면 app 모듈에서 @azure/functions npm 객체를 가져옵니다. 그런 다음 트리거 유형과 관련된 Durable Functions API 메서드를 호출합니다. 예를 들어 HTTP 트리거의 경우 메서드를 호출합니다 app.http . 큐 트리거의 경우 메서드를 호출합니다 app.storageQueue .
지속성 클라이언트 트리거를 정의하려면 bindings배열에서 다음 JSON 개체를 사용합니다.
{
"name": "<name-of-input-parameter-in-function-signature>",
"taskHub": "<optional-name-of-task-hub>",
"connectionName": "<optional-name-of-connection-string-app-setting>",
"type": "orchestrationClient",
"direction": "in"
}
- 이
taskHub속성은 여러 함수 앱이 동일한 스토리지 계정을 공유하지만 서로 격리해야 하는 경우에 사용됩니다. 이 속성을 지정하지 않으면 host.json 기본값이 사용됩니다. 이 값은 대상 오케스트레이터 함수가 사용하는 값과 일치해야 합니다. - 값은
connectionName스토리지 계정 연결 문자열을 포함하는 앱 설정의 이름입니다. 이 연결 문자열로 표시되는 스토리지 계정은 대상 오케스트레이터 함수가 사용하는 것과 동일해야 합니다. 이 속성을 지정하지 않으면 함수 앱의 기본 스토리지 계정 연결 문자열이 사용됩니다.
비고
대부분의 경우 이러한 속성을 생략하고 기본 동작을 사용하는 것이 좋습니다.
Python 함수 코드에서 직접 데코레이터를 durable_client_input 사용하여 지속성 클라이언트 트리거를 정의할 수 있습니다.
클라이언트 사용량
일반적으로 IDurableClient의 구현에 바인딩하며, 이는 Durable Functions 1.x에서는 DurableOrchestrationClient로 불립니다. 이를 통해 지속성 함수가 지원하는 모든 오케스트레이션 클라이언트 API에 완전한 액세스 권한을 제공합니다.
일반적으로 DurableClientContext 클래스에 바인딩합니다.
클라이언트 개체에 액세스하려면 언어별 SDK를 사용해야 합니다.
다음 코드는 Hello World 오케스트레이션을 시작하는 큐 트리거 함수의 예를 제공합니다.
[FunctionName("QueueStart")]
public static Task Run(
[QueueTrigger("durable-function-trigger")] string input,
[DurableClient] IDurableOrchestrationClient starter)
{
// Orchestration input comes from the queue message content.
return starter.StartNewAsync<string>("HelloWorld", input);
}
비고
위의 C# 코드는 Durable Functions 2.x용입니다. Durable Functions 1.x에서는 OrchestrationClient 특성 대신 DurableClient 특성을 사용해야 하며, 매개 변수 형식은 DurableOrchestrationClient 대신 IDurableOrchestrationClient를 사용해야 합니다. 버전 간의 차이점에 대한 자세한 내용은 Durable Functions 버전 개요를 참조하세요.
const { app } = require('@azure/functions');
const df = require('durable-functions');
app.storageQueue('helloQueueStart', {
queueName: 'start-orchestration',
extraInputs: [df.input.durableClient()],
handler: async (message, context) => {
const client = df.getClient(context);
const orchestratorName = message.orchestratorName || 'helloOrchestrator';
const input = message.input || null;
const instanceId = await client.startNew(orchestratorName, { input });
context.log(`Started orchestration with ID = '${instanceId}' from queue message.`);
},
});
import azure.functions as func
import azure.durable_functions as df
myApp = df.DFApp(http_auth_level=func.AuthLevel.ANONYMOUS)
@myApp.queue_trigger(
arg_name="msg",
queue_name="start-orchestration",
connection="AzureWebJobsStorage"
)
@myApp.durable_client_input(client_name="client")
async def client_function(msg: func.QueueMessage, client: df.DurableOrchestrationClient):
input_data = msg.get_body().decode("utf-8")
await client.start_new("my_orchestrator", None, input_data)
return None
function.json
{
"bindings": [
{
"name": "InputData",
"type": "queueTrigger",
"queueName": "durable-function-trigger",
"direction": "in"
},
{
"name": "starter",
"type": "durableClient",
"direction": "in"
}
]
}
run.ps1
param([string]$InputData, $TriggerMetadata)
$InstanceId = Start-DurableOrchestration -FunctionName 'HelloWorld' -Input $InputData
@FunctionName("QueueStart")
public void queueStart(
@QueueTrigger(name = "input", queueName = "durable-function-trigger", connection = "Storage") String input,
@DurableClientInput(name = "durableContext") DurableClientContext durableContext) {
// Orchestration input comes from the queue message content.
durableContext.getClient().scheduleNewOrchestrationInstance("HelloWorld", input);
}
인스턴스 시작에 대한 자세한 내용은 Azure의 Durable Functions에서 인스턴스 관리를 참조하세요.
엔터티 트리거
엔터티 트리거를 사용하여 엔터티 함수를 개발할 수 있습니다. 이 트리거는 특정 엔터티 인스턴스에 대한 이벤트 처리를 지원합니다.
비고
엔터티 트리거는 Durable Functions 2.x부터 사용할 수 있습니다.
내부적으로 이 트리거 바인딩은 실행해야 할 새 엔터티 작업에 대해 구성된 지속성 저장소를 폴링합니다.
EntityTriggerAttribute .NET 특성을 사용하여 엔터티 트리거를 구성합니다.
엔터티 트리거를 등록하려면 app 모듈에서 @azure/functions npm 개체를 가져옵니다. 그런 다음 함수 코드에서 Durable Functions API의 메서드를 직접 호출 app.entity 합니다.
const df = require('durable-functions');
df.app.entity('counter', (context) => {
const currentValue = context.df.getState(() => 0);
switch (context.df.operationName) {
case 'add':
context.df.setState(currentValue + context.df.getInput());
break;
case 'reset':
context.df.setState(0);
break;
case 'get':
context.df.return(currentValue);
break;
}
});
비고
엔터티 트리거는 Java에 대해 아직 지원되지 않습니다.
비고
엔터티 트리거는 PowerShell에서 아직 지원되지 않습니다.
Python 함수 코드에서 직접 데코레이터를 entity_trigger 사용하여 엔터티 트리거를 정의할 수 있습니다.
트리거 동작
다음은 엔터티 트리거에 대한 몇 가지 참고 사항입니다.
- 단일 스레딩: 단일 디스패처 스레드는 특정 엔터티에 대한 작업을 처리하는 데 사용됩니다. 여러 메시지가 동시에 단일 엔터티로 전송되는 경우 작업은 한 번에 하나씩 처리됩니다.
- 포이즌 메시지 처리: 엔터티 트리거에서 포이즌 메시지를 지원하지 않습니다.
- 메시지 표시 유형: 엔터티 트리거 메시지는 큐에서 제거되고 구성 가능한 기간 동안 보이지 않게 유지됩니다. 함수 앱이 실행되고 정상적으로 작동하는 동안 이러한 메시지의 가시성이 자동으로 갱신됩니다.
- 반환 값: 엔터티 함수는 반환 값을 지원하지 않습니다. 상태를 저장하거나 오케스트레이션에 값을 다시 전달하는 데 사용할 수 있는 특정 API가 있습니다.
실행 중에 엔터티에 대한 모든 상태 변경 내용은 실행이 완료된 후에 자동으로 유지됩니다.
엔터티 트리거를 정의하고 상호 작용하는 방법에 대한 자세한 내용과 예제는 Entity 함수를 참조하세요.
엔터티 클라이언트
엔터티 클라이언트 바인딩을 사용하여 엔터티 함수를 비동기적으로 트리거할 수 있습니다. 이러한 함수를 클라이언트 함수라고도 합니다.
.NET 클래스 라이브러리 함수에서 DurableClientAttribute .NET 특성을 사용하여 엔터티 클라이언트에 바인딩할 수 있습니다.
엔터티 클라이언트를 등록하는 대신 등록된 함수에서 엔터티 트리거 메서드를 signalEntity 또는 callEntity으로 호출합니다.
큐 트리거 함수에서 다음을 사용할
client.signalEntity수 있습니다.const { app } = require('@azure/functions'); const df = require('durable-functions'); app.storageQueue('helloQueueStart', { queueName: 'start-orchestration', extraInputs: [df.input.durableClient()], handler: async (message, context) => { const client = df.getClient(context); const entityId = new df.EntityId('counter', 'myCounter'); await client.signalEntity(entityId, 'add', 5); }, });오케스트레이터 함수에서 다음을 사용할
context.df.callEntity수 있습니다.const { app } = require('@azure/functions'); const df = require('durable-functions'); df.app.orchestration('entityCaller', function* (context) { const entityId = new df.EntityId('counter', 'myCounter'); yield context.df.callEntity(entityId, 'add', 5); yield context.df.callEntity(entityId, 'add', 5); const result = yield context.df.callEntity(entityId, 'get'); return result; });
Python 함수 코드에서 직접 데코레이터를 durable_client_input 사용하여 엔터티 클라이언트를 정의할 수 있습니다.
비고
엔터티 클라이언트는 Java에 대해 아직 지원되지 않습니다.
비고
엔터티 클라이언트는 PowerShell에 대해 아직 지원되지 않습니다.
엔터티와 클라이언트로서 상호 작용하는 방법에 대한 자세한 내용 및 예제는 Access 엔터티를 참조하세요.
host.json의 Durable Functions 설정
이 섹션에서는 host.jsonDurable Functions 구성 속성에 대한 정보를 제공합니다. host.json일반 설정에 대한 자세한 내용은 Azure Functions 1.x에 대한host.json 참조 또는 Azure Functions 2.x 이상에 대한host.json 참조를 참조하세요.
지속성 함수에 대한 구성 설정입니다.
비고
모든 주 버전의 Durable Functions는 모든 버전의 Azure Functions 런타임에서 지원됩니다. 그러나 host.json 구성의 스키마는 Azure Functions 런타임 버전 및 사용하는 Durable Functions 확장 버전에 따라 약간 다릅니다.
다음 코드는 durableTask설정의 두 가지 예를 제공합니다. 하나는 Durable Functions 2.x용이고 다른 하나는 Durable Functions 1.x용입니다. Azure Functions 2.0 및 3.0에서 두 예제를 모두 사용할 수 있습니다. Azure Functions 1.0에서는 사용 가능한 설정이 동일하지만 durableTaskhost.json 섹션은 아래 필드가 아닌 extensions 구성의 루트에 있습니다.
{
"extensions": {
"durableTask": {
"hubName": "MyTaskHub",
"defaultVersion": "1.0",
"versionMatchStrategy": "CurrentOrOlder",
"versionFailureStrategy": "Reject",
"storageProvider": {
"connectionStringName": "AzureWebJobsStorage",
"controlQueueBatchSize": 32,
"controlQueueBufferThreshold": 256,
"controlQueueVisibilityTimeout": "00:05:00",
"FetchLargeMessagesAutomatically": true,
"maxQueuePollingInterval": "00:00:30",
"partitionCount": 4,
"trackingStoreConnectionStringName": "TrackingStorage",
"trackingStoreNamePrefix": "DurableTask",
"useLegacyPartitionManagement": false,
"useTablePartitionManagement": true,
"workItemQueueVisibilityTimeout": "00:05:00",
"QueueClientMessageEncoding": "UTF8"
},
"tracing": {
"traceInputsAndOutputs": false,
"traceReplayEvents": false,
},
"httpSettings":{
"defaultAsyncRequestSleepTimeMilliseconds": 30000,
"useForwardedHost": false,
},
"notifications": {
"eventGrid": {
"topicEndpoint": "https://topic_name.westus2-1.eventgrid.azure.net/api/events",
"keySettingName": "EventGridKey",
"publishRetryCount": 3,
"publishRetryInterval": "00:00:30",
"publishEventTypes": [
"Started",
"Completed",
"Failed",
"Terminated"
]
}
},
"maxConcurrentActivityFunctions": 10,
"maxConcurrentOrchestratorFunctions": 10,
"maxConcurrentEntityFunctions": 10,
"extendedSessionsEnabled": false,
"extendedSessionIdleTimeoutInSeconds": 30,
"useAppLease": true,
"useGracefulShutdown": false,
"maxEntityOperationBatchSize": 50,
"maxOrchestrationActions": 100000,
"storeInputsInOrchestrationHistory": false
}
}
}
| 재산 | 기본값 | 설명 |
|---|---|---|
| 허브이름 | TestHubName(v1.x의 DurableFunctionsHub) | 함수 앱의 현재 상태를 저장하는 허브의 이름입니다. 작업 허브 이름은 문자로 시작하고 문자와 숫자로만 구성되어야 합니다. 이름을 지정하지 않으면 기본값이 사용됩니다. 대체 작업 허브 이름은 동일한 스토리지 백 엔드를 사용하는 경우에도 여러 Durable Functions 애플리케이션을 서로 격리하는 데 사용할 수 있습니다. 자세한 내용은 작업 허브를 참조하세요. |
| defaultVersion | 새 오케스트레이션 인스턴스에 할당할 기본 버전입니다. 버전을 지정하면 새 오케스트레이션 인스턴스가 이 버전 값과 영구적으로 연결됩니다. 이 설정은 오케스트레이션 버전 관리 기능에서 호환성이 손상되는 변경이 포함된 무중단 배포와 같은 시나리오를 사용하도록 설정하는 데 사용됩니다. 버전에는 어떤 문자열 값이든 사용할 수 있습니다. | |
| 버전 일치 전략 | 현재값_또는_이전값 | 오케스트레이터 함수가 로드될 때 오케스트레이션 버전이 일치하는 방식을 지정하는 값입니다. 유효한 값은 None, Strict및 CurrentOrOlder. 자세한 설명은 오케스트레이션 버전 관리(Orchestration Versioning)를 참조하세요. |
| 버전 실패 전략 | 거절하다 | 오케스트레이션 버전이 현재 defaultVersion 값과 일치하지 않을 때 발생하는 동작을 지정하는 값입니다. 유효한 값은 Reject 및 Fail입니다. 자세한 설명은 오케스트레이션 버전 관리(Orchestration Versioning)를 참조하세요. |
| controlQueueBatchSize | 32 | 한 번에 제어 큐에서 끌어올 메시지 수입니다. |
| controlQueueBufferThreshold |
Python에 대한 사용 계획: 32 다른 언어에 대한 소비 계획: 128 전용 또는 프리미엄 플랜: 256 |
한 번에 메모리에 버퍼링할 수 있는 제어 큐 메시지 수입니다. 지정된 숫자에 도달하면 디스패처는 다른 메시지를 큐에서 제거하기 전에 대기합니다. 경우에 따라 이 값을 줄이면 메모리 사용량이 크게 감소할 수 있습니다. |
| 파티션 수 | 4 | 제어 큐의 파티션 수입니다. 이 값은 1에서 16 사이의 양수여야 합니다. 이 값을 변경하려면 새 작업 허브를 구성해야 합니다. |
| controlQueueVisibilityTimeout | 00:05:00 | 큐에서 제거된 제어 큐 메시지의 가시성 제한 시간( hh:mm:ss 형식)입니다. |
| workItemQueueVisibilityTimeout | 00:05:00 | 큐에서 제거된 작업 항목 큐 메시지의 표시 시간 제한( hh:mm:ss 형식)입니다. |
| 큰 메시지를 자동으로 가져오기 | 맞다 | 오케스트레이션 상태 쿼리에서 큰 메시지를 검색할지 여부를 지정하는 값입니다. 이 설정이면 true큐 크기 제한을 초과하는 큰 메시지가 검색됩니다.
false로 설정된 경우, 각 큰 메시지를 가리키는 blob URL이 검색됩니다. |
| 최대 동시 활동 함수 |
소비 계획: 10 전용 또는 프리미엄 요금제: 현재 컴퓨터의 프로세서 수의 10배 |
단일 호스트 인스턴스에서 동시에 처리할 수 있는 최대 활동 함수 수입니다. |
| maxConcurrentOrchestratorFunctions |
소비 계획: 5 전용 또는 프리미엄 요금제: 현재 컴퓨터의 프로세서 수의 10배 |
단일 호스트 인스턴스에서 동시에 처리할 수 있는 오케스트레이터 함수의 최대 수입니다. |
| maxConcurrentEntityFunctions |
소비 계획: 5 전용 또는 프리미엄 요금제: 현재 컴퓨터의 프로세서 수의 10배 |
단일 호스트 인스턴스에서 동시에 처리할 수 있는 엔터티 함수의 최대 수입니다. 이 설정은 지속성 작업 스케줄러를 사용하는 경우에만 적용됩니다. 그렇지 않으면 최대 동시 엔터티 실행 수가 값으로 maxConcurrentOrchestratorFunctions 제한됩니다. |
| maxQueuePollingInterval | 00:00:30 | 최대 제어 및 작업 항목 큐 폴링 간격은 (hh:mm:ss) 형식입니다. 값이 높을수록 메시지 처리 대기 시간이 높아질 수 있습니다. 값이 낮을수록 스토리지 트랜잭션 증가로 인해 스토리지 비용이 높아질 수 있습니다. |
| maxOrchestrationActions | 100,000 | 오케스트레이터 함수가 단일 실행 주기 동안 수행할 수 있는 최대 작업 수입니다. |
| connectionName(v2.7.0 이상) connectionStringName(v2.x) azureStorageConnectionStringName(v1.x) |
AzureWebJobsStorage | 기본 Azure Storage 리소스에 연결하는 방법을 지정하는 앱 설정 또는 설정 컬렉션의 이름입니다. 단일 앱 설정을 제공하는 경우 Azure Storage 연결 문자열이어야 합니다. |
| trackingStoreConnectionName(v2.7.0 이상) trackingStoreConnectionStringName |
오케스트레이션 인스턴스에 대한 실행 기록 및 메타데이터를 저장하는 기록 및 인스턴스 테이블에 연결하는 방법을 지정하는 앱 설정 또는 설정 컬렉션의 이름입니다. 단일 앱 설정을 제공하는 경우 Azure Storage 연결 문자열이어야 합니다. 설정을 지정하지 않으면 connectionStringName 값(v2.x) 또는 azureStorageConnectionStringName 값(v1.x) 연결이 사용됩니다. |
|
| trackingStoreNamePrefix | 지정된 경우 trackingStoreConnectionStringName 기록 및 인스턴스 테이블에 사용할 접두사입니다. 접두사를 지정하지 않으면 기본값 DurableTask 이 사용됩니다.
trackingStoreConnectionStringName가 지정되지 않은 경우, 기록 및 인스턴스 테이블은 hubName 값을 접두사로 사용하고, trackingStoreNamePrefix 설정은 무시됩니다. |
|
| 입력과 출력 추적 | 거짓 | 함수 호출의 입력 및 출력을 추적할지 여부를 나타내는 값입니다. 함수 실행 이벤트를 추적할 때 기본 동작은 함수 호출에 대한 직렬화된 입력 및 출력에 바이트 수를 포함하는 것입니다. 이 동작은 로그가 부풀어 오르거나 실수로 중요한 정보를 노출하지 않도록 입력 및 출력에 대한 최소한의 정보를 제공합니다. 이 속성이 있으면 true함수 입력 및 출력의 전체 내용이 기록됩니다. |
| traceReplayEvents | 거짓 | Application Insights에 오케스트레이션 재생 이벤트를 쓸지 여부를 나타내는 값입니다. |
| logReplayEvents | 거짓 | 애플리케이션 로그에서 재생된 실행을 기록할지 여부를 나타내는 값입니다. |
| eventGridTopicEndpoint | Azure Event Grid 사용자 지정 토픽 엔드포인트의 URL입니다. 이 속성을 설정하면 오케스트레이션 수명 주기 알림 이벤트가 이 엔드포인트에 게시됩니다. 이 속성은 앱 설정 해결을 지원합니다. | |
| eventGridKeySettingName | URL에서 Event Grid 사용자 지정 토픽을 사용하여 인증하는 데 사용되는 키가 포함된 앱 설정의 EventGridTopicEndpoint 이름입니다. |
|
| eventGridPublishRetryCount | 0 | Event Grid 토픽에 게시하지 못한 경우 다시 시도할 횟수입니다. |
| eventGridPublishRetryInterval | 00:05:00 | Event Grid 게시 다시 시도 간격은 hh:mm:ss 형식입니다. |
| eventGridPublishEventTypes | Event Grid에 게시할 이벤트 유형 목록입니다. 형식을 지정하지 않으면 모든 이벤트 형식이 게시됩니다. 허용되는 값에는 Started, Completed및 FailedTerminated. |
|
| 확장된 세션 활성화됨 | 거짓 | 세션 오케스트레이터 및 엔터티 함수 세션이 캐시되는지 여부를 지정하는 값입니다. |
| 세션 연장 유휴 시간 초 단위 | 30 | 유휴 오케스트레이터 또는 엔터티 함수가 언로드되기 전에 메모리에 남아 있는 시간(초)입니다. 이 설정은 설정extendedSessionsEnabled이 .인 true 경우에만 사용됩니다. |
| 유즈앱리스 | 맞다 | 앱이 작업 허브 메시지를 처리하기 전에 앱 수준 Blob 임대를 획득해야 하는지 여부를 나타내는 값입니다. 자세한 내용은 지속성 함수의 재해 복구 및 지역 배포를 참조하세요. 이 설정은 v2.3.0부터 사용할 수 있습니다. |
| 레거시 파티션 관리 사용 (useLegacyPartitionManagement) | 거짓 | 사용할 파티션 관리 알고리즘의 형식을 지정하는 값입니다. 이 설정이면 false스케일 아웃 시 중복 함수 실행 가능성을 줄이는 알고리즘이 사용됩니다. 이 설정은 v2.3.0부터 사용할 수 있습니다.
이 값을 true 설정하지 않는 것이 좋습니다. |
| 테이블 분할 관리 사용 | v3.x: true v2.x에서: false |
사용할 파티션 관리 알고리즘의 형식을 지정하는 값입니다. 이 설정인 경우 trueAzure Storage v2 계정에 대한 비용을 줄이기 위해 설계된 알고리즘이 사용됩니다. 이 설정은 WebJobs.Extensions.DurableTask v2.10.0부터 사용할 수 있습니다. 관리 ID와 함께 이 설정을 사용하려면 WebJobs.Extensions.DurableTask v3.x 이상 또는 Worker.Extensions.DurableTask v1.2.x 이상이 필요합니다. |
| 그레이스풀 셧다운 사용하기 | 거짓 | (미리 보기) 호스트 종료로 인해 In-Process 함수 실행이 실패할 가능성을 줄이기 위해 정상적으로 종료할지 여부를 나타내는 값입니다. |
| maxEntityOperationBatchSize |
소비 계획: 50 전용 또는 프리미엄 플랜: 5,000 |
일괄 처리로 처리되는 엔터티 작업의 최대 수입니다. 이 값이 1이면 일괄 처리가 비활성화되고 별도의 함수 호출이 각 작업 메시지를 처리합니다. 이 설정은 v2.6.1부터 사용할 수 있습니다. |
| 오케스트레이션 기록에 입력 저장 | 거짓 | 입력을 저장하는 방법을 지정하는 값입니다. 이 설정인 경우 지속성 작업 프레임워크는 true작업 입력을 기록 테이블에 저장하고 작업 함수 입력은 오케스트레이션 기록 쿼리 결과에 표시됩니다. |
| 최대Grpc메시지크기바이트단위 | 4,194,304 | gRPC(일반 원격 프로시저 호출) 클라이언트가 받을 수 있는 메시지의 최대 크기(바이트)를 설정하는 정수 값입니다.
DurableTaskClient 구현은 gRPC 클라이언트를 사용하여 오케스트레이션 인스턴스를 관리합니다. 이 설정은 Durable Functions .NET 격리 작업자 및 Java 앱에 적용됩니다. |
| grpcHttpClientTimeout | 00:01:40 | 지속성 함수의 gRPC 클라이언트에서 사용하는 HTTP 클라이언트에 대한 hh:mm:ss 형식의 시간 제한입니다. 클라이언트는 현재 .NET 격리 작업자 앱(.NET 6 이상 버전) 및 Java 앱에 대해 지원됩니다. |
| QueueClientMessageEncoding | UTF8 | Azure Queue Storage 메시지에 대한 인코딩 전략입니다. 유효한 전략은 유니코드 변환 형식–8비트(UTF8) 및 Base64입니다. 이 설정은 Microsoft.Azure.WebJobs.Extensions.DurableTask 3.4.0 이상 또는 Microsoft.Azure.Functions.Worker.Extensions.DurableTask 1.7.0 이상을 사용하는 경우에 적용됩니다. |
| 기본비동기요청대기시간밀리초 | 30000 | 비동기 HTTP API의 기본 폴링 간격(밀리초)입니다. 클라이언트가 HTTP 상태 쿼리 엔드포인트를 사용하여 장기 실행 오케스트레이션의 상태를 폴링하는 경우 이 값은 다시 폴링하기 전에 클라이언트가 대기해야 하는 시간을 결정합니다. |
| useForwardedHost | 거짓 | true로 설정하면 확장은 X-Forwarded-Host 및 XForwarded-Proto 헤더를 사용하여 HTTP 응답에서 URL을 생성합니다. |
이러한 설정의 대부분은 성능을 최적화하기 위한 것입니다. 자세한 내용은 성능 및 크기 조정을 참조하세요.