Compartir a través de


Encadenamiento de funciones

El encadenamiento de funciones es un patrón en el que se ejecuta una secuencia de funciones en orden. Es habitual pasar la salida de una función a la entrada de la siguiente. En este artículo se describe la secuencia de encadenamiento que se compila al completar el inicio rápido de Durable Functions (C#, JavaScriptTypeScript, Python, PowerShell o Java). Obtenga más información en Descripción general de Durable Functions.

Prerequisites

El encadenamiento de funciones es un patrón en el que se ejecuta una secuencia de actividades en orden. Es habitual pasar la salida de una actividad a la entrada de la siguiente. En este artículo se describe la secuencia de encadenamiento de los SDK de Durable Task para .NET, JavaScript, Python y Java.

Funciones

En este artículo se describen estas funciones en la aplicación de ejemplo:

  • Una función de orquestador que realiza llamadas múltiples veces en secuencia. Almacena cada salida y registra los resultados.
  • : función de actividad que agrega "Hello" al inicio de una cadena.
  • : una función de cliente durable desencadenada por HTTP que inicia una instancia del orquestador.

En este artículo se describen estos componentes en la aplicación de ejemplo:

  • , , , o : un orquestador que llama a varias actividades en secuencia. Almacena cada salida y registra los resultados.
  • Funciones de actividad: actividades que procesan la entrada y devuelven resultados. Cada actividad realiza una transformación sencilla en la entrada.
  • Cliente: una aplicación cliente que inicia una instancia del orquestador y espera el resultado.

Orchestrator

[FunctionName("E1_HelloSequence")]
public static async Task<List<string>> Run(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    var outputs = new List<string>();

    outputs.Add(await context.CallActivityAsync<string>("E1_SayHello", "Tokyo"));
    outputs.Add(await context.CallActivityAsync<string>("E1_SayHello", "Seattle"));
    outputs.Add(await context.CallActivityAsync<string>("E1_SayHello_DirectInput", "London"));

    // returns ["Hello Tokyo!", "Hello Seattle!", "Hello London!"]
    return outputs;
}

Todas las funciones de orquestación de C# deben tener un parámetro de tipo DurableOrchestrationContext, que existe en el ensamblado Microsoft.Azure.WebJobs.Extensions.DurableTask. Este objeto de contexto le permite llamar a otras funciones de actividad y pasar parámetros de entrada con su método .

El código llama a la función tres veces en secuencia con distintos valores de parámetro. El valor devuelto de cada llamada se agrega a la lista , que se devuelve al final de la función.

Este código muestra un orquestador que llama a tres actividades en secuencia y pasa el resultado de cada actividad a la próxima actividad.

using Microsoft.DurableTask;

[DurableTask]
public class GreetingOrchestration : TaskOrchestrator<string, string>
{
    public override async Task<string> RunAsync(TaskOrchestrationContext context, string name)
    {
        // Step 1: Say hello to the person
        string greeting = await context.CallActivityAsync<string>(nameof(SayHelloActivity), name);

        // Step 2: Process the greeting
        string processedGreeting = await context.CallActivityAsync<string>(nameof(ProcessGreetingActivity), greeting);

        // Step 3: Finalize the response
        string finalResponse = await context.CallActivityAsync<string>(nameof(FinalizeResponseActivity), processedGreeting);

        return finalResponse;
    }
}

Todos los orquestadores de .NET heredan de TaskOrchestrator<TInput, TOutput>. permite llamar a actividades mediante . El código llama a tres actividades en secuencia, donde cada actividad recibe la salida de la actividad anterior.

Actividad

[FunctionName("E1_SayHello")]
public static string SayHello([ActivityTrigger] IDurableActivityContext context)
{
    string name = context.GetInput<string>();
    return $"Hello {name}!";
}

Las actividades usan el atributo. Usa para acciones relacionadas con la actividad, como la lectura de datos de entrada con .

da formato a una cadena de saludo.

En lugar de enlazar a , se enlaza directamente al tipo pasado a la función de actividad. Por ejemplo:

[FunctionName("E1_SayHello_DirectInput")]
public static string SayHelloDirectInput([ActivityTrigger] string name)
{
    return $"Hello {name}!";
}

Las actividades del SDK de Durable Task heredan de :

using Microsoft.DurableTask;
using Microsoft.Extensions.Logging;

[DurableTask]
public class SayHelloActivity : TaskActivity<string, string>
{
    private readonly ILogger<SayHelloActivity> _logger;

    public SayHelloActivity(ILogger<SayHelloActivity> logger)
    {
        _logger = logger;
    }

    public override Task<string> RunAsync(TaskActivityContext context, string name)
    {
        _logger.LogInformation("Activity SayHello called with name: {Name}", name);
        return Task.FromResult($"Hello {name}!");
    }
}

[DurableTask]
public class ProcessGreetingActivity : TaskActivity<string, string>
{
    public override Task<string> RunAsync(TaskActivityContext context, string greeting)
    {
        return Task.FromResult($"{greeting} How are you today?");
    }
}

[DurableTask]
public class FinalizeResponseActivity : TaskActivity<string, string>
{
    public override Task<string> RunAsync(TaskActivityContext context, string response)
    {
        return Task.FromResult($"{response} I hope you're doing well!");
    }
}

Use la inserción de dependencias para obtener servicios como . Agregue el atributo para registrar la actividad con el trabajador.

Client

Inicie una instancia de función de orquestador desde una función cliente. Use la función desencadenada por HTTP para iniciar instancias de .

public static class HttpStart
{
    [FunctionName("HttpStart")]
    public static async Task<HttpResponseMessage> Run(
        [HttpTrigger(AuthorizationLevel.Function, methods: "post", Route = "orchestrators/{functionName}")] HttpRequestMessage req,
        [DurableClient] IDurableClient starter,
        string functionName,
        ILogger log)
    {
        // Function input comes from the request content.
        object eventData = await req.Content.ReadAsAsync<object>();
        string instanceId = await starter.StartNewAsync(functionName, eventData);

        log.LogInformation($"Started orchestration with ID = '{instanceId}'.");

        return starter.CreateCheckStatusResponse(req, instanceId);
    }
}

Para interactuar con orquestadores, agregue un enlace de entrada. Use el cliente para iniciar una orquestación y devolver una respuesta HTTP que incluya direcciones URL para comprobar el estado de la nueva orquestación.

Inicie una orquestación desde una aplicación cliente. El cliente programa la orquestación y puede esperar a que finalice.

using Microsoft.DurableTask.Client;

// Create the client
var client = DurableTaskClientBuilder.UseDurableTaskScheduler(connectionString).Build();

// Schedule a new orchestration instance
string instanceId = await client.ScheduleNewOrchestrationInstanceAsync(
    nameof(GreetingOrchestration),
    input: "World");

Console.WriteLine($"Started orchestration with ID: {instanceId}");

// Wait for the orchestration to complete
OrchestrationMetadata result = await client.WaitForInstanceCompletionAsync(
    instanceId,
    getInputsAndOutputs: true);

Console.WriteLine($"Orchestration completed with result: {result.ReadOutputAs<string>()}");

Cree el DurableTaskClient mediante una cadena de conexión al Programador de Tareas Duraderas. Utilice para iniciar una orquestación y para esperar a que finalice.

Ejecución del ejemplo

Para ejecutar la orquestación, envíe esta solicitud HTTP POST a la función .

POST http://{host}/orchestrators/E1_HelloSequence

Nota:

En el fragmento de código HTTP anterior se supone que el archivo host.json del ejemplo quita el prefijo predeterminado de todas las direcciones URL de la función de desencadenador HTTP. Busque esta configuración en el archivo host.json del ejemplo.

Por ejemplo, si ejecuta el ejemplo en una aplicación de funciones denominada , reemplace por .

La solicitud devuelve HTTP 202 (recortado por brevedad):

HTTP/1.1 202 Accepted
Content-Length: 719
Content-Type: application/json; charset=utf-8
Location: http://{host}/runtime/webhooks/durabletask/instances/96924899c16d43b08a536de376ac786b?taskHub=DurableFunctionsHub&connection=Storage&code={systemKey}

(...trimmed...)

Las colas de orquestación comienzan a ejecutarse inmediatamente. Use la dirección URL del encabezado para comprobar el estado de ejecución.

GET http://{host}/runtime/webhooks/durabletask/instances/96924899c16d43b08a536de376ac786b?taskHub=DurableFunctionsHub&connection=Storage&code={systemKey}

La respuesta muestra el estado de orquestación. Dado que finaliza rápidamente, la instancia suele estar en estado Completado y devuelve una respuesta como esta (recortada por brevedad):

HTTP/1.1 200 OK
Content-Length: 179
Content-Type: application/json; charset=utf-8

{"runtimeStatus":"Completed","input":null,"output":["Hello Tokyo!","Hello Seattle!","Hello London!"],"createdTime":"2017-06-29T05:24:57Z","lastUpdatedTime":"2017-06-29T05:24:59Z"}

La instancia está completada y contiene el resultado serializado en JSON de la ejecución de la función del orquestador.

Nota:

Implemente una lógica de inicio similar para otros tipos de desencadenadores, como , o .

Revise los registros de ejecución de la función. La función se inicia y completa varias veces debido al comportamiento de reproducción descrito en confiabilidad de orquestación. Pero solo se ejecuta tres veces porque las ejecuciones de la función de actividad no se reproducen.

Para ejecutar el ejemplo, necesita lo siguiente:

  1. Inicie el emulador del Programador de tareas durables (para el desarrollo local):

    docker run -d -p 8080:8080 -p 8082:8082 --name dts-emulator mcr.microsoft.com/dts/dts-emulator:latest
    
  2. Inicie el trabajo para registrar el orquestador y las actividades.

  3. Ejecute el cliente para programar una orquestación y esperar el resultado.

La salida del cliente muestra el resultado de la orquestación encadenada:

Started orchestration with ID: abc123
Orchestration completed with result: "Hello World! How are you today? I hope you're doing well!"

Los registros de trabajo muestran que cada actividad se ejecuta en una secuencia y pasa su resultado a la siguiente actividad.

Pasos siguientes

En este ejemplo se demuestra una sencilla orquestación por encadenamiento de funciones. A continuación, implemente el patrón fan-out/fan-in.

Ejecutar el ejemplo de fan-out/fan-in

En este ejemplo se muestra una orquestación de encadenamiento de funciones sencilla. A continuación, explore más patrones.

Introducción a los SDK de Durable Task

Para obtener ejemplos completos del SDK de JavaScript, consulte ejemplos del SDK de JavaScript de Durable Task.