Durable Functions (Azure Functions) 的绑定

Durable Functions 扩展引入了三个触发器绑定,用于控制业务流程协调程序、实体和活动函数的执行。 它还引入了输出绑定,充当 Durable Functions 运行时的客户端。

本文讨论这四个绑定的使用并提供代码示例。 它还提供有关 host.json中的 Durable Functions 配置属性的信息,该文件包含影响函数应用中所有函数的设置的元数据文件。

请确保在文章顶部选择 Durable Functions 开发语言。

Durable Functions 支持 Azure Functions 的两个版本的 Python 编程模型。 由于 Python v2 是推荐的版本,因此本文中的示例仅支持此版本。

先决条件

  • Durable Functions SDK,即 Python 包索引 (PyPI) 中的包 azure-functions-durable,版本 1.2.2 或更高版本
  • 扩展包 版本 4.x(或更高版本),已在 host.json 项目文件中设置

可以在 Durable Functions SDK for Python 存储库中提供反馈和建议。

业务流程触发器

可以使用协调触发器开发 持久化协调器函数。 此触发器将在新的业务流程实例被调度时,以及现有的业务流程实例接收到事件时执行。 可以触发业务流程协调程序函数的事件示例包括持久计时器过期、活动函数响应和外部客户端引发的事件。

在 .NET 中开发函数时,可以使用 OrchestrationTriggerAttribute .NET 属性配置业务流程触发器。

对于 Java,可以使用 @DurableOrchestrationTrigger 批注来配置业务流程触发器。

使用 Node.js 编程模型版本 4 开发函数时,请从app模块导入@azure/functions npm对象。 然后,直接在函数代码中调用 app.orchestration Durable Functions API 的方法。 此方法将协调器函数注册到 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 操作。 此外,请务必确保此线程不会执行任何异步工作,除非等待特定于 Durable Functions 的任务类型。
  • 毒性消息处理:编排触发器中不支持毒性消息。
  • 消息可见性:业务流程触发器消息已取消排队,并在可配置的持续时间内保持不可见。 只要函数应用正常运行,这些消息的可见性就会自动更新。
  • 返回值:返回值序列化为 JSON,并保存到 Azure 表存储中的业务流程历史记录表。 业务流程客户端绑定可以查询这些值,后文会对此进行介绍。

警告

业务流程协调程序函数不应使用业务流程触发器绑定以外的任何输入或输出绑定。 使用其他绑定可能会导致 Durable Task 扩展出现问题,因为这些绑定可能不符合单线程和 I/O 规则。 如果要使用其他绑定,请将它们添加到从协调器函数调用的活动函数。 有关业务流程协调程序函数的编码约束的详细信息,请参阅 Orchestrator 函数代码约束

警告

绝不应该声明业务流程协调程序函数 async

触发器使用情况

业务流程触发器绑定同时支持输入和输出。 下面是有关输入和输出处理的一些说明:

  • 输入:可以调用具有输入的编排触发器。 输入是通过上下文输入对象访问的。 所有输入都必须是 JSON 可序列化的。
  • 输出:业务流程触发器支持输出和输入值。 函数的返回值用于分配输出值。 返回值必须是 JSON 可序列化的。

触发器示例

以下代码提供了基本 Hello World 业务流程协调程序函数的示例。 此示例业务流程协调程序不计划任何任务。

用于定义触发器的属性取决于是在 与 Functions 主机进程相同的进程中 运行 C# 函数,还是在 独立工作进程中运行 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对象。 然后,直接在函数代码中调用 app.activity Durable Functions API 的方法。

若要定义活动触发器,请在 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 事件中心。

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),从而可以完全访问 Durable Functions 支持的所有编排客户端 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对象。 然后,直接在函数代码中调用 app.entity Durable Functions API 的方法。

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 属性绑定到实体客户端。

注释

还可以使用 [DurableClientAttribute] 绑定到 编排客户端

与其注册实体客户端,不如使用 signalEntitycallEntity 从任何已注册的函数调用实体触发器方法。

  • 在队列触发的函数中,可以使用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.json中的 Durable Functions 配置属性的信息。 有关 host.json中的常规设置的信息,请参阅 Azure Functions 1.x 的host.json 参考 Azure Functions 2.x 及更高版本的host.json 参考

Durable Functions 的配置设置。

注释

Azure Functions 运行时的所有版本均支持 Durable 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 时,可用的设置不变,但 durableTask 部分位于 host.json 配置的根目录,而不是位于 下的字段。

{
 "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,
    },
    "notifications": {
      "eventGrid": {
        "topicEndpoint": "https://topic_name.chinanorth2-1.eventgrid.chinacloudapi.cn/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
  }
 }
}
资产 默认值 DESCRIPTION
集线器名称 TestHubName (v1.x 中的 DurableFunctionsHub) 存储函数应用的当前状态的中心的名称。 任务中心名称必须以字母开头且只能包含字母和数字。 如果未指定名称,则使用默认值。 备用任务中心名称可用于将多个 Durable Functions 应用程序彼此隔离,即使它们使用相同的存储后端也是如此。 有关详细信息,请参阅任务中心
defaultVersion 要分配给新协调实例的默认版本。 指定版本时,新的编排实例将永久与该版本值相关联。 编排版本控制功能使用此设置,以实现通常会引入中断性变更的零停机时间部署等场景。 可以将任何字符串值用于版本。
版本匹配策略 当前或更早版本 一个值,该值指定在加载编排器函数时如何匹配编排版本。 有效值为:NoneStrictCurrentOrOlder。 有关详细说明,请参阅 编排版本控制
versionFailureStrategy 拒绝 指定编排版本与当前 defaultVersion 值不匹配时会发生什么情况的值。 有效值为 RejectFail。 有关详细说明,请参阅 编排版本控制
controlQueueBatchSize 32 要从控制队列中一次性拉取的消息数。
控制队列缓冲阈值 适用于 Python 的消耗计划:32
其他语言的消耗计划:128
专用或高级计划:256
可以在内存中同时缓冲的控制队列消息数量。 达到指定数字后,调度程序会等待,然后再处理其他消息。 在某些情况下,减少此值可以显著减少内存消耗。
分区数量 4 控制队列的分区计数。 此值必须是介于 1 和 16 之间的正整数。 更改此值需要配置新的任务中心。
控制队列可见性超时设置 00:05:00 hh:mm:ss 格式的出队控制队列消息的可见性超时。
工作项队列可见性超时 00:05:00 出队工作项队列消息的可见性超时,采用 hh:mm:ss 格式。
自动获取大型消息 (FetchLargeMessagesAutomatically) 一个值,用于指定是否在编排状态查询中检索大消息。 如果设置是 true,将检索超出队列大小限制的大型消息。 当此设置为 false时,将检索每个大型消息所对应的 Blob URL。
最大并发活动函数 消耗计划:10
专用或高级计划:当前计算机上的处理器数 10 倍
可以在单个主机实例上并发处理的活动函数的最大数目。
最大并发编排器功能数 消耗计划: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 存储资源。 提供单个应用设置时,它应该是一个 Azure 存储连接字符串。
trackingStoreConnectionName (v2.7.0 及更高版本)
trackingStoreConnectionStringName
应用设置或设置集合的名称,该集合指定如何连接到历史记录和实例表,这些表存储有关业务流程实例的执行历史记录和元数据。 提供单个应用设置时,它应该是一个 Azure 存储连接字符串。 如果未指定设置,将使用 connectionStringName 值 (v2.x) 或 azureStorageConnectionStringName 值 (v1.x) 连接。
trackingStoreNamePrefix 指定 trackingStoreConnectionStringName 时用于“历史记录”和“实例”表的前缀。 如果未指定前缀,则使用默认值 DurableTask 。 如果 trackingStoreConnectionStringName 未指定,则 History 和 Instances 表使用该值 hubName 作为其前缀,trackingStoreNamePrefix 的设置将被忽略。
跟踪输入和输出 一个值,该值指示是否跟踪函数调用的输入和输出。 跟踪函数执行事件时,默认行为是包含函数调用的序列化输入和输出中的字节数。 此行为提供有关输入和输出的最小信息,以便不会膨胀日志或无意中公开敏感信息。 当此属性为 true此属性时,将记录函数输入和输出的全部内容。
traceReplayEvents 一个指示是否将编排重播事件写入 Application Insights 的值。
日志重放事件 一个值,该值指示是否在应用程序日志中记录重播的执行。
事件网格主题端点 Azure 事件网格自定义主题终结点的 URL。 设置此属性时,业务流程生命周期通知事件将发布到此终结点。 此属性支持应用程序设置的解决。
eventGridKeySettingName (事件网格密钥设置名称) 应用设置的名称,其中包含用于在 URL 中使用事件网格自定义主题进行身份验证的 EventGridTopicEndpoint 密钥。
事件网格发布重试次数 (eventGridPublishRetryCount) 0 发布到事件网格主题失败时要重试的次数。
事件网格发布重试间隔 (eventGridPublishRetryInterval) 00:05:00 事件网格发布重试间隔采用 hh:mm:ss 格式。
事件网格发布事件类型 要发布到事件网格的事件类型列表。 如果未指定任何类型,则发布所有事件类型。 允许的值包括StartedCompletedFailedTerminated
extendedSessionsEnabled 一个值,指定是否缓存会话编排器和实体函数会话。
扩展会话空闲超时(以秒为单位) 30 空闲编排器或实体函数在卸载之前保留在内存中的秒数。 此设置仅在 extendedSessionsEnabled 设置为 true 时才使用。
useAppLease 一个值,该值指示应用在处理任务中心消息之前是否必须获取应用级 Blob 租约。 有关详细信息,请参阅 Durable Functions 中的灾难恢复和异地分发。 此设置从 v2.3.0 开始可用。
使用传统分区管理 一个值,指定要使用的分区管理算法的类型。 如果设置为 false此设置,则使用一种算法,可减少横向扩展时重复函数执行的可能性。此设置从 v2.3.0 开始可用。 不建议将此值设置为true
useTablePartitionManagement 在 v3.x 中:true
在 v2.x 中: false
一个值,指定要使用的分区管理算法的类型。 如果设置是 true,则使用一种旨在降低成本的算法,用于降低 Azure 存储 v2 帐户的成本。 此设置从 WebJobs.Extensions.DurableTask v2.10.0 开始可用。 将此设置用于托管标识需要 WebJobs.Extensions.DurableTask v3.x 或更高版本,或者 Worker.Extensions.DurableTask v1.2.x 或更高版本。
useGracefulShutdown (预览版)一个值,指示是否正常关闭,以减少由于主机关闭而导致进程内函数执行失败的可能性。
实体操作最大批处理大小 消耗计划:50
专用或高级计划:5,000
批处理形式处理的最大实体操作数。 如果此值为 1,则会禁用批处理,并且每个操作消息将由单独的函数调用处理。 此设置从 v2.6.1 开始可用。
storeInputsInOrchestrationHistory 一个值,指定如何存储输入。 如果设置是 true,Durable Task Framework 会在 History 表中保存活动输入,并且活动函数输入显示在业务流程历史记录查询结果中。
最大Grpc消息大小(字节) 4,194,304 一个整数值,该值设置泛型远程过程调用(gRPC)客户端可以接收的消息的最大大小(以字节为单位)。 实现 DurableTaskClient 使用 gRPC 客户端来管理编排实例。 此设置适用于 Durable Functions .NET 隔离工作器和 Java 应用。
grpcHttpClientTimeout 00:01:40 在 Durable Functions 中,gRPC 客户端使用的 HTTP 客户端的超时时间为 hh:mm:ss 格式。 客户端当前支持 .NET 独立辅助角色应用 (.NET 6 及更高版本) 和 Java 应用。
队列客户端消息编码 UTF8 Azure 队列存储消息的编码策略。 有效策略是 Unicode 转换格式 -8 位 (UTF8) 和 Base64。 使用 Microsoft.Azure.WebJobs.Extensions.DurableTask 3.4.0 或更高版本或 Microsoft.Azure.Functions.Worker.Extensions.DurableTask 1.7.0 或更高版本时,此设置适用。

许多此类设置用于优化性能。 有关详细信息,请参阅性能和缩放

后续步骤