Partilhar via


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