你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Durable Functions 中的子业务流程 (Azure Functions)

除了调用活动函数外,协调器函数还可以调用其他协调器函数。 例如,可以从较小的编排器函数库中构建更大的编排。 或者,可以并行运行业务流程协调程序函数的多个实例。

编排器函数可以使用 “call-sub-orchestrator” API 调用另一个编排器函数。 错误处理和补偿文章提供了有关自动重试的详细信息。

从调用方的角度来看,子协调程序函数的行为就像活动函数一样。 它们可以返回一个值并引发异常,因为父业务流程协调程序函数可以预见它们。

注释

PowerShell 尚不支持子业务流程。

注释

适用于 Azure Functions 的 Node.js 编程模型版本 4 现已正式发布。 新版 v4 模型旨在为 JavaScript 和 TypeScript 开发人员提供更为灵活和直观的体验。 在迁移指南中详细了解 v3 和 v4 之间的差异。

在以下代码片段中,JavaScript (PM4) 表示编程模型 V4,即新体验。

示例:

以下示例演示了需要预配多个设备的 IoT(“物联网”)方案。 以下函数表示需要为每个设备执行的预配工作流:

public static async Task DeviceProvisioningOrchestration(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    string deviceId = context.GetInput<string>();

    // Step 1: Create an installation package in blob storage and return a SAS URL.
    Uri sasUrl = await context.CallActivityAsync<Uri>("CreateInstallationPackage", deviceId);

    // Step 2: Notify the device that the installation package is ready.
    await context.CallActivityAsync("SendPackageUrlToDevice", Tuple.Create(deviceId, sasUrl));

    // Step 3: Wait for the device to acknowledge that it has downloaded the new package.
    await context.WaitForExternalEvent<bool>("DownloadCompletedAck");

    // Step 4: ...
}

此业务流程协调程序函数可用于一次性设备预配 as-is,也可以是较大业务流程的一部分。 在后一种情况下,父协调者函数可以通过“call-sub-orchestrator” API调度DeviceProvisioningOrchestration的实例。

以下示例演示如何同时运行多个业务流程协调程序函数:

[FunctionName("ProvisionNewDevices")]
public static async Task ProvisionNewDevices(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    string[] deviceIds = await context.CallActivityAsync<string[]>("GetNewDeviceIds");

    // Run multiple device provisioning flows in parallel
    var provisioningTasks = new List<Task>();
    foreach (string deviceId in deviceIds)
    {
        Task provisionTask = context.CallSubOrchestratorAsync("DeviceProvisioningOrchestration", deviceId);
        provisioningTasks.Add(provisionTask);
    }

    await Task.WhenAll(provisioningTasks);

    // ...
}

注释

前面的 C# 示例适用于 Durable Functions 2.x。 对于 Durable Functions 1.x,必须使用 DurableOrchestrationContext 而不是 IDurableOrchestrationContext。 有关版本之间差异的详细信息,请参阅 Durable Functions 版本一文。

注释

子协调流程必须在与父协调流程相同的函数应用中定义。 如果需要在另一个函数应用中调用并等待业务流程,请考虑使用对 HTTP API 和 HTTP 202 轮询使用者模式的内置支持。 有关详细信息,请参阅 HTTP 功能 主题。

后续步骤