지속성 함수의 바인딩(Azure Functions)Bindings for Durable Functions (Azure Functions)

지속성 함수 확장은 오케스트레이터 및 작업 함수의 실행을 제어하는 새로운 두 가지 트리거 바인딩을 도입하고 있습니다.The Durable Functions extension introduces two new trigger bindings that control the execution of orchestrator and activity functions. 또한 지속성 함수 런타임에 대한 클라이언트 역할을 하는 출력 바인딩도 도입하고 있습니다.It also introduces an output binding that acts as a client for the Durable Functions runtime.

오케스트레이션 트리거Orchestration trigger

오케스트레이션 트리거를 사용 하 여 영 속오 케 스트레이 터 함수를 제작할 수 있습니다.The orchestration trigger enables you to author durable orchestrator functions. 이 트리거는 새 오케스트레이터 함수 인스턴스를 시작하고 작업을 "대기 중인" 기존의 오케스트레이터 함수 인스턴스를 다시 시작할 수 있도록 지원합니다.This trigger supports starting new orchestrator function instances and resuming existing orchestrator function instances that are "awaiting" a task.

Azure Functions에 Visual Studio 도구를 사용하는 경우 오케스트레이션 트리거는 OrchestrationTriggerAttribute .NET 특성을 사용하여 구성됩니다.When you use the Visual Studio tools for Azure Functions, the orchestration trigger is configured using the OrchestrationTriggerAttribute .NET attribute.

스크립팅 언어(예: JavaScript 또는 C# 스크립팅)에서 오케스트레이터 함수를 작성하는 경우 오케스트레이션 트리거는 function.json 파일의 bindings 배열에 있는 다음 JSON 개체에서 정의됩니다.When you write orchestrator functions in scripting languages (for example, JavaScript or C# scripting), the orchestration trigger is defined by the following JSON object in the bindings array of the function.json file:

{
    "name": "<Name of input parameter in function signature>",
    "orchestration": "<Optional - name of the orchestration>",
    "type": "orchestrationTrigger",
    "direction": "in"
}
  • orchestration 클라이언트에서이 오 케 스트레이 터 함수의 새 인스턴스를 시작 하려는 경우 사용 해야 하는 오케스트레이션의 이름입니다.orchestration is the name of the orchestration that clients must use when they want to start new instances of this orchestrator function. 이 속성은 선택 사항입니다.This property is optional. 지정하지 않으면 함수의 이름이 사용됩니다.If not specified, the name of the function is used.

내부적으로 이 트리거 바인딩은 함수 앱에 대한 기본 스토리지 계정에 있는 일련의 큐를 폴링합니다.Internally this trigger binding polls a series of queues in the default storage account for the function app. 이러한 큐는 확장에 대한 내부 구현 세부 정보이며, 이는 바인딩 속성에서 명시적으로 구성되지 않은 이유입니다.These queues are internal implementation details of the extension, which is why they are not explicitly configured in the binding properties.

트리거 동작Trigger behavior

다음은 오케스트레이션 트리거에 대한 몇 가지 참고 사항입니다.Here are some notes about the orchestration trigger:

  • 단일 스레드 - 단일 디스패처 스레드는 단일 호스트 인스턴스에서 모든 오케스트레이터 함수를 실행하는 데 사용됩니다.Single-threading - A single dispatcher thread is used for all orchestrator function execution on a single host instance. 이러한 이유로 오케스트레이터 함수 코드가 효율적이고 모든 I/O를 수행하지 않도록 하는 것이 중요합니다.For this reason, it is important to ensure that orchestrator function code is efficient and doesn't perform any I/O. 또한 이 스레드에서 지속성 함수 관련 작업 종류를 기다리는 경우를 제외하고는 비동기 작업을 수행하지 않도록 하는 것이 중요합니다.It is also important to ensure that this thread does not do any async work except when awaiting on Durable Functions-specific task types.
  • 포이즌 메시지 처리 - 오케스트레이션 트리거에는 포이즌 메시지 지원이 없습니다.Poison-message handling - There is no poison message support in orchestration triggers.
  • 메시지 가시성 - 오케스트레이션 트리거 메시지가 구성 가능한 기간 동안 큐에서 제거되고 보이지 않게 유지됩니다.Message visibility - Orchestration trigger messages are dequeued and kept invisible for a configurable duration. 함수 앱이 실행되고 있고 정상으로 유지되는 동안은 이러한 메시지의 가시성이 자동으로 갱신됩니다.The visibility of these messages is renewed automatically as long as the function app is running and healthy.
  • 반환 값 - 반환 값은 JSON으로 직렬화되고 Azure Table Storage의 오케스트레이션 기록 테이블에 유지됩니다.Return values - Return values are serialized to JSON and persisted to the orchestration history table in Azure Table storage. 이러한 반환 값은 나중에 설명할 오케스트레이션 클라이언트 바인딩을 통해 쿼리할 수 있습니다.These return values can be queried by the orchestration client binding, described later.

경고

오케스트레이터 함수는 오케스트레이션 트리거 바인딩 이외의 입력 또는 출력 바인딩을 절대로 사용하면 안됩니다.Orchestrator functions should never use any input or output bindings other than the orchestration trigger binding. 이렇게 하면 그러한 바인딩에서 단일 스레딩 및 I/O 규칙을 따르지 않을 수 있으므로 지속성 작업 확장에서 문제가 발생할 수 있습니다.Doing so has the potential to cause problems with the Durable Task extension because those bindings may not obey the single-threading and I/O rules. 다른 바인딩을 사용 하려면 Orchestrator 함수에서 호출 된 작업 함수에 추가 합니다.If you'd like to use other bindings, add them to an Activity function called from your Orchestrator function.

경고

JavaScript 오케스트레이터 함수는 async로 선언되지 않아야 합니다.JavaScript orchestrator functions should never be declared async.

트리거 사용(.NET)Trigger usage (.NET)

오케스트레이션 트리거 바인딩은 입력과 출력을 모두 지원합니다.The orchestration trigger binding supports both inputs and outputs. 다음은 입력 및 출력 처리에 대해 알고 있어야 할 몇 가지 사항입니다.Here are some things to know about input and output handling:

  • 입력 -.net 오케스트레이션 함수 DurableOrchestrationContext 는 매개 변수 형식 으로만 지원 됩니다.inputs - .NET orchestration functions support only DurableOrchestrationContext as a parameter type. 함수 시그니처에서 직접적인 역직렬화 입력은 지원되지 않습니다.Deserialization of inputs directly in the function signature is not supported. 코드는 GetInput<T> (.net) 또는 getInput (JavaScript) 메서드를 사용 하 여 orchestrator 함수 입력을 가져와야 합니다.Code must use the GetInput<T> (.NET) or getInput (JavaScript) method to fetch orchestrator function inputs. 이러한 입력은 JSON 직렬화 가능 형식이어야 합니다.These inputs must be JSON-serializable types.
  • 출력 - 오케스트레이션 트리거는 입력뿐만 아니라 출력 값도 지원합니다.outputs - Orchestration triggers support output values as well as inputs. 함수의 반환 값은 출력 값을 할당하는 데 사용되며 JSON 직렬화 가능해야 합니다.The return value of the function is used to assign the output value and must be JSON-serializable. .NET 함수에서 Task 또는 void를 반환하면 null 값이 출력으로 저장됩니다.If a .NET function returns Task or void, a null value will be saved as the output.

트리거 샘플Trigger sample

다음 예제 코드에서는 가장 간단한 "Hello World" orchestrator 함수를 보여 줍니다.The following example code shows what the simplest "Hello World" orchestrator function might look like:

C#C#

[FunctionName("HelloWorld")]
public static string Run([OrchestrationTrigger] IDurableOrchestrationContext context)
{
    string name = context.GetInput<string>();
    return $"Hello {name}!";
}

참고

이전 코드는 Durable Functions 2.x에 대 한 것입니다.The previous code is for Durable Functions 2.x. 1.x Durable Functions의 경우 대신를 사용 해야 합니다 DurableOrchestrationContext IDurableOrchestrationContext .For Durable Functions 1.x, you must use DurableOrchestrationContext instead of IDurableOrchestrationContext. 버전 간의 차이점에 대 한 자세한 내용은 Durable Functions 버전 문서를 참조 하세요.For more information about the differences between versions, see the Durable Functions Versions article.

JavaScript(Functions 2.0만 해당)JavaScript (Functions 2.0 only)

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

module.exports = df.orchestrator(function*(context) {
    const name = context.df.getInput();
    return `Hello ${name}!`;
});

참고

contextJavaScript의 개체는 DurableOrchestrationContext을 나타내지 않지만 함수 컨텍스트 전체를 나타냅니다.The context object in JavaScript does not represent the DurableOrchestrationContext, but the function context as a whole. context 개체의 df 속성을 통해 오케스트레이션 메서드에 액세스할 수 있습니다.You can access orchestration methods via the context object's df property.

참고

JavaScript 오케스트레이터는 return을 사용해야 합니다.JavaScript orchestrators should use return. durable-functions 라이브러리는 context.done 메서드 호출을 처리합니다.The durable-functions library takes care of calling the context.done method.

대부분의 오케스트레이터 함수에서 작업 함수를 호출하므로 작업 함수를 호출하는 방법을 보여 주는 "Hello World" 예제가 여기에 있습니다.Most orchestrator functions call activity functions, so here is a "Hello World" example that demonstrates how to call an activity function:

C#C#

[FunctionName("HelloWorld")]
public static async Task<string> Run(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    string name = context.GetInput<string>();
    string result = await context.CallActivityAsync<string>("SayHello", name);
    return result;
}

참고

이전 코드는 Durable Functions 2.x에 대 한 것입니다.The previous code is for Durable Functions 2.x. 1.x Durable Functions의 경우 대신를 사용 해야 합니다 DurableOrchestrationContext IDurableOrchestrationContext .For Durable Functions 1.x, you must use DurableOrchestrationContext instead of IDurableOrchestrationContext. 버전 간의 차이점에 대 한 자세한 내용은 Durable Functions 버전 문서를 참조 하세요.For more information about the differences between versions, see the Durable Functions versions article.

JavaScript(Functions 2.0만 해당)JavaScript (Functions 2.0 only)

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

module.exports = df.orchestrator(function*(context) {
    const name = context.df.getInput();
    const result = yield context.df.callActivity("SayHello", name);
    return result;
});

작업 트리거Activity trigger

작업 트리거를 사용 하면 작업 함수라고 하는 orchestrator 함수에 의해 호출 되는 함수를 작성할 수 있습니다.The activity trigger enables you to author functions that are called by orchestrator functions, known as activity functions.

Visual Studio를 사용 하는 경우 작업 트리거는 .Net 특성을 사용 하 여 구성 됩니다 ActivityTriggerAttribute .If you're using Visual Studio, the activity trigger is configured using the ActivityTriggerAttribute .NET attribute.

개발을 위해 VS Code 또는 Azure Portal을 사용하는 경우 작업 트리거는 function.jsonbindings 배열에 있는 다음 JSON 개체에서 정의됩니다.If you're using VS Code or the Azure portal for development, the activity trigger is defined by the following JSON object in the bindings array of function.json:

{
    "name": "<Name of input parameter in function signature>",
    "activity": "<Optional - name of the activity>",
    "type": "activityTrigger",
    "direction": "in"
}
  • activity은 작업의 이름입니다.activity is the name of the activity. 이 값은 오 케 스트레이 터 함수가이 작업 함수를 호출 하는 데 사용 하는 이름입니다.This value is the name that orchestrator functions use to invoke this activity function. 이 속성은 선택 사항입니다.This property is optional. 지정하지 않으면 함수의 이름이 사용됩니다.If not specified, the name of the function is used.

내부적으로 이 트리거 바인딩은 함수 앱에 대한 기본 스토리지 계정에 있는 큐를 폴링합니다.Internally this trigger binding polls a queue in the default storage account for the function app. 이 큐는 확장에 대한 내부 구현 세부 정보이며, 이는 바인딩 속성에서 명시적으로 구성되지 않은 이유입니다.This queue is an internal implementation detail of the extension, which is why it is not explicitly configured in the binding properties.

트리거 동작Trigger behavior

다음은 작업 트리거에 대한 몇 가지 참고 사항입니다.Here are some notes about the activity trigger:

  • 스레딩 - 오케스트레이션 트리거와 달리 작업 트리거에는 스레딩 또는 I/O에 대한 제한이 없습니다.Threading - Unlike the orchestration trigger, activity triggers don't have any restrictions around threading or I/O. 일반 함수처럼 처리될 수 있습니다.They can be treated like regular functions.
  • 포이즌 메시지 처리 - 작업 트리거에는 포이즌 메시지 지원이 없습니다.Poison-message handling - There is no poison message support in activity triggers.
  • 메시지 가시성 - 작업 트리거 메시지가 구성 가능한 기간 동안 큐에서 제거되고 보이지 않게 유지됩니다.Message visibility - Activity trigger messages are dequeued and kept invisible for a configurable duration. 함수 앱이 실행되고 있고 정상으로 유지되는 동안은 이러한 메시지의 가시성이 자동으로 갱신됩니다.The visibility of these messages is renewed automatically as long as the function app is running and healthy.
  • 반환 값 - 반환 값은 JSON으로 직렬화되고 Azure Table Storage의 오케스트레이션 기록 테이블에 유지됩니다.Return values - Return values are serialized to JSON and persisted to the orchestration history table in Azure Table storage.

경고

작업 함수에 대한 스토리지 백 엔드는 구현 세부 정보이며, 사용자 코드는 이러한 스토리지 엔터티와 직접 상호 작용하면 안됩니다.The storage backend for activity functions is an implementation detail and user code should not interact with these storage entities directly.

트리거 사용(.NET)Trigger usage (.NET)

작업 트리거 바인딩은 오케스트레이션 트리거와 마찬가지로 입력과 출력을 모두 지원합니다.The activity trigger binding supports both inputs and outputs, just like the orchestration trigger. 다음은 입력 및 출력 처리에 대해 알고 있어야 할 몇 가지 사항입니다.Here are some things to know about input and output handling:

  • 입력 -.net 작업 함수는 기본적으로 DurableActivityContext 매개 변수 형식으로 사용 됩니다.inputs - .NET activity functions natively use DurableActivityContext as a parameter type. 또는 JSON 직렬화 가능 매개 변수 형식으로 선언될 수 있습니다.Alternatively, an activity function can be declared with any parameter type that is JSON-serializable. 를 사용 하 DurableActivityContext 는 경우를 호출 GetInput<T> 하 여 작업 함수 입력을 페치 및 deserialize 할 수 있습니다.When you use DurableActivityContext, you can call GetInput<T> to fetch and deserialize the activity function input.
  • 출력 - 작업 함수는 입력뿐만 아니라 출력 값도 지원합니다.outputs - Activity functions support output values as well as inputs. 함수의 반환 값은 출력 값을 할당하는 데 사용되며 JSON 직렬화 가능해야 합니다.The return value of the function is used to assign the output value and must be JSON-serializable. .NET 함수에서 Task 또는 void를 반환하면 null 값이 출력으로 저장됩니다.If a .NET function returns Task or void, a null value will be saved as the output.
  • 메타데이터 - .NET 활동 함수는 string instanceId 매개 변수에 바인딩하여 부모 오케스트레이션의 인스턴스 ID를 가져올 수 있습니다.metadata - .NET activity functions can bind to a string instanceId parameter to get the instance ID of the parent orchestration.

트리거 샘플Trigger sample

다음 예제 코드에서는 간단한 "Hello World" 작업 함수를 보여 줍니다.The following example code shows what a simple "Hello World" activity function might look like:

C#C#

[FunctionName("SayHello")]
public static string SayHello([ActivityTrigger] IDurableActivityContext helloContext)
{
    string name = helloContext.GetInput<string>();
    return $"Hello {name}!";
}

참고

이전 코드는 Durable Functions 2.x에 대 한 것입니다.The previous code is for Durable Functions 2.x. 1.x Durable Functions의 경우 대신를 사용 해야 합니다 DurableActivityContext IDurableActivityContext .For Durable Functions 1.x, you must use DurableActivityContext instead of IDurableActivityContext. 버전 간의 차이점에 대 한 자세한 내용은 Durable Functions 버전 문서를 참조 하세요.For more information about the differences between versions, see the Durable Functions Versions article.

.NET ActivityTriggerAttribute 바인딩의 기본 매개 변수 형식은 IDurableActivityContext입니다.The default parameter type for the .NET ActivityTriggerAttribute binding is IDurableActivityContext. 그러나 .NET 작업 트리거는 JSON 직렬화 가능 형식(기본 형식 포함)에 대한 직접 바인딩도 지원하므로 동일한 함수를 다음과 같이 단순화할 수 있습니다.However, .NET activity triggers also support binding directly to JSON-serializeable types (including primitive types), so the same function could be simplified as follows:

[FunctionName("SayHello")]
public static string SayHello([ActivityTrigger] string name)
{
    return $"Hello {name}!";
}

JavaScript(Functions 2.0만 해당)JavaScript (Functions 2.0 only)

module.exports = async function(context) {
    return `Hello ${context.bindings.name}!`;
};

JavaScript 바인딩도 추가 매개 변수로 전달될 수 있으므로 동일한 함수를 다음과 같이 단순화할 수 있습니다.JavaScript bindings can also be passed in as additional parameters, so the same function could be simplified as follows:

module.exports = async function(context, name) {
    return `Hello ${name}!`;
};

입력 및 출력 바인딩 사용Using input and output bindings

활동 트리거 바인딩과 함께 일반 입력 및 출력 바인딩을 사용할 수 있습니다.You can use regular input and output bindings in addition to the activity trigger binding. 예를 들어 작업 바인딩에 대 한 입력을 가져오고 EventHub 출력 바인딩을 사용 하 여 EventHub로 메시지를 보낼 수 있습니다.For example, you can take the input to your activity binding, and send a message to an EventHub using the EventHub output binding:

{
  "bindings": [
    {
      "name": "message",
      "type": "activityTrigger",
      "direction": "in"
    },
    {
      "type": "eventHub",
      "name": "outputEventHubMessage",
      "connection": "EventhubConnectionSetting",
      "eventHubName": "eh_messages",
      "direction": "out"
  }
  ]
}
module.exports = async function (context) {
    context.bindings.outputEventHubMessage = context.bindings.message;
};

오케스트레이션 클라이언트Orchestration client

Orchestration 클라이언트 바인딩을 사용 하면 orchestrator 기능과 상호 작용 하는 함수를 작성할 수 있습니다.The orchestration client binding enables you to write functions that interact with orchestrator functions. 이러한 함수를 클라이언트 함수라고도 합니다.These functions are sometimes referred to as client functions. 예를 들어 오케스트레이션 인스턴스에서 다음과 같은 방법으로 작동할 수 있습니다.For example, you can act on orchestration instances in the following ways:

  • 인스턴스를 시작합니다.Start them.
  • 해당 상태를 쿼리합니다.Query their status.
  • 인스턴스를 종료합니다.Terminate them.
  • 실행하는 동안 이벤트를 보냅니다.Send events to them while they're running.
  • 인스턴스 기록을 제거합니다.Purge instance history.

Visual Studio를 사용 하는 경우 OrchestrationClientAttribute Durable Functions 1.0에 대 한 .net 특성을 사용 하 여 오케스트레이션 클라이언트에 바인딩할 수 있습니다.If you're using Visual Studio, you can bind to the orchestration client by using the OrchestrationClientAttribute .NET attribute for Durable Functions 1.0. Durable Functions 2.0부터 .Net 특성을 사용 하 여 오케스트레이션 클라이언트에 바인딩할 수 있습니다 DurableClientAttribute .Starting in the Durable Functions 2.0, you can bind to the orchestration client by using the DurableClientAttribute .NET attribute.

개발을 위해 스크립트 언어 (예: csx 또는 .js 파일)를 사용 하는 경우 오케스트레이션 트리거는 bindings function.js 배열에서 다음 JSON 개체에 의해 정의 됩니다.If you're using scripting languages (for example, .csx or .js files) for development, the orchestration trigger is defined by the following JSON object in the bindings array of function.json:

{
    "name": "<Name of input parameter in function signature>",
    "taskHub": "<Optional - name of the task hub>",
    "connectionName": "<Optional - name of the connection string app setting>",
    "type": "orchestrationClient",
    "direction": "in"
}
  • taskHub - 여러 함수 앱에서 동일한 스토리지 계정을 공유하지만 서로 격리되어야 하는 시나리오에 사용됩니다.taskHub - Used in scenarios where multiple function apps share the same storage account but need to be isolated from each other. 지정하지 않으면 host.json의 기본값이 사용됩니다.If not specified, the default value from host.json is used. 이 값은 대상 오케스트레이터 함수에서 사용하는 값과 일치해야 합니다.This value must match the value used by the target orchestrator functions.
  • connectionName - 스토리지 계정 연결 문자열을 포함하는 앱 설정의 이름입니다.connectionName - The name of an app setting that contains a storage account connection string. 이 연결 문자열에서 나타내는 스토리지 계정은 대상 오케스트레이터 함수에서 사용하는 계정과 동일해야 합니다.The storage account represented by this connection string must be the same one used by the target orchestrator functions. 지정하지 않으면 함수 앱에 대한 기본 스토리지 계정 연결 문자열이 사용됩니다.If not specified, the default storage account connection string for the function app is used.

참고

대부분의 경우 이러한 속성을 생략하고 기본 동작을 사용하는 것이 좋습니다.In most cases, we recommend that you omit these properties and rely on the default behavior.

클라이언트 사용Client usage

.NET 함수에서는 일반적으로에 바인딩하고 IDurableOrchestrationClient Durable Functions에서 지 원하는 모든 오케스트레이션 클라이언트 api에 대 한 모든 권한을 제공 합니다.In .NET functions, you typically bind to IDurableOrchestrationClient, which gives you full access to all orchestration client APIs supported by Durable Functions. 이전 Durable Functions 2.x 릴리스에서는 대신 클래스에 바인딩합니다 DurableOrchestrationClient .In the older Durable Functions 2.x releases, you instead bind to the DurableOrchestrationClient class. JavaScript에서 동일한 Api는에서 반환 되는 개체에 의해 노출 됩니다 getClient .In JavaScript, the same APIs are exposed by the object returned from getClient. 클라이언트 개체에 대한 API는 다음과 같습니다.APIs on the client object include:

  • StartNewAsync
  • GetStatusAsync
  • TerminateAsync
  • RaiseEventAsync
  • PurgeInstanceHistoryAsync
  • CreateCheckStatusResponse
  • CreateHttpManagementPayload

IAsyncCollector<T> T 또는가 또는 인 경우 .net 함수는에 바인딩할 수 있습니다 StartOrchestrationArgs JObject .Alternatively, .NET functions can bind to IAsyncCollector<T> where T is StartOrchestrationArgs or JObject.

이러한 작업에 대 한 자세한 내용은 IDurableOrchestrationClient API 설명서를 참조 하세요.For more information on these operations, see the IDurableOrchestrationClient API documentation.

클라이언트 샘플(Visual Studio 개발)Client sample (Visual Studio development)

다음은 "HelloWorld" 오케스트레이션을 시작하는 큐 트리거 함수 예제입니다.Here is an example queue-triggered function that starts a "HelloWorld" orchestration.

[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("HelloWorld", input);
}

참고

이전 c # 코드는 Durable Functions 2.x에 대 한 것입니다.The previous C# code is for Durable Functions 2.x. 1.x Durable Functions의 경우 OrchestrationClient 특성 대신 특성을 사용 해야 DurableClient 하며 DurableOrchestrationClient 대신 매개 변수 형식을 사용 해야 합니다 IDurableOrchestrationClient .For Durable Functions 1.x, you must use OrchestrationClient attribute instead of the DurableClient attribute, and you must use the DurableOrchestrationClient parameter type instead of IDurableOrchestrationClient. 버전 간의 차이점에 대 한 자세한 내용은 Durable Functions 버전 문서를 참조 하세요.For more information about the differences between versions, see the Durable Functions Versions article.

클라이언트 샘플(Visual Studio 사용 안 함)Client sample (not Visual Studio)

개발을 위해 Visual Studio를 사용하지 않는 경우 다음 function.json 파일을 만들 수 있습니다.If you're not using Visual Studio for development, you can create the following function.json file. 이 예제에서는 지속성 함수 오케스트레이션 클라이언트 바인딩을 사용하는 큐 트리거 함수를 구성하는 방법을 보여 줍니다.This example shows how to configure a queue-triggered function that uses the durable orchestration client binding:

{
  "bindings": [
    {
      "name": "input",
      "type": "queueTrigger",
      "queueName": "durable-function-trigger",
      "direction": "in"
    },
    {
      "name": "starter",
      "type": "durableClient",
      "direction": "in"
    }
  ]
}

참고

이전 JSON은 Durable Functions 2.x에 대 한 것입니다.The previous JSON is for Durable Functions 2.x. 1.x Durable Functions의 경우 orchestrationClient 트리거 형식으로 대신를 사용 해야 합니다 durableClient .For Durable Functions 1.x, you must use orchestrationClient instead of the durableClient as the trigger type. 버전 간의 차이점에 대 한 자세한 내용은 Durable Functions 버전 문서를 참조 하세요.For more information about the differences between versions, see the Durable Functions Versions article.

다음은 새 오케스트레이터 함수 인스턴스를 시작하는 언어 관련 샘플입니다.Following are language-specific samples that start new orchestrator function instances.

C # 스크립트 샘플C# Script Sample

다음 샘플에서는 지 속성 오케스트레이션 클라이언트 바인딩을 사용 하 여 큐에서 트리거되는 c # 함수에서 새 함수 인스턴스를 시작 하는 방법을 보여 줍니다.The following sample shows how to use the durable orchestration client binding to start a new function instance from a queue-triggered C# function:

#r "Microsoft.Azure.WebJobs.Extensions.DurableTask"

using Microsoft.Azure.WebJobs.Extensions.DurableTask;

public static Task Run(string input, IDurableOrchestrationClient starter)
{
    return starter.StartNewAsync("HelloWorld", input);
}

참고

이전 코드는 Durable Functions 2.x에 대 한 것입니다.The previous code is for Durable Functions 2.x. 1.x Durable Functions의 경우 DurableOrchestrationClient 대신 매개 변수 형식을 사용 해야 합니다 IDurableOrchestrationClient .For Durable Functions 1.x, you must use the DurableOrchestrationClient parameter type instead of IDurableOrchestrationClient. 버전 간의 차이점에 대 한 자세한 내용은 Durable Functions 버전 문서를 참조 하세요.For more information about the differences between versions, see the Durable Functions Versions article.

JavaScript 샘플JavaScript Sample

다음 샘플에서는 지속성 오케스트레이션 클라이언트 바인딩을 사용하여 JavaScript 함수에서 새 함수 인스턴스를 시작하는 방법을 보여줍니다.The following sample shows how to use the durable orchestration client binding to start a new function instance from a JavaScript function:

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

module.exports = async function (context) {
    const client = df.getClient(context);
    return instanceId = await client.startNew("HelloWorld", undefined, context.bindings.input);
};

인스턴스 시작에 대한 자세한 내용은 인스턴스 관리에서 찾을 수 있습니다.More details on starting instances can be found in Instance management.

엔터티 트리거Entity trigger

엔터티 트리거를 사용 하면 엔터티 함수를 작성할 수 있습니다.Entity triggers allow you to author entity functions. 이 트리거는 특정 엔터티 인스턴스에 대 한 이벤트 처리를 지원 합니다.This trigger supports processing events for a specific entity instance.

Azure Functions 용 Visual Studio 도구를 사용 하는 경우 엔터티 트리거는 .Net 특성을 사용 하 여 구성 됩니다 EntityTriggerAttribute .When you use the Visual Studio tools for Azure Functions, the entity trigger is configured using the EntityTriggerAttribute .NET attribute.

참고

엔터티 트리거는 Durable Functions 2.x부터 사용할 수 있습니다.Entity triggers are available starting in Durable Functions 2.x.

내부적으로 이 트리거 바인딩은 함수 앱에 대한 기본 스토리지 계정에 있는 일련의 큐를 폴링합니다.Internally this trigger binding polls a series of queues in the default storage account for the function app. 이러한 큐는 확장에 대한 내부 구현 세부 정보이며, 이는 바인딩 속성에서 명시적으로 구성되지 않은 이유입니다.These queues are internal implementation details of the extension, which is why they are not explicitly configured in the binding properties.

트리거 동작Trigger behavior

엔터티 트리거에 대 한 몇 가지 참고 사항은 다음과 같습니다.Here are some notes about the entity trigger:

  • 단일 스레드: 단일 디스패처 스레드를 사용 하 여 특정 엔터티에 대 한 작업을 처리 합니다.Single-threaded: A single dispatcher thread is used to process operations for a particular entity. 여러 메시지를 단일 엔터티로 동시에 보내는 경우 작업은 한 번에 하나씩 처리 됩니다.If multiple messages are sent to a single entity concurrently, the operations will be processed one-at-a-time.
  • 포이즌 메시지 처리 -엔터티 트리거에서 포이즌 메시지를 지원 하지 않습니다.Poison-message handling - There is no poison message support in entity triggers.
  • 메시지 표시 유형 -엔터티 트리거 메시지가 구성 가능한 기간 동안 큐에서 제거 되 고 보이지 않게 유지 됩니다.Message visibility - Entity trigger messages are dequeued and kept invisible for a configurable duration. 함수 앱이 실행되고 있고 정상으로 유지되는 동안은 이러한 메시지의 가시성이 자동으로 갱신됩니다.The visibility of these messages is renewed automatically as long as the function app is running and healthy.
  • 반환 값 -엔터티 함수는 반환 값을 지원 하지 않습니다.Return values - Entity functions do not support return values. 상태를 저장 하거나 다시 오케스트레이션에 값을 전달 하는 데 사용할 수 있는 특정 Api가 있습니다.There are specific APIs that can be used to save state or pass values back to orchestrations.

실행 중에 엔터티에 대 한 모든 상태 변경 내용은 실행이 완료 된 후 자동으로 유지 됩니다.Any state changes made to an entity during its execution will be automatically persisted after execution has completed.

트리거 사용(.NET)Trigger usage (.NET)

모든 엔터티 함수에는 다음 멤버를 포함 하는 매개 변수 형식이 있습니다 IDurableEntityContext .Every entity function has a parameter type of IDurableEntityContext, which has the following members:

  • EntityName: 현재 실행 중인 엔터티의 이름입니다.EntityName: the name of the currently executing entity.
  • EntityKey: 현재 실행 중인 엔터티의 키입니다.EntityKey: the key of the currently executing entity.
  • EntityId: 현재 실행 중인 엔터티의 ID입니다.EntityId: the ID of the currently executing entity.
  • OperationName: 현재 작업의 이름입니다.OperationName: the name of the current operation.
  • Hasstate: 엔터티가 존재 하는지 여부, 즉 특정 상태를 포함 합니다.HasState: whether the entity exists, that is, has some state.
  • Getstate <TState> (): 엔터티의 현재 상태를 가져옵니다.GetState<TState>(): gets the current state of the entity. 아직 존재 하지 않는 경우 생성 되 고로 초기화 됩니다 default<TState> .If it does not already exist, it is created and initialized to default<TState>. TState매개 변수는 기본 형식 또는 JSON serializeable 형식 이어야 합니다.The TState parameter must be a primitive or JSON-serializeable type.
  • Getstate <TState> (initfunction): 엔터티의 현재 상태를 가져옵니다.GetState<TState>(initfunction): gets the current state of the entity. 아직 존재 하지 않는 경우 제공 된 매개 변수를 호출 하 여 생성 됩니다 initfunction .If it does not already exist, it is created by calling the provided initfunction parameter. TState매개 변수는 기본 형식 또는 JSON serializeable 형식 이어야 합니다.The TState parameter must be a primitive or JSON-serializeable type.
  • SetState (arg): 엔터티의 상태를 만들거나 업데이트 합니다.SetState(arg): creates or updates the state of the entity. arg매개 변수는 JSON-serializeable 개체 또는 기본 형식 이어야 합니다.The arg parameter must be a JSON-serializeable object or primitive.
  • Deletestate (): 엔터티의 상태를 삭제 합니다.DeleteState(): deletes the state of the entity.
  • Getinput <TInput> (): 현재 작업에 대 한 입력을 가져옵니다.GetInput<TInput>(): gets the input for the current operation. TInput형식 매개 변수는 기본 형식 또는 JSON serializeable 형식 이어야 합니다.The TInput type parameter must be a primitive or JSON-serializeable type.
  • Return (arg): 작업을 호출한 오케스트레이션에 값을 반환 합니다.Return(arg): returns a value to the orchestration that called the operation. arg매개 변수는 기본 또는 JSON serializeable 개체 여야 합니다.The arg parameter must be a primitive or JSON-serializeable object.
  • SignalEntity (EntityId, scheduledTimeUtc, operation, input): 엔터티에 단방향 메시지를 보냅니다.SignalEntity(EntityId, scheduledTimeUtc, operation, input): sends a one-way message to an entity. operation매개 변수는 null이 아닌 문자열 이어야 하 고, 옵션은 scheduledTimeUtc 작업을 호출 하는 UTC 날짜/시간 이어야 하며, input 매개 변수는 기본 또는 JSON serializeable 개체 여야 합니다.The operation parameter must be a non-null string, the optional scheduledTimeUtc must be a UTC datetime at which to invoke the operation, and the input parameter must be a primitive or JSON-serializeable object.
  • CreateNewOrchestration (orchestratorFunctionName, input): 새 오케스트레이션을 시작 합니다.CreateNewOrchestration(orchestratorFunctionName, input): starts a new orchestration. input매개 변수는 기본 또는 JSON serializeable 개체 여야 합니다.The input parameter must be a primitive or JSON-serializeable object.

IDurableEntityContext엔터티 함수에 전달 되는 개체는 Entity.Current async-local 속성을 사용 하 여 액세스할 수 있습니다.The IDurableEntityContext object passed to the entity function can be accessed using the Entity.Current async-local property. 이 방법은 클래스 기반 프로그래밍 모델을 사용 하는 경우에 편리 합니다.This approach is convenient when using the class-based programming model.

트리거 샘플 (c # 함수 기반 구문)Trigger sample (C# function-based syntax)

다음 코드는 지속성 함수로 구현된 간단한 Counter 엔터티의 예제입니다.The following code is an example of a simple Counter entity implemented as a durable function. 이 함수는 각각 정수 상태에서 작동하는 세 가지 작업(add, resetget)을 정의합니다.This function defines three operations, add, reset, and get, each of which operate on an integer state.

[FunctionName("Counter")]
public static void Counter([EntityTrigger] IDurableEntityContext ctx)
{
    switch (ctx.OperationName.ToLowerInvariant())
    {
        case "add":
            ctx.SetState(ctx.GetState<int>() + ctx.GetInput<int>());
            break;
        case "reset":
            ctx.SetState(0);
            break;
        case "get":
            ctx.Return(ctx.GetState<int>()));
            break;
    }
}

함수 기반 구문 및 사용 방법에 대 한 자세한 내용은 함수 기반 구문을 참조 하세요.For more information on the function-based syntax and how to use it, see Function-Based Syntax.

트리거 샘플 (c # 클래스 기반 구문)Trigger sample (C# class-based syntax)

다음 예제에서는 클래스와 메서드를 사용하여 Counter 엔터티를 동일하게 구현합니다.The following example is an equivalent implementation of the Counter entity using classes and methods.

[JsonObject(MemberSerialization.OptIn)]
public class Counter
{
    [JsonProperty("value")]
    public int CurrentValue { get; set; }

    public void Add(int amount) => this.CurrentValue += amount;

    public void Reset() => this.CurrentValue = 0;

    public int Get() => this.CurrentValue;

    [FunctionName(nameof(Counter))]
    public static Task Run([EntityTrigger] IDurableEntityContext ctx)
        => ctx.DispatchAsync<Counter>();
}

이 엔터티의 상태는 카운터의 현재 값을 저장하는 필드가 포함된 Counter 형식의 개체입니다.The state of this entity is an object of type Counter, which contains a field that stores the current value of the counter. 이 개체를 스토리지에 유지하기 위해 Json.NET 라이브러리에서 직렬화 및 역직렬화합니다.To persist this object in storage, it is serialized and deserialized by the Json.NET library.

클래스 기반 구문과 이를 사용하는 방법에 대한 자세한 내용은 엔터티 클래스 정의를 참조하세요.For more information on the class-based syntax and how to use it, see Defining entity classes.

참고

엔터티 클래스를 사용하는 경우 [FunctionName] 특성이 있는 함수 진입점 메서드를 static으로 선언해야 합니다.The function entry point method with the [FunctionName] attribute must be declared static when using entity classes. 비정적 진입점 메서드를 사용하면 여러 개체가 초기화되고 잠재적으로 정의되지 않은 다른 동작이 발생할 수 있습니다.Non-static entry point methods may result in multiple object initialization and potentially other undefined behaviors.

엔터티 클래스에는 바인딩과 .NET 종속성 주입을 상호 작용 하기 위한 특수 메커니즘이 있습니다.Entity classes have special mechanisms for interacting with bindings and .NET dependency injection. 자세한 내용은 엔터티 생성을 참조 하세요.For more information, see Entity construction.

트리거 샘플 (JavaScript)Trigger sample (JavaScript)

다음 코드는 JavaScript로 작성 된 내구성이 있는 함수로 구현 된 간단한 Counter 엔터티의 예입니다.The following code is an example of a simple Counter entity implemented as a durable function written in JavaScript. 이 함수는 각각 정수 상태에서 작동하는 세 가지 작업(add, resetget)을 정의합니다.This function defines three operations, add, reset, and get, each of which operate on an integer state.

function.jsonfunction.json

{
  "bindings": [
    {
      "name": "context",
      "type": "entityTrigger",
      "direction": "in"
    }
  ],
  "disabled": false
}

index.jsindex.js

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

module.exports = df.entity(function(context) {
    const currentValue = context.df.getState(() => 0);
    switch (context.df.operationName) {
        case "add":
            const amount = context.df.getInput();
            context.df.setState(currentValue + amount);
            break;
        case "reset":
            context.df.setState(0);
            break;
        case "get":
            context.df.return(currentValue);
            break;
    }
});

참고

지속성 엔터티는 durable-functions npm 패키지의 버전 1.3.0 부터 JavaScript에서 사용할 수 있습니다.Durable entities are available in JavaScript starting with version 1.3.0 of the durable-functions npm package.

엔터티 클라이언트Entity client

엔터티 클라이언트 바인딩을 사용 하면 엔터티 함수를 비동기적으로 트리거할 수 있습니다.The entity client binding enables you to asynchronously trigger entity functions. 이러한 함수를 클라이언트 함수라고도 합니다.These functions are sometimes referred to as client functions.

Visual Studio를 사용 하는 경우 .Net 특성을 사용 하 여 엔터티 클라이언트에 바인딩할 수 있습니다 DurableClientAttribute .If you're using Visual Studio, you can bind to the entity client by using the DurableClientAttribute .NET attribute.

참고

[DurableClientAttribute] 사용 하 여 오케스트레이션 클라이언트에 바인딩할 수도 있습니다.The [DurableClientAttribute] can also be used to bind to the orchestration client.

개발을 위해 스크립트 언어 (예: csx 또는 .js 파일)를 사용 하는 경우 엔터티 트리거는 bindings function.js 배열에서 다음 JSON 개체에 의해 정의 됩니다.If you're using scripting languages (for example, .csx or .js files) for development, the entity trigger is defined by the following JSON object in the bindings array of function.json:

{
    "name": "<Name of input parameter in function signature>",
    "taskHub": "<Optional - name of the task hub>",
    "connectionName": "<Optional - name of the connection string app setting>",
    "type": "durableClient",
    "direction": "in"
}
  • taskHub - 여러 함수 앱에서 동일한 스토리지 계정을 공유하지만 서로 격리되어야 하는 시나리오에 사용됩니다.taskHub - Used in scenarios where multiple function apps share the same storage account but need to be isolated from each other. 지정하지 않으면 host.json의 기본값이 사용됩니다.If not specified, the default value from host.json is used. 이 값은 대상 엔터티 함수에서 사용 하는 값과 일치 해야 합니다.This value must match the value used by the target entity functions.
  • connectionName - 스토리지 계정 연결 문자열을 포함하는 앱 설정의 이름입니다.connectionName - The name of an app setting that contains a storage account connection string. 이 연결 문자열이 나타내는 저장소 계정은 대상 엔터티 함수에서 사용 하는 것과 동일 해야 합니다.The storage account represented by this connection string must be the same one used by the target entity functions. 지정하지 않으면 함수 앱에 대한 기본 스토리지 계정 연결 문자열이 사용됩니다.If not specified, the default storage account connection string for the function app is used.

참고

대부분의 경우 선택적 속성을 생략 하 고 기본 동작을 사용 하는 것이 좋습니다.In most cases, we recommend that you omit the optional properties and rely on the default behavior.

엔터티 클라이언트 사용Entity client usage

.NET 함수에서는 일반적으로에 바인딩되어 IDurableEntityClient 있으며이는 영 속 엔터티에서 지 원하는 모든 클라이언트 api에 대 한 모든 액세스 권한을 제공 합니다.In .NET functions, you typically bind to IDurableEntityClient, which gives you full access to all client APIs supported by Durable Entities. IDurableOrchestrationClient엔터티와 오케스트레이션의 클라이언트 api에 대 한 액세스를 제공 하는 인터페이스에 바인딩할 수도 있습니다.You can also bind to the IDurableOrchestrationClient interface, which provides access to client APIs for both entities and orchestrations. 클라이언트 개체에 대한 API는 다음과 같습니다.APIs on the client object include:

  • ReadEntityStateAsync <T>: 엔터티의 상태를 읽습니다.ReadEntityStateAsync<T>: reads the state of an entity. 대상 엔터티가 있는지 여부를 나타내는 응답을 반환 하 고, 그럴 경우 상태를 반환 합니다.It returns a response that indicates whether the target entity exists, and if so, what its state is.
  • SignalEntityAsync: 엔터티에 단방향 메시지를 보내고 큐에 대기 될 때까지 기다립니다.SignalEntityAsync: sends a one-way message to an entity, and waits for it to be enqueued.
  • Listent활동 async: 여러 엔터티의 상태를 쿼리 합니다.ListEntitiesAsync: queries for the state of multiple entities. 엔터티는 이름마지막 작업 시간 으로 쿼리할 수 있습니다.Entities can be queried by name and last operation time.

신호를 보내기 전에 대상 엔터티를 만들 필요는 없습니다. 신호를 처리 하는 엔터티 함수 내에서 엔터티 상태를 만들 수 있습니다.There is no need to create the target entity before sending a signal - the entity state can be created from within the entity function that handles the signal.

참고

클라이언트에서 전송 된 "신호"는 방금 큐에 넣은 후 나중에 비동기식으로 처리 된다는 것을 이해 하는 것이 중요 합니다.It's important to understand that the "signals" sent from the client are simply enqueued, to be processed asynchronously at a later time. 특히은 SignalEntityAsync 일반적으로 엔터티가 작업을 시작 하기 전에를 반환 하며 반환 값을 반환 하거나 예외를 관찰할 수 없습니다.In particular, the SignalEntityAsync usually returns before the entity even starts the operation, and it is not possible to get back the return value or observe exceptions. 워크플로의 경우와 같이 더 강력한 보증이 필요한 경우에는 orchestrator 함수 를 사용 해야 합니다 .이 함수를 사용 하면 엔터티 작업이 완료 될 때까지 기다릴 수 있으며 반환 값을 처리 하 고 예외를 관찰할 수 있습니다.If stronger guarantees are required (e.g. for workflows), orchestrator functions should be used, which can wait for entity operations to complete, and can process return values and observe exceptions.

예: 클라이언트에서 직접 엔터티 신호 전달-C #Example: client signals entity directly - C#

다음은 "Counter" 엔터티를 호출 하는 큐 트리거 함수 예제입니다.Here is an example queue-triggered function that invokes a "Counter" entity.

[FunctionName("AddFromQueue")]
public static Task Run(
    [QueueTrigger("durable-function-trigger")] string input,
    [DurableClient] IDurableEntityClient client)
{
    // Entity operation input comes from the queue message content.
    var entityId = new EntityId(nameof(Counter), "myCounter");
    int amount = int.Parse(input);
    return client.SignalEntityAsync(entityId, "Add", amount);
}

예: 클라이언트가 인터페이스-C를 통해 신호를 보냅니다. #Example: client signals entity via interface - C#

가능 하면 더 많은 형식 검사를 제공 하므로 인터페이스를 통해 엔터티에 액세스 하는 것이 좋습니다.Where possible, we recommend accessing entities through interfaces because it provides more type checking. 예를 들어 앞에서 Counter 언급 한 엔터티가 ICounter 다음과 같이 정의 된 인터페이스를 구현 했다고 가정 합니다.For example, suppose the Counter entity mentioned earlier implemented an ICounter interface, defined as follows:

public interface ICounter
{
    void Add(int amount);
    void Reset();
    Task<int> Get();
}

public class Counter : ICounter
{
    // ...
}

클라이언트 코드는를 사용 SignalEntityAsync<ICounter> 하 여 형식이 안전한 프록시를 생성할 수 있습니다.Client code can then use SignalEntityAsync<ICounter> to generate a type-safe proxy:

[FunctionName("UserDeleteAvailable")]
public static async Task AddValueClient(
    [QueueTrigger("my-queue")] string message,
    [DurableClient] IDurableEntityClient client)
{
    var target = new EntityId(nameof(Counter), "myCounter");
    int amount = int.Parse(message);
    await client.SignalEntityAsync<ICounter>(target, proxy => proxy.Add(amount));
}

매개 변수는에 대 한 proxy 호출을의 ICounter Add 해당 (형식화 되지 않은) 호출로 내부적으로 변환 하는의 동적으로 생성 된 인스턴스입니다 SignalEntityAsync .The proxy parameter is a dynamically generated instance of ICounter, which internally translates the call to Add into the equivalent (untyped) call to SignalEntityAsync.

참고

Api는 단방향 SignalEntityAsync 작업을 나타냅니다.The SignalEntityAsync APIs represent one-way operations. 엔터티 인터페이스에서을 반환 Task<T> 하는 경우 T 매개 변수의 값은 항상 null 또는 default 입니다.If an entity interfaces returns Task<T>, the value of the T parameter will always be null or default.

특히 값이 반환 되지 않으므로 작업에 신호를 보내는 것은 의미가 없습니다 Get .In particular, it does not make sense to signal the Get operation, as no value is returned. 대신, 클라이언트는를 사용 ReadStateAsync 하 여 카운터 상태에 직접 액세스 하거나 작업을 호출 하는 orchestrator 함수를 시작할 수 있습니다 Get .Instead, clients can use either ReadStateAsync to access the counter state directly, or can start an orchestrator function that calls the Get operation.

예: 클라이언트 신호 엔터티-JavaScriptExample: client signals entity - JavaScript

다음은 JavaScript의 "카운터" 엔터티에 신호를 전달 하는 큐 트리거 함수 예제입니다.Here is an example queue-triggered function that signals a "Counter" entity in JavaScript.

function.jsonfunction.json

{
    "bindings": [
      {
        "name": "input",
        "type": "queueTrigger",
        "queueName": "durable-entity-trigger",
        "direction": "in",
      },
      {
        "name": "starter",
        "type": "durableClient",
        "direction": "in"
      }
    ],
    "disabled": false
  }

index.jsindex.js

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

module.exports = async function (context) {
    const client = df.getClient(context);
    const entityId = new df.EntityId("Counter", "myCounter");
    await context.df.signalEntity(entityId, "add", 1);
};

참고

지속성 엔터티는 durable-functions npm 패키지의 버전 1.3.0 부터 JavaScript에서 사용할 수 있습니다.Durable entities are available in JavaScript starting with version 1.3.0 of the durable-functions npm package.

host.json 설정host.json settings

지속형 함수에 대한 구성 설정입니다.Configuration settings for Durable Functions.

참고

Durable Functions의 모든 주요 버전은 모든 버전의 Azure Functions 런타임에서 지원됩니다.All major versions of Durable Functions are supported on all versions of the Azure Functions runtime. 그러나 host.json 구성의 스키마는 사용 중인 Azure Functions 런타임 및 Durable Functions 확장 버전에 따라 약간 다릅니다.However, the schema of the host.json configuration is slightly different depending on the version of the Azure Functions runtime and the Durable Functions extension version you use. 다음 예제는 Azure Functions 2.0 및 3.0과 함께 사용하기 위한 것입니다.The following examples are for use with Azure Functions 2.0 and 3.0. 두 예제 모두에서 Azure Functions 1.0을 사용하는 경우 사용 가능한 설정은 동일하지만 host.json의 "durableTask" 섹션은 "extensions" 아래의 필드가 아닌 host.json 구성의 루트에 있어야 합니다.In both examples, if you're using Azure Functions 1.0, the available settings are the same, but the "durableTask" section of the host.json should go in the root of the host.json configuration instead of as a field under "extensions".

Durable Functions 2.xDurable Functions 2.x

{
 "extensions": {
  "durableTask": {
    "hubName": "MyTaskHub",
    "storageProvider": {
      "connectionStringName": "AzureWebJobsStorage",
      "controlQueueBatchSize": 32,
      "controlQueueBufferThreshold": 256,
      "controlQueueVisibilityTimeout": "00:05:00",
      "maxQueuePollingInterval": "00:00:30",
      "partitionCount": 4,
      "trackingStoreConnectionStringName": "TrackingStorage",
      "trackingStoreNamePrefix": "DurableTask",
      "useLegacyPartitionManagement": true,
      "workItemQueueVisibilityTimeout": "00:05:00",
    },
    "tracing": {
      "traceInputsAndOutputs": false,
      "traceReplayEvents": false,
    },
    "notifications": {
      "eventGrid": {
        "topicEndpoint": "https://topic_name.westus2-1.eventgrid.azure.net/api/events",
        "keySettingName": "EventGridKey",
        "publishRetryCount": 3,
        "publishRetryInterval": "00:00:30",
        "publishEventTypes": [
          "Started",
          "Pending",
          "Failed",
          "Terminated"
        ]
      }
    },
    "maxConcurrentActivityFunctions": 10,
    "maxConcurrentOrchestratorFunctions": 10,
    "extendedSessionsEnabled": false,
    "extendedSessionIdleTimeoutInSeconds": 30,
    "useAppLease": true,
    "useGracefulShutdown": false
  }
 }
}

Durable Functions 1.xDurable Functions 1.x

{
  "extensions": {
    "durableTask": {
      "hubName": "MyTaskHub",
      "controlQueueBatchSize": 32,
      "partitionCount": 4,
      "controlQueueVisibilityTimeout": "00:05:00",
      "workItemQueueVisibilityTimeout": "00:05:00",
      "maxConcurrentActivityFunctions": 10,
      "maxConcurrentOrchestratorFunctions": 10,
      "maxQueuePollingInterval": "00:00:30",
      "azureStorageConnectionStringName": "AzureWebJobsStorage",
      "trackingStoreConnectionStringName": "TrackingStorage",
      "trackingStoreNamePrefix": "DurableTask",
      "traceInputsAndOutputs": false,
      "logReplayEvents": false,
      "eventGridTopicEndpoint": "https://topic_name.westus2-1.eventgrid.azure.net/api/events",
      "eventGridKeySettingName":  "EventGridKey",
      "eventGridPublishRetryCount": 3,
      "eventGridPublishRetryInterval": "00:00:30",
      "eventGridPublishEventTypes": ["Started", "Completed", "Failed", "Terminated"]
    }
  }
}

작업 허브 이름은 문자로 시작하고 문자와 숫자로만 구성되어야 합니다.Task hub names must start with a letter and consist of only letters and numbers. 지정되지 않은 경우 함수 앱의 기본 작업 허브 이름은 DurableFunctionsHub 입니다.If not specified, the default task hub name for a function app is DurableFunctionsHub. 자세한 내용은 작업 허브를 참조하세요.For more information, see Task hubs.

속성Property 기본값Default DescriptionDescription
hubNamehubName DurableFunctionsHubDurableFunctionsHub 여러 Durable Functions 애플리케이션이 동일한 스토리지 백 엔드를 사용하더라도 대체 작업 허브 이름을 사용하면 이러한 애플리케이션을 서로 구분할 수 있습니다.Alternate task hub names can be used to isolate multiple Durable Functions applications from each other, even if they're using the same storage backend.
controlQueueBatchSizecontrolQueueBatchSize 3232 제어 큐에서 한 번에 끌어올 메시지의 수입니다.The number of messages to pull from the control queue at a time.
controlQueueBufferThresholdcontrolQueueBufferThreshold 256256 메모리에 한 번에 버퍼링할 수 있는 컨트롤 큐 메시지의 수입니다. 이 시점에 디스패처는 추가 메시지를 큐에서 제거할 때까지 대기합니다.The number of control queue messages that can be buffered in memory at a time, at which point the dispatcher will wait before dequeuing any additional messages.
partitionCountpartitionCount 44 제어 큐에 대한 파티션 수입니다.The partition count for the control queue. 1에서 16 사이의 양의 정수일 수 있습니다.May be a positive integer between 1 and 16.
controlQueueVisibilityTimeoutcontrolQueueVisibilityTimeout 5분5 minutes 큐에서 제거된 제어 큐 메시지의 표시 여부 시간 제한입니다.The visibility timeout of dequeued control queue messages.
workItemQueueVisibilityTimeoutworkItemQueueVisibilityTimeout 5분5 minutes 큐에서 제거된 작업 항목 큐 메시지의 표시 여부 시간 제한입니다.The visibility timeout of dequeued work item queue messages.
maxConcurrentActivityFunctionsmaxConcurrentActivityFunctions 현재 컴퓨터에 있는 프로세서 수의 10배입니다.10X the number of processors on the current machine 단일 호스트 인스턴스에서 동시에 처리할 수 있는 작업 함수는 최대 수입니다.The maximum number of activity functions that can be processed concurrently on a single host instance.
maxConcurrentOrchestratorFunctionsmaxConcurrentOrchestratorFunctions 현재 컴퓨터에 있는 프로세서 수의 10배입니다.10X the number of processors on the current machine 단일 호스트 인스턴스에서 동시에 처리할 수 있는 오케스트레이터 함수의 최대 개수입니다.The maximum number of orchestrator functions that can be processed concurrently on a single host instance.
maxQueuePollingIntervalmaxQueuePollingInterval 30초30 seconds 최대 제어 및 작업 항목 큐 폴링 간격(hh:mm:ss 형식)입니다.The maximum control and work-item queue polling interval in the hh:mm:ss format. 값이 높을수록 메시지 처리 대기 시간이 길어질 수 있습니다.Higher values can result in higher message processing latencies. 값이 낮을수록 스토리지 트랜잭션이 증가하기 때문에 스토리지 비용이 높아질 수 있습니다.Lower values can result in higher storage costs because of increased storage transactions.
azureStorageConnectionStringNameazureStorageConnectionStringName AzureWebJobsStorageAzureWebJobsStorage 기본 Azure Storage 리소스를 관리하는 데 사용되는 Azure Storage 연결 문자열이 있는 앱 설정의 이름입니다.The name of the app setting that has the Azure Storage connection string used to manage the underlying Azure Storage resources.
trackingStoreConnectionStringNametrackingStoreConnectionStringName 기록 및 인스턴스 테이블에 사용할 연결 문자열의 이름입니다.The name of a connection string to use for the History and Instances tables. 지정하지 않으면, connectionStringName(Durable 2.x) 또는 azureStorageConnectionStringName(Durable 1.x) 연결이 사용됩니다.If not specified, the connectionStringName (Durable 2.x) or azureStorageConnectionStringName (Durable 1.x) connection is used.
trackingStoreNamePrefixtrackingStoreNamePrefix trackingStoreConnectionStringName이 지정된 경우 기록 및 인스턴스 테이블에 사용할 접두사입니다.The prefix to use for the History and Instances tables when trackingStoreConnectionStringName is specified. 설정하지 않는 경우 기본 접두사 값은 DurableTask입니다.If not set, the default prefix value will be DurableTask. trackingStoreConnectionStringName을 지정하지 않으면 기록 및 인스턴스 테이블은 hubName 값을 접두사로 사용하고 trackingStoreNamePrefix에 대한 설정은 무시됩니다.If trackingStoreConnectionStringName is not specified, then the History and Instances tables will use the hubName value as their prefix, and any setting for trackingStoreNamePrefix will be ignored.
traceInputsAndOutputstraceInputsAndOutputs falsefalse 함수 호출의 입출력을 추적할지 여부를 나타내는 값입니다.A value indicating whether to trace the inputs and outputs of function calls. 함수 실행 이벤트를 추적할 때의 기본 동작은 함수 호출에 대한 직렬화된 입출력에 바이트 수를 포함하는 것입니다.The default behavior when tracing function execution events is to include the number of bytes in the serialized inputs and outputs for function calls. 이 동작은 로그를 부풀리거나 실수로 중요한 정보를 노출하지 않으면서 입력 및 출력이 어떻게 보일지에 대한 최소한의 정보를 제공합니다.This behavior provides minimal information about what the inputs and outputs look like without bloating the logs or inadvertently exposing sensitive information. 이 속성을 true로 설정하면 기본 함수 로깅이 함수 입출력의 전체 내용을 기록하게 됩니다.Setting this property to true causes the default function logging to log the entire contents of function inputs and outputs.
logReplayEventslogReplayEvents falsefalse Application Insights에 이벤트를 재생하는 오케스트레이션을 작성할 것인지 여부를 나타내는 값입니다.A value indicating whether to write orchestration replay events to Application Insights.
eventGridTopicEndpointeventGridTopicEndpoint Azure Event Grid 사용자 지정 항목 엔드포인트의 URL입니다.The URL of an Azure Event Grid custom topic endpoint. 이 속성이 설정되면 오케스트레이션 수명 주기 알림 이벤트가 이 엔드포인트에 게시됩니다.When this property is set, orchestration life-cycle notification events are published to this endpoint. 이 속성은 앱 설정 해결을 지원합니다.This property supports App Settings resolution.
eventGridKeySettingNameeventGridKeySettingName EventGridTopicEndpoint에서 Azure Event Grid 사용자 지정 항목으로 인증하는 데 사용되는 키를 포함하는 앱 설정의 이름입니다.The name of the app setting containing the key used for authenticating with the Azure Event Grid custom topic at EventGridTopicEndpoint.
eventGridPublishRetryCounteventGridPublishRetryCount 00 Event Grid 항목에 게시가 실패하는 경우 다시 시도 횟수입니다.The number of times to retry if publishing to the Event Grid Topic fails.
eventGridPublishRetryIntervaleventGridPublishRetryInterval 5분5 minutes hh:mm:ss 형식의 Event Grid 게시 재시도 간격입니다.The Event Grid publishes retry interval in the hh:mm:ss format.
eventGridPublishEventTypeseventGridPublishEventTypes Event Grid에 게시할 이벤트 유형 목록입니다.A list of event types to publish to Event Grid. 지정하지 않으면 모든 이벤트 유형이 게시됩니다.If not specified, all event types will be published. 허용되는 값에는 Started, Completed, Failed, Terminated가 포함됩니다.Allowed values include Started, Completed, Failed, Terminated.
useAppLeaseuseAppLease truetrue true로 설정하면, 앱은 작업 허브 메시지를 처리하기 전에 앱 수준 Blob 임대를 확보해야 합니다.When set to true, apps will require acquiring an app-level blob lease before processing task hub messages. 자세한 내용은 재해 복구 및 지역 배포 설명서를 참조하세요.For more information, see the disaster recovery and geo-distribution documentation. v2.3.0부터 사용할 수 있습니다.Available starting in v2.3.0.
useLegacyPartitionManagementuseLegacyPartitionManagement truetrue false로 설정하면, 확장 시 중복 함수 실행 가능성을 줄이는 파티션 관리 알고리즘을 사용합니다. v2.3.0부터 사용할 수 있습니다.When set to false, uses a partition management algorithm that reduces the possibility of duplicate function execution when scaling out. Available starting in v2.3.0. 향후 릴리스에서는 기본 값이 false로 변경됩니다.The default will be changed to false in a future release.
useGracefulShutdownuseGracefulShutdown falsefalse (미리 보기) 정상적인 종료를 사용하도록 설정하여 호스트 종료가 in-process 함수 실행에 실패할 가능성을 줄입니다.(Preview) Enable gracefully shutting down to reduce the chance of host shutdowns failing in-process function executions.

이러한 설정의 대부분은 성능 최적화를 위한 것입니다.Many of these settings are for optimizing performance. 자세한 내용은 성능 및 크기 조정을 참조하세요.For more information, see Performance and scale.

다음 단계Next steps