Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Funkcje koordynatora mogą wywoływać inne funkcje orkiestratora jako podorkiestracje. Orkiestracja podrzędna jest uruchamiana jako element podrzędny koordynatora wywołującego (nadrzędnego) i zachowuje się jak działanie z perspektywy obiektu wywołującego: może zwracać wartość, zgłaszać wyjątki przechwycone przez element nadrzędny i obsługiwać automatyczne ponawianie.
Kiedy należy używać podaranżacji
W razie potrzeby należy użyć podaranżacji:
- Tworzenie wielokrotnego użytku bloków konstrukcyjnych dla przepływów pracy: Wyodrębnij wieloetapowy przepływ pracy do własnego orkiestratora, tak aby wiele nadrzędnych orkiestracji mogło go wywoływać.
- Równoległe orkiestracje rozproszone: Zaplanuj wiele wystąpień tego samego orkiestratora jednocześnie i poczekaj na ich zakończenie.
- Organizowanie złożonych przepływów pracy: Podziel dużą aranżację na nazwane, testowalne elementy zamiast jednej długiej funkcji.
Uwaga / Notatka
Orkiestracje podrzędne muszą być zdefiniowane w tej samej aplikacji co orkiestracja nadrzędna. Aby wywołać orkiestracje w innej aplikacji, zamiast tego użyj wzorca sondowania HTTP 202. Aby uzyskać więcej informacji, zobacz Funkcje HTTP.
W tym artykule:
- Definiowanie pod-orkiestracji — przykład konfigurowania pojedynczego urządzenia
- Równoległe uruchamianie podorkiestracji — wzorzec typu fan-out z identyfikatorami instancji deterministycznych
Uwaga / Notatka
W programie PowerShell orkiestracje podrzędne są obsługiwane tylko w autonomicznym zestawie SDK: AzureFunctions.PowerShell.Durable.SDK. Różnice między autonomicznym zestawem SDK i starszym wbudowanym zestawem SDK można znaleźć w przewodniku migracji.
Definiowanie pod-orchestracji
Poniższy przykład ilustruje scenariusz IoT, w którym należy skonfigurować wiele urządzeń. Funkcja reprezentuje przepływ pracy konfiguracji uruchamiany dla każdego urządzenia:
Model izolowanego pracownika
public static async Task DeviceProvisioningOrchestration(
[OrchestrationTrigger] TaskOrchestrationContext context, string deviceId)
{
// 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", (deviceId, sasUrl));
// Step 3: Wait for the device to acknowledge that it has downloaded the new package.
await context.WaitForExternalEvent<bool>("DownloadCompletedAck");
// Step 4: ...
}
Model w trakcie przetwarzania
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: ...
}
using Microsoft.DurableTask;
[DurableTask]
public class DeviceProvisioningOrchestration : TaskOrchestrator<string, object?>
{
public override async Task<object?> RunAsync(TaskOrchestrationContext context, string deviceId)
{
// 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", (deviceId, sasUrl.ToString()));
// Step 3: Wait for the device to acknowledge that it has downloaded the new package.
await context.WaitForExternalEvent<bool>("DownloadCompletedAck");
// Step 4: ...
return null;
}
}
Ta funkcja orkiestratora może działać autonomicznie dla jednorazowej konfiguracji urządzenia albo nadrzędny orkiestrator może zaplanować ją jako pod-orkiestrację przy użyciu interfejsu API call-sub-orchestrator.
Równoległe uruchamianie podorkiestracji
W poniższym przykładzie pokazano orkiestrator nadrzędny, który równolegle obsługuje wiele podorkiestracji. Niektóre języki używają deterministycznego identyfikatora wystąpienia podrzędnego (pochodzącego z identyfikatora wystąpienia elementu nadrzędnego i indeksu), aby zapobiec zduplikowanym wystąpieniom pod-orkiestracji podczas ponownego odtwarzania.
Model izolowanego pracownika
[Function("ProvisionNewDevices")]
public static async Task ProvisionNewDevices(
[OrchestrationTrigger] TaskOrchestrationContext 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);
// ...
}
Model w trakcie przetwarzania
[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);
// ...
}
Następne kroki
using Microsoft.DurableTask;
[DurableTask]
public class ProvisionNewDevices : TaskOrchestrator<object?, object?>
{
public override async Task<object?> RunAsync(TaskOrchestrationContext context, object? input)
{
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);
return null;
}
}