Condividi tramite


Orchestrazioni secondarie in Durable Functions (Funzioni di Azure)

Oltre a chiamare funzioni di attività, le funzioni dell'agente di orchestrazione possono chiamare altre funzioni dell'agente di orchestrazione. Ad esempio, è possibile costruire una più ampia orchestrazione a partire da una libreria di funzioni di orchestratori più piccole. In alternativa, è possibile eseguire più istanze di una funzione dell'agente di orchestrazione in parallelo.

Una funzione dell'agente di orchestrazione può chiamare un'altra funzione dell'agente di orchestrazione usando l'API "call-sub-orchestrator ". L'articolo Gestione degli errori e compensazione contiene altre informazioni sui tentativi automatici.

Le funzioni di sotto-orchestrazione si comportano esattamente come le funzioni di attività dal punto di vista del chiamante. Possono restituire un valore e generare un'eccezione quando la funzione dell'agente di orchestrazione padre li anticipa.

Annotazioni

Le orchestrazioni secondarie non sono ancora supportate in PowerShell.

Annotazioni

La versione 4 del modello di programmazione Node.js per Funzioni di Azure è disponibile a livello generale. Il nuovo modello v4 è progettato per offrire un'esperienza più flessibile e intuitiva per gli sviluppatori JavaScript e TypeScript. Altre informazioni sulle differenze tra v3 e v4 sono disponibili nella guida alla migrazione.

Nei frammenti di codice seguenti JavaScript (PM4) indica il modello di programmazione V4, la nuova esperienza.

Esempio

L'esempio seguente illustra uno scenario IoT ("Internet delle cose") in cui è necessario effettuare il provisioning di più dispositivi. La funzione seguente rappresenta il flusso di lavoro di provisioning che deve essere eseguito per ogni 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: ...
}

Questa funzione di orchestrazione può essere usata as-is per il provisioning di dispositivi una tantum oppure può far parte di un'orchestrazione più ampia. In quest'ultimo caso, la funzione dell'agente di orchestrazione padre può pianificare istanze di DeviceProvisioningOrchestration usando l'API "call-sub-orchestrator".

L'esempio seguente illustra come eseguire più funzioni dell'agente di orchestrazione contemporaneamente:

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

    // ...
}

Annotazioni

Gli esempi C# precedenti sono relativi a Durable Functions 2.x. Per Durable Functions 1.x, è necessario usare DurableOrchestrationContext anziché IDurableOrchestrationContext. Per altre informazioni sulle differenze tra le versioni, vedere l'articolo Versioni di Durable Functions .

Annotazioni

Le orchestrazioni secondarie devono essere definite nella stessa funzione app dell'orchestrazione padre. Se è necessario chiamare e attendere orchestrazioni in un'altra app di funzioni, è consigliabile usare il supporto predefinito per le API HTTP e il modello di consumo con polling HTTP 202. Per altre informazioni, vedere l'argomento Funzionalità HTTP .

Passaggi successivi