Inicio rápido: Creación de una aplicación de Durable Functions de PowerShell

Use Durable Functions, una característica de Azure Functions para escribir flujos de trabajo sin servidor con estado en PowerShell. En este inicio rápido, clonará y ejecutará una aplicación de ejemplo que muestra dos patrones de orquestación comunes:

  • Encadenamiento de funciones: llama a actividades secuencialmente (Tokio → Seattle → Londres).
  • Fan-out/fan-in: invoca actividades en paralelo en cinco ciudades y, a continuación, agrega los resultados.

Al final, tendrás ambas orquestaciones ejecutándose en local con el emulador Durable Task Scheduler y podrás ver su estado en el panel de control.

  • Clona y prepara el proyecto de ejemplo Hello Cities.
  • Configure el emulador de Durable Task Scheduler y Azurite para el desarrollo local.
  • Ejecute la aplicación de funciones y desencadene ambas orquestaciones.
  • Consulte el estado y el resultado de la orquestación en el panel de Durable Task Scheduler.

Prerrequisitos

Configuración del emulador del Programador de tareas duraderas

El emulador del programador de tareas de Durable proporciona un entorno de desarrollo local para que pueda probar orquestaciones sin una suscripción Azure. El host de Funciones de PowerShell también requiere Azurite para el almacenamiento local.

Inicie ambos contenedores:

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

Una vez que el emulador esté en ejecución, puede acceder al panel de Durable Task Scheduler en http://localhost:8082 para supervisar las orquestaciones.

Ejecución del ejemplo de inicio rápido

  1. Vaya al directorio de ejemplo Hello Cities:

    cd samples/durable-functions/powershell/HelloCities
    
  2. Compruebe que el local.settings.json archivo contiene la siguiente configuración:

    {
      "IsEncrypted": false,
      "Values": {
        "AzureWebJobsStorage": "UseDevelopmentStorage=true",
        "FUNCTIONS_WORKER_RUNTIME": "powershell",
        "DURABLE_TASK_SCHEDULER_CONNECTION_STRING": "Endpoint=http://localhost:8080;TaskHub=default;Authentication=None"
      }
    }
    
  3. Inicie la aplicación de funciones:

    func start
    
  4. En un terminal independiente, active la orquestación del encadenamiento de funciones:

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

    La respuesta contiene direcciones URL de estado para la instancia de orquestación. Copie el statusQueryGetUri valor y ejecútelo para comprobar el resultado:

    Invoke-RestMethod -Uri $response.statusQueryGetUri
    
  5. Inicie la orquestación fan-out/fan-in:

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

Salida prevista

La solicitud POST devuelve una respuesta JSON con direcciones URL de estado. Por ejemplo:

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

Cuando consulte statusQueryGetUri y la runtimeStatus de la orquestación sea Completed, podrá encontrar los resultados del saludo en el campo output. La orquestación en cadena devuelve:

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

La orquestación fan-out/fan-in devuelve:

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

Tip

Si runtimeStatus muestra Running o Pending, espere un momento y vuelva a consultarlo statusQueryGetUri .

Abra el panel del Programador de tareas durables en http://localhost:8082 para ver el estado de orquestación y el historial de ejecución.

Descripción del código

El proyecto de ejemplo usa el modelo de función de PowerShell donde cada función reside en su propio subdirectorio con un function.json archivo de enlace y un run.ps1 script.

Función de actividad

La SayHello actividad (SayHello/run.ps1) toma un nombre de ciudad y devuelve un saludo:

param($city)

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

Funciones del Orquestador

El orquestador de encadenamiento (ChainingOrchestration/run.ps1) llama a SayHello de forma secuencial para tres ciudades:

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

El orquestador fan-out/fan-in (FanOutFanInOrchestration/run.ps1) programa actividades en paralelo:

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

Funciones de cliente

Las funciones de cliente desencadenadas por HTTP inician cada orquestación. Por ejemplo, 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

Configuración

En el ejemplo se usa el emulador de Durable Task Scheduler como back-end de almacenamiento. Esto se configura en 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
  }
}

La configuración managedDependency instala automáticamente los módulos de PowerShell necesarios definidos en requirements.psd1, incluido el SDK de Durable Functions.

Limpieza de recursos

Detenga los contenedores del emulador cuando haya terminado:

docker stop dtsemulator azurite && docker rm dtsemulator azurite

Pasos siguientes