Быстрый старт: Создание приложения Устойчивые функции в PowerShell

Используйте Устойчивые функции — функцию Функции Azure — для создания бессерверных рабочих процессов с сохранением состояния в PowerShell. В этом кратком руководстве вы клонируете и запустите пример приложения, демонстрирующий два распространённых шаблона оркестрации:

  • Цепочка функций: вызывает действия последовательно (Токио → Сиэтл → Лондон).
  • Разветвление/сведение: Параллельно запускает операции в пяти городах, а затем агрегирует результаты.

В итоге у вас будут обе оркестрации, запущенные локально с помощью эмулятора Durable Task Scheduler, и вы сможете просматривать их состояние на панели управления.

  • Клонируйте и подготовьте пример проекта Hello Cities.
  • Настройте эмулятор планировщика устойчивых задач и Azurite для локальной разработки.
  • Запустите приложение функции и запустите обе оркестрации.
  • Просмотрите состояние оркестрации и выходные данные на панели мониторинга Durable Task Scheduler.

Необходимые условия

  • PowerShell 7.4+ установлен.
  • Функции Azure Core Tools версии 4 или более поздней версии.
  • Docker для запуска эмулятора и Azurite.
  • Клонируйте репозиторий Durable Task Scheduler на GitHub для работы с примером начального уровня.

Настройте эмулятор планировщика Durable Task

Эмулятор планировщика задач Durable Task Scheduler предоставляет локальную среду разработки, чтобы можно было протестировать оркестрации без подписки Azure. Узел функций PowerShell также требует Azurite для локального хранилища.

Запустите оба контейнера:

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

После запуска эмулятора вы можете открыть панель мониторинга Durable Task Scheduler по адресу http://localhost:8082, чтобы отслеживать оркестрации.

Запустите пример для быстрого запуска

  1. Перейдите в пример каталога Hello Cities:

    cd samples/durable-functions/powershell/HelloCities
    
  2. Убедитесь, что local.settings.json файл содержит следующую конфигурацию:

    {
      "IsEncrypted": false,
      "Values": {
        "AzureWebJobsStorage": "UseDevelopmentStorage=true",
        "FUNCTIONS_WORKER_RUNTIME": "powershell",
        "DURABLE_TASK_SCHEDULER_CONNECTION_STRING": "Endpoint=http://localhost:8080;TaskHub=default;Authentication=None"
      }
    }
    
  3. Запустите приложение-функцию:

    func start
    
  4. В отдельном терминале активируйте оркестрацию цепочки функций :

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

    Ответ содержит URL-адреса состояния экземпляра оркестрации. statusQueryGetUri Скопируйте значение и запустите его, чтобы проверить результат:

    Invoke-RestMethod -Uri $response.statusQueryGetUri
    
  5. Запустите оркестрацию fan-out/fan-in:

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

Ожидаемые выходные данные

Запрос POST возвращает ответ JSON с URL-адресами состояния. Рассмотрим пример.

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

Когда вы выполняете запрос statusQueryGetUri и значение runtimeStatus оркестрации равно Completed, результаты приветствия можно найти в поле output. Возвращается оркестрация цепочек:

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

Оркестрация вентилятора и вентилятора возвращает:

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

Tip

Если на runtimeStatus отображается Running или Pending, немного подождите и снова выполните запрос к statusQueryGetUri.

Откройте панель мониторинга Durable Task Scheduler по адресу http://localhost:8082, чтобы просмотреть состояние оркестрации и историю выполнения.

Изучение кода

В примере проекта используется модель функции PowerShell, в которой каждая функция находится в отдельном подкаталоге с файлом function.json привязки и скриптом run.ps1 .

Функция активности

Действие SayHello (SayHello/run.ps1) принимает имя города и возвращает приветствие:

param($city)

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

Функции оркестратора

Оркестратор цепочки (ChainingOrchestration/run.ps1) последовательно вызывает SayHello для трех городов:

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

Оркестратор fan-out/fan-in (FanOutFanInOrchestration/run.ps1) планирует операции параллельно:

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

Клиентские функции

Клиентские функции, активируемые по HTTP, запускают каждую оркестрацию. Например, 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

Конфигурация

В примере в качестве сервера хранения используется эмулятор Durable Task Scheduler. Это настроено в 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
  }
}

Параметр managedDependency автоматически устанавливает необходимые модули PowerShell, определенные в requirements.psd1, включая пакет SDK Устойчивые функции.

Очистите ресурсы

Остановите контейнеры эмулятора после завершения:

docker stop dtsemulator azurite && docker rm dtsemulator azurite

Дальнейшие действия