你当前正在访问 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: ...
}

此业务流程协调程序函数可以按现样用于一次性设备预配,也可以用作大型业务流程的一部分。 在后一种情况下,父业务流程协调程序函数可以使用 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 功能主题。

后续步骤