Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Use Durable Functions, una característica de Azure Functions, para escribir flujos de trabajo sin servidor con estado en C#. En esta guía de inicio rápido, clonará y ejecutará una aplicación de ejemplo que demuestra el patrón de orquestación con encadenamiento de funciones:
- Encadenamiento de funciones: llama a actividades secuencialmente (Tokio → Seattle → Londres).
Al final, tendrás la orquestación ejecutándose localmente 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.
- Compile y ejecute la aplicación de funciones y desencadene la orquestación.
- Consulte el estado y el resultado de la orquestación en el panel de Durable Task Scheduler.
Prerrequisitos
- Tener instalado el SDK de .NET 8 o una versión posterior.
- Azure Functions Core Tools v4 o posterior.
- Docker para ejecutar el emulador y Azurite.
- Clona el repositorio de GitHub Durable Task Scheduler para utilizar el ejemplo quickstart.
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 .NET Functions 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
Vaya al directorio de ejemplo Hello Cities:
cd samples/durable-functions/dotnet/HelloCities/httpCree un
local.settings.jsonarchivo con la configuración del emulador:{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated", "DURABLE_TASK_SERVICE_CONNECTION_STRING": "Endpoint=http://localhost:8080;TaskHub=default;Authentication=None", "TASKHUB_NAME": "default" } }Compile el proyecto:
dotnet buildInicie la aplicación de funciones:
func startEn un terminal independiente, desencadene la orquestación:
$response = Invoke-RestMethod -Method POST -Uri http://localhost:7071/api/DurableFunctionsOrchestrationCSharp1_HttpStart $responseLa respuesta contiene direcciones URL de estado para la instancia de orquestación. Copie el
statusQueryGetUrivalor y ejecútelo para comprobar el resultado: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 el runtimeStatus de la orquestación sea Completed, puede encontrar el resultado del saludo en el campo output:
{
"name": "DurableFunctionsOrchestrationCSharp1",
"runtimeStatus": "Completed",
"output": ["Hello Tokyo!", "Hello Seattle!", "Hello London!"]
}
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 de DurableFunctionsOrchestrationCSharp1.cs contiene los tres tipos de función necesarios para una aplicación de Durable Functions.
Función de actividad
La SayHello actividad toma un nombre de ciudad y devuelve un saludo:
[Function(nameof(SayHello))]
public static string SayHello([ActivityTrigger] string name, FunctionContext executionContext)
{
ILogger logger = executionContext.GetLogger("SayHello");
logger.LogInformation("Saying hello to {name}.", name);
return $"Hello {name}!";
}
Función de orquestador
El orquestador llama SayHello secuencialmente para tres ciudades:
[Function(nameof(DurableFunctionsOrchestrationCSharp1))]
public static async Task<List<string>> RunOrchestrator(
[OrchestrationTrigger] TaskOrchestrationContext context)
{
ILogger logger = context.CreateReplaySafeLogger(nameof(DurableFunctionsOrchestrationCSharp1));
logger.LogInformation("Saying hello.");
var outputs = new List<string>();
outputs.Add(await context.CallActivityAsync<string>(nameof(SayHello), "Tokyo"));
outputs.Add(await context.CallActivityAsync<string>(nameof(SayHello), "Seattle"));
outputs.Add(await context.CallActivityAsync<string>(nameof(SayHello), "London"));
return outputs;
}
Función de cliente
Una función de cliente desencadenada por HTTP inicia la orquestación:
[Function("DurableFunctionsOrchestrationCSharp1_HttpStart")]
public static async Task<HttpResponseData> HttpStart(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req,
[DurableClient] DurableTaskClient client,
FunctionContext executionContext)
{
ILogger logger = executionContext.GetLogger("DurableFunctionsOrchestrationCSharp1_HttpStart");
string instanceId = await client.ScheduleNewOrchestrationInstanceAsync(
nameof(DurableFunctionsOrchestrationCSharp1));
logger.LogInformation("Started orchestration with ID = '{instanceId}'.", instanceId);
return await client.CreateCheckStatusResponseAsync(req, instanceId);
}
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": {
"storageProvider": {
"type": "azureManaged",
"connectionStringName": "DURABLE_TASK_SERVICE_CONNECTION_STRING"
},
"hubName": "%TASKHUB_NAME%"
}
}
}
El cadena de conexión del emulador y el nombre del centro de tareas se establecen en local.settings.json:
{
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated",
"DURABLE_TASK_SERVICE_CONNECTION_STRING": "Endpoint=http://localhost:8080;TaskHub=default;Authentication=None",
"TASKHUB_NAME": "default"
}
}
Limpieza de recursos
Detenga los contenedores del emulador cuando haya terminado:
docker stop dtsemulator azurite && docker rm dtsemulator azurite
Pasos siguientes
- Obtenga información sobre patrones comunes de aplicaciones de Durable Functions.
- Más información sobre los proveedores de almacenamiento de Durable Functions.