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 orquestrador pode chamar outra função orquestrador através da 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 e lançar uma exceção, como é previsto pela função de orquestrador pai.

Observação

No PowerShell, há suporte para suborquestrações somente no SDK autônomo: AzureFunctions.PowerShell.Durable.SDK. Veja a diferença entre o SDK autônomo e o SDK interno herdado junto com o guia de migração.

Observação

A versão 4 do modelo de programação Node.js para o Azure Functions está geralmente disponível. O modelo v4 foi concebido para proporcionar uma experiência mais flexível e intuitiva para programadores JavaScript e TypeScript. Para mais informações sobre as diferenças entre v3 e v4, consulte o guia de migração.

Nos seguintes excertos de código, o JavaScript (PM4) denota 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 orquestradora pode ser usada as-is 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 usando a API "call-sub-orchestrator".

O exemplo a seguir mostra como executar várias funções do orchestrator ao mesmo tempo:

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

    // ...
}

Observação

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 .

Observação

As suborquestrações devem ser configuradas na mesma aplicação de função que a orquestração principal. 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