Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Orchestrator işlevleri diğer orchestrator işlevlerini alt düzenleme olarak çağırabilir. Alt orkestrasyon, çağıran (ebeveyn) orkestratörün alt öğesi olarak çalışır ve çağıranın perspektifinden bir etkinlik gibi davranır: bir değer döndürebilir, ebeveyn tarafından yakalanan hataları fırlatabilir ve otomatik yeniden denemeyi destekleyebilir.
Alt orkestrasyonlar ne zaman kullanılır?
İhtiyacınız olduğunda alt orkestrasyonlar kullanın.
- Yeniden kullanılabilir iş akışı yapı taşları oluşturun: Birden çok üst orkestrasyonun çağırabilmesi için çok adımlı bir iş akışını kendi orkestratörüne ayıklayın.
- Orkestrasyonları paralel olarak dağıtın: Aynı orkestratörün birçok örneğini eşzamanlı olarak zamanlayın ve hepsinin tamamlanmasını bekleyin.
- Karmaşık iş akışlarını düzenleme: Büyük bir düzenlemeyi tek bir uzun işlev yerine adlandırılmış, test edilebilir parçalara ayırın.
Uyarı
Alt düzenlemelerin üst düzenlemeyle aynı uygulamada tanımlanması gerekir. Farklı bir uygulamada orkestrasyonu çağırmak için, bunun yerine HTTP 202 yoklama desenini kullanın. Daha fazla bilgi için bkz. HTTP özellikleri.
Bu makalede:
- Alt orkestrasyon tanımlama — Tek cihaz hazırlama örneği
- Alt orkestrasyonları paralel olarak çalıştırma — Belirlenimci örnek kimlikleriyle açılma deseni
Uyarı
PowerShell'de alt orkestrasyonlar yalnızca tek başına SDK'da desteklenir: AzureFunctions.PowerShell.Durable.SDK. Tek başına SDK ile eski yerleşik SDK arasındaki farklar için geçiş kılavuzuna bakın.
Alt orkestrasyon tanımlama
Aşağıdaki örnekte, birden çok cihazın ayarlanması gereken bir IoT senaryosu gösterilmektedir. işlevi, her cihaz için çalışan kurulum iş akışını temsil eder:
Yalıtılmış çalışan modeli
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: ...
}
İşlem içi model
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;
}
}
Bu orchestrator işlevi tek seferlik cihaz kurulumu için tek başına çalışabilir veya bir üst orchestrator bunu call-sub-orchestrator API'sini kullanarak alt orkestrasyon olarak zamanlayabilir.
Alt orkestrasyonları paralel olarak çalıştırma
Aşağıdaki örnekte, birden çok alt düzenlemeyi paralel olarak destekleyen bir üst düzenleyici gösterilmektedir. Bazı diller, yeniden yürütmede yinelenen alt düzenlemeleri önlemek için belirlenimci bir alt örnek kimliği (üst öğe örnek kimliğinden ve dizinden türetilir) kullanır.
Yalıtılmış çalışan modeli
[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);
// ...
}
İşlem içi model
[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);
// ...
}
Sonraki Adımlar
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;
}
}