Поделиться через


Подоркестрации в Durable Functions (Функции Azure)

Помимо вызова функций активности, функции оркестратора могут вызывать другие функции оркестратора. Например, можно создать большую оркестрацию из библиотеки небольших функций оркестратора. Кроме того, можно параллельно запускать несколько экземпляров функции оркестратора.

Функция оркестратора может вызывать другую функцию оркестратора с помощью API call-sub-orchestrator . В статье об обработке ошибок и компенсации содержатся дополнительные сведения о автоматическом повторе.

Функции под оркестратора работают так же, как функции действий с точки зрения вызывающего пользователя. Они могут возвращать значение и вызывать исключение, так как родительская функция оркестратора предполагает это.

Замечание

В PowerShell вложенные оркестрации поддерживаются только в автономной версии SDK: AzureFunctions.PowerShell.Durable.SDK Ознакомьтесь с разницей между автономным пакетом SDK и устаревшим встроенным пакетом SDK вместе с руководством по миграции.

Замечание

Общедоступна версия 4 модели программирования Node.js для функций Azure. Новая модель версии 4 предназначена для более гибкого и интуитивно понятного интерфейса для разработчиков JavaScript и TypeScript. Узнайте больше о различиях между версиями 3 и 4 в руководстве по миграции.

В следующих фрагментах кода JavaScript (PM4) обозначает модель программирования версии 4, новый интерфейс.

Пример

В следующем примере показан сценарий Интернета вещей ("Интернет вещей"), где есть несколько устройств, которые должны быть подготовлены. Следующая функция представляет рабочий процесс подготовки, который необходимо выполнить для каждого устройства:

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

Эту функцию оркестратора можно использовать as-is для одноразовой настройки устройств или она может быть частью более крупной оркестрации. В последнем случае родительская функция оркестратора может запланировать экземпляры DeviceProvisioningOrchestration с помощью API call-sub-orchestrator .

В следующем примере показано, как одновременно выполнять несколько функций оркестратора:

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

    // ...
}

Замечание

Предыдущие примеры C# предназначены для устойчивых функций 2.x. Для Durable Functions 1.x необходимо использовать DurableOrchestrationContext вместо IDurableOrchestrationContext. Дополнительные сведения о различиях между версиями см. в статье о версиях устойчивых функций .

Замечание

Подоркестрации должны быть определены в том же функциональном приложении, что и родительская оркестрация. Если вам нужно вызвать и ждать оркестрации в другом функциональном приложении, рассмотрите использование встроенной поддержки API HTTP и шаблона опроса HTTP 202. Дополнительные сведения см. в разделе "Функции HTTP ".

Дальнейшие шаги