Rychlý start: Vytvoření aplikace Durable Functions v PowerShellu

Pomocí funkce Durable Functions, která je součástí Azure Functions, můžete v PowerShellu vytvářet stavové bezserverové pracovní postupy. V tomto rychlém startu naklonujete a spustíte ukázkovou aplikaci, která ukazuje dva běžné vzory orchestrace:

  • Řetězení funkcí: Volá aktivity postupně (Tokio → Seattle → Londýn).
  • Fan-out/fan-in: Volá aktivity paralelně napříč pěti městy a pak agreguje výsledky.

Na konci budete mít obě orchestrace spuštěné lokálně pomocí emulátoru Durable Task Scheduler a budete moct zobrazit jejich stav na dashboardu.

  • Naklonujte a připravte ukázkový projekt Hello Cities.
  • Nastavte emulátor plánovače úloh Durable a Azurite pro místní vývoj.
  • Spusťte aplikaci funkcí a aktivujte obě orchestrace.
  • Zkontrolujte stav orchestrace a výstup na řídicím panelu Plánovače úloh Durable.

Předpoklady

Nastavení emulátoru Plánovače úloh Durable

Emulátor plánovače úloh Durable Task Scheduler poskytuje místní vývojové prostředí, abyste mohli otestovat orchestrace bez předplatného Azure. Hostitel funkcí PowerShellu také vyžaduje Azurite pro místní úložiště.

Spusťte oba kontejnery:

docker run -d --name dtsemulator -p 8080:8080 -p 8082:8082 \
  mcr.microsoft.com/dts/dts-emulator:latest

docker run -d --name azurite -p 10000:10000 -p 10001:10001 -p 10002:10002 \
  mcr.microsoft.com/azure-storage/azurite

Tip

Jakmile je emulátor spuštěný, můžete přistupovat k řídicímu panelu Durable Task Scheduler na adrese http://localhost:8082, kde můžete sledovat orchestrace.

Spusťte ukázku pro rychlý start

  1. Přejděte do ukázkového adresáře Hello Cities:

    cd samples/durable-functions/powershell/HelloCities
    
  2. Ověřte, že local.settings.json soubor obsahuje následující konfiguraci:

    {
      "IsEncrypted": false,
      "Values": {
        "AzureWebJobsStorage": "UseDevelopmentStorage=true",
        "FUNCTIONS_WORKER_RUNTIME": "powershell",
        "DURABLE_TASK_SCHEDULER_CONNECTION_STRING": "Endpoint=http://localhost:8080;TaskHub=default;Authentication=None"
      }
    }
    
  3. Spusťte aplikaci funkcí:

    func start
    
  4. V samostatném terminálu aktivujte orchestraci řetězení funkcí :

    $response = Invoke-RestMethod -Method POST -Uri http://localhost:7071/api/StartChaining
    $response
    

    Odpověď obsahuje stavové adresy URL pro instanci orchestrátoru. statusQueryGetUri Zkopírujte hodnotu a spusťte ji a zkontrolujte výsledek:

    Invoke-RestMethod -Uri $response.statusQueryGetUri
    
  5. Spusťte orchestraci fan-out/fan-in:

    $response = Invoke-RestMethod -Method POST -Uri http://localhost:7071/api/StartFanOutFanIn
    Invoke-RestMethod -Uri $response.statusQueryGetUri
    

Očekávaný výstup

Požadavek POST vrátí odpověď JSON s adresami URL stavu. Příklad:

{
  "id": "<instanceId>",
  "statusQueryGetUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/<instanceId>?code=...",
  "sendEventPostUri": "...",
  "terminatePostUri": "...",
  "purgeHistoryDeleteUri": "..."
}

Když zadáte dotaz na statusQueryGetUri a hodnota runtimeStatus orchestrace je Completed, výsledky pozdravu najdete v poli output. Orchestrace zřetězení vrátí:

{
  "name": "ChainingOrchestration",
  "runtimeStatus": "Completed",
  "output": ["Hello Tokyo!", "Hello Seattle!", "Hello London!"]
}

Orchestrace fan-out/fan-in vrací:

{
  "name": "FanOutFanInOrchestration",
  "runtimeStatus": "Completed",
  "output": ["Hello Tokyo!", "Hello Seattle!", "Hello London!", "Hello Paris!", "Hello Berlin!"]
}

Tip

Pokud se na runtimeStatus zobrazí Running nebo Pending, chvíli počkejte a znovu odešlete dotaz na statusQueryGetUri.

Otevřete řídicí panel Plánovače úloh Durable na adrese http://localhost:8082, abyste zobrazili stav orchestrace a historii spuštění.

Vysvětlení kódu

Ukázkový projekt používá model funkcí PowerShellu, ve kterém každá funkce žije ve vlastním podadresáři se souborem function.json vazby a skriptem run.ps1 .

Funkce aktivity

Aktivita SayHello (SayHello/run.ps1) přebírá název města a vrací pozdrav:

param($city)

Write-Host "Saying hello to $city."
"Hello $city!"

Funkce orchestratoru

Orchestrátor řetězení (ChainingOrchestration/run.ps1) volá SayHello postupně pro všechna tři města:

param($Context)

$output = @()
$output += Invoke-DurableActivity -FunctionName 'SayHello' -Input 'Tokyo'
$output += Invoke-DurableActivity -FunctionName 'SayHello' -Input 'Seattle'
$output += Invoke-DurableActivity -FunctionName 'SayHello' -Input 'London'

$output

Orchestrátor fan-out/fan-in (FanOutFanInOrchestration/run.ps1) plánuje aktivity paralelně:

param($Context)

$cities = @('Tokyo', 'Seattle', 'London', 'Paris', 'Berlin')

# Fan-out: schedule all activities in parallel
$parallelTasks = @()
foreach ($city in $cities) {
    $parallelTasks += Invoke-DurableActivity -FunctionName 'SayHello' -Input $city -NoWait
}

# Fan-in: wait for all to complete
$output = Wait-ActivityFunction -Task $parallelTasks

$output

Klientské funkce

Funkce klienta aktivované protokolem HTTP spouští každou orchestraci. Příklad: StartChaining/run.ps1

param($Request, $TriggerMetadata)

$instanceId = Start-DurableOrchestration -FunctionName 'ChainingOrchestration'
Write-Host "Started chaining orchestration with ID = '$instanceId'."

$response = New-DurableOrchestrationCheckStatusResponse -Request $Request -InstanceId $instanceId
Push-OutputBinding -Name Response -Value $response

Konfigurace

Ukázka používá emulátor Plánovače úloh Durable jako back-end úložiště. Toto nastavení je nakonfigurováno v host.json:

{
  "version": "2.0",
  "extensions": {
    "durableTask": {
      "hubName": "default",
      "storageProvider": {
        "type": "azureManaged",
        "connectionStringName": "DURABLE_TASK_SCHEDULER_CONNECTION_STRING"
      }
    }
  },
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[4.*, 5.0.0)"
  },
  "managedDependency": {
    "enabled": true
  }
}

Nastavení managedDependency automaticky nainstaluje požadované moduly PowerShellu definované v requirements.psd1, včetně sady Durable Functions SDK.

Vyčistěte zdroje

Po dokončení zastavte kontejnery emulátoru:

docker stop dtsemulator azurite && docker rm dtsemulator azurite

Další kroky