Suborquestrações em funções duráveis (Azure Functions)

Além de chamar funções de atividade, as funções do orquestrador podem chamar outras funções do orquestrador. Por exemplo, você pode criar uma orquestração maior a partir de uma biblioteca de funções de orquestrador menores. Ou você pode executar várias instâncias de uma função orquestradora em paralelo.

Uma função orchestrator pode chamar outra função orchestrator usando a API "call-sub-orchestrator". O artigo Tratamento de erros & Compensação tem mais informações sobre repetição automática.

As funções do suborquestrador comportam-se como funções de atividade da perspetiva do chamador. Eles podem retornar um valor, lançar uma exceção e podem ser aguardados pela função orquestradora pai.

Nota

As suborquestrações ainda não são suportadas no PowerShell.

Nota

A versão 4 do modelo de programação Node.js para o Azure Functions está geralmente disponível. O novo modelo v4 foi projetado para ter uma experiência mais flexível e intuitiva para desenvolvedores de JavaScript e TypeScript. Saiba mais sobre as diferenças entre v3 e v4 no guia de migração.

Nos trechos de código a seguir, JavaScript (PM4) indica o modelo de programação V4, a nova experiência.

Exemplo

O exemplo a seguir ilustra um cenário de IoT ("Internet das Coisas") em que há vários dispositivos que precisam ser provisionados. A função a seguir representa o fluxo de trabalho de provisionamento que precisa ser executado 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: ...
}

Essa função de orquestrador pode ser usada como está para provisionamento de dispositivos únicos ou pode fazer parte de uma orquestração maior. Neste último caso, a função orquestrador pai pode agendar instâncias de DeviceProvisioningOrchestration uso da API "call-sub-orchestrator".

Aqui está um exemplo que mostra como executar várias funções do orquestrador em paralelo.

[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

Os exemplos anteriores de C# são para Durable Functions 2.x. Para Durable Functions 1.x, você deve usar DurableOrchestrationContext em vez de IDurableOrchestrationContext. Para obter mais informações sobre as diferenças entre versões, consulte o artigo Durable Functions versions .

Nota

As suborquestrações devem ser definidas no mesmo aplicativo de função que a orquestração pai. Se você precisar chamar e aguardar orquestrações em outro aplicativo de função, considere usar o suporte interno para APIs HTTP e o padrão de consumidor de sondagem HTTP 202. Para obter mais informações, consulte o tópico Recursos HTTP.

Próximos passos