Organizowanie podrzędne w Durable Functions (Azure Functions)Sub-orchestrations in Durable Functions (Azure Functions)

Oprócz wywoływania funkcji działania, funkcje programu Orchestrator mogą wywoływać inne funkcje programu Orchestrator.In addition to calling activity functions, orchestrator functions can call other orchestrator functions. Można na przykład utworzyć większą organizację poza biblioteką mniejszych funkcji programu Orchestrator.For example, you can build a larger orchestration out of a library of smaller orchestrator functions. Można też uruchomić wiele wystąpień funkcji programu Orchestrator równolegle.Or you can run multiple instances of an orchestrator function in parallel.

Funkcja programu Orchestrator może wywoływać inną funkcję programu Orchestrator przy użyciu CallSubOrchestratorAsync CallSubOrchestratorWithRetryAsync metod w programie .NET lub callSubOrchestrator metod w callSubOrchestratorWithRetry języku JavaScript.An orchestrator function can call another orchestrator function using the CallSubOrchestratorAsync or the CallSubOrchestratorWithRetryAsync methods in .NET, or the callSubOrchestrator or callSubOrchestratorWithRetry methods in JavaScript. W artykule dotyczącym obsługi błędów & wynagrodzenie zawiera więcej informacji na temat automatycznego ponawiania próby.The Error Handling & Compensation article has more information on automatic retry.

Funkcje programu sub-Orchestrator zachowują się podobnie jak funkcje działania z perspektywy obiektu wywołującego.Sub-orchestrator functions behave just like activity functions from the caller's perspective. Mogą zwrócić wartość, zgłosić wyjątek i może oczekiwać przez nadrzędną funkcję programu Orchestrator.They can return a value, throw an exception, and can be awaited by the parent orchestrator function.

Uwaga

Podzbiory są obecnie obsługiwane w programie .NET i JavaScript.Sub-orchestrations are currently supported in .NET and JavaScript.

PrzykładExample

Poniższy przykład ilustruje scenariusz IoT ("Internet rzeczy"), w którym istnieje wiele urządzeń, które muszą być obsługiwane.The following example illustrates an IoT ("Internet of Things") scenario where there are multiple devices that need to be provisioned. Poniższa funkcja reprezentuje przepływ pracy aprowizacji, który należy wykonać dla każdego urządzenia:The following function represents the provisioning workflow that needs to be executed for each device:

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: ...
}

Ta funkcja programu Orchestrator może być używana jako — dla jednorazowej aprowizacji urządzeń lub może być częścią większej aranżacji.This orchestrator function can be used as-is for one-off device provisioning or it can be part of a larger orchestration. W tym drugim przypadku nadrzędna funkcja programu Orchestrator może planować wystąpienia DeviceProvisioningOrchestration przy użyciu CallSubOrchestratorAsync interfejsu API (.NET) lub callSubOrchestrator (JavaScript).In the latter case, the parent orchestrator function can schedule instances of DeviceProvisioningOrchestration using the CallSubOrchestratorAsync (.NET) or callSubOrchestrator (JavaScript) API.

Oto przykład, w którym pokazano, jak uruchomić wiele funkcji programu Orchestrator równolegle.Here is an example that shows how to run multiple orchestrator functions in parallel.

[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);

    // ...
}

Uwaga

Poprzednie przykłady w języku C# są przeznaczone dla Durable Functions 2. x.The previous C# examples are for Durable Functions 2.x. W przypadku Durable Functions 1. x należy użyć DurableOrchestrationContext zamiast IDurableOrchestrationContext .For Durable Functions 1.x, you must use DurableOrchestrationContext instead of IDurableOrchestrationContext. Aby uzyskać więcej informacji o różnicach między wersjami, zobacz artykuł dotyczący wersji Durable Functions .For more information about the differences between versions, see the Durable Functions versions article.

Uwaga

Podaranżacje muszą być zdefiniowane w tej samej aplikacji funkcji co w przypadku aranżacji nadrzędnej.Sub-orchestrations must be defined in the same function app as the parent orchestration. Jeśli konieczne jest wywołanie i oczekiwanie na aranżację w innej aplikacji funkcji, należy rozważyć użycie wbudowanej obsługi interfejsów API protokołu HTTP i wzorca klienta sondowania HTTP 202.If you need to call and wait for orchestrations in another function app, consider using the built-in support for HTTP APIs and the HTTP 202 polling consumer pattern. Aby uzyskać więcej informacji, zobacz temat funkcje protokołu HTTP .For more information, see the HTTP Features topic.

Następne krokiNext steps