Compartir a través de


Suborquestaciones en Durable Functions (Azure Functions)

Además de llamar a funciones de actividad, las funciones de orquestador pueden llamar a otras funciones de orquestador. Por ejemplo, puede crear una orquestación más grande a partir de una biblioteca de funciones de orquestador más pequeñas. O bien, puede ejecutar varias instancias de una función de orquestador en paralelo.

Una función de orquestador puede llamar a otra función de orquestador mediante la API "call-sub-orchestrator". El artículo Control de errores y compensación tiene más información sobre el reintento automático.

Las funciones de sub orchestrator se comportan igual que las funciones de actividad desde la perspectiva del autor de la llamada. Pueden devolver un valor y producir una excepción a medida que la función de orquestador principal las anticipa.

Nota:

Todavía no se admiten sub-orquestaciones en PowerShell.

Nota:

La versión 4 del modelo de programación de Node.js para Azure Functions está disponible de forma general. El nuevo modelo v4 está diseñado para que los desarrolladores de JavaScript y TypeScript tengan una experiencia más flexible e intuitiva. Obtenga más información sobre las diferencias entre v3 y v4 en la guía de migración.

En los siguientes fragmentos de código, JavaScript (PM4) denota el modelo de programación V4, la nueva experiencia.

Ejemplo

En el ejemplo siguiente se muestra un escenario de IoT ("Internet de las cosas") en el que hay varios dispositivos que deben aprovisionarse. La función siguiente representa el flujo de trabajo de aprovisionamiento que debe ejecutarse para cada dispositivo:

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

Esta función de orquestador se puede usar as-is para el aprovisionamiento de un único dispositivo o puede formar parte de una orquestación más amplia. En este último caso, la función de orquestador principal puede programar instancias de DeviceProvisioningOrchestration mediante la API "call-sub-orchestrator".

En el ejemplo siguiente se muestra cómo ejecutar varias funciones de orquestador al mismo tiempo:

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

    // ...
}

Nota:

Los ejemplos de C# anteriores corresponden a Durable Functions 2.x. En el caso de Durable Functions 1.x, debe usar DurableOrchestrationContext en lugar de IDurableOrchestrationContext. Para más información sobre las diferencias entre versiones, consulte el artículo Versiones de Durable Functions.

Nota:

Las suborquestaciones deben definirse en la misma aplicación de funciones que la orquestación principal. Si necesita llamar a y esperar orquestaciones en otra aplicación de funciones, considere la posibilidad de usar la compatibilidad integrada con las API HTTP y el patrón de consumidor de sondeo HTTP 202. Para obtener más información, consulte el tema Características HTTP .

Pasos siguientes