Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Az Orchestrator függvények más vezénylési függvényeket is meghívhatnak részvezénylésként. Az alvezénylés a hívó (szülő) vezénylő gyermekeként fut, és a hívó szemszögéből úgy viselkedik, mint egy tevékenység: visszaadhat egy értéket, kivételeket vethet ki a szülő által, és támogathatja az automatikus újrapróbálkozást.
Mikor érdemes részvezényléseket használni?
A következő esetekben használjon részvezényléseket:
- Újrahasználható munkafolyamat építőelemei: Bontsa ki a többlépéses munkafolyamatot a saját orkestrációs modulba, hogy több szülő orkestráció is meghívhassa.
- Orkesztrációk párhuzamos elosztása: Ütemezze egyszerre ugyanazon orkesztrátor sok példányát, és várja meg, amíg mindegyik befejeződik.
- Összetett munkafolyamatok rendszerezése: A nagy folyamatvezérlést egyetlen hosszú függvény helyett elnevezett, tesztelhető darabokra bonthatja.
Megjegyzés:
Az alvezényléseket ugyanabban az alkalmazásban kell definiálni, mint a szülő vezénylést. Ha másik alkalmazásban szeretne orchestration hívásokat meghívni, használja helyette a HTTP 202 lekérdezési mintát. További információ: HTTP-funkciók.
A cikk tartalma:
- Szubrendezés meghatározása – Egyeszköz-kiépítési mintapéldány
- Al-orkesztációk futtatása párhuzamosan – Szétosztási minta determinisztikus példányazonosítókkal
Megjegyzés:
A PowerShellben az alvezénylések csak a különálló SDK-ban támogatottak: AzureFunctions.PowerShell.Durable.SDK. Az önálló SDK és az örökölt beépített SDK közötti különbségekért tekintse meg a migrálási útmutatót.
Rész orchesztráció meghatározása
Az alábbi példa egy olyan IoT-forgatókönyvet mutat be, amelyben több eszközt kell beállítani. A függvény az egyes eszközökhöz futó beállítási munkafolyamatot jelöli:
Izolált munkavállalói modell
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: ...
}
Folyamaton belüli modell
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;
}
}
Ez a vezénylőfüggvény önállóan futtatható egyszeri eszközbeállításhoz, vagy egy szülő vezénylő részvezénylési feladatként ütemezheti a call-sub-orchestrator API használatával.
Alfolyamatok párhuzamos futtatása
Az alábbi példa egy szülő vezénylőt mutat be, amely egyszerre több alvezénylést is kedvel. Egyes nyelvek determinisztikus gyermekpéldány-azonosítót használnak (a szülő példányazonosítójából és egy indexből származtatva), hogy megakadályozzák az ismétlődő részvezényléseket a visszajátszáskor.
Izolált munkavállalói modell
[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);
// ...
}
Folyamaton belüli modell
[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);
// ...
}
Következő lépések
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;
}
}