Compartir a través de


Gestionar instancias de orquestación

Las orquestaciones son flujos de trabajo con estado de ejecución prolongada que se pueden iniciar, consultar, suspender, reanudar y finalizar mediante las API de administración integradas. En Durable Functions, el enlace de cliente de orchestration expone estas API. En los SDK de Durable Task, estas operaciones están disponibles a través de la clase . En este artículo se tratan todas las operaciones de administración de instancias admitidas para ambas plataformas.

Sugerencia

La Azure Durable Task Scheduler es el back-end recomendado para Durable Functions y los SDK de Durable Task, lo que proporciona una experiencia totalmente administrada y sin servidor para ejecutar flujos de trabajo duraderos a escala.

Inicio de instancias

El método start-new (o schedule-new) en el cliente de orquestación inicia una nueva instancia de orquestación. Internamente, este método escribe un mensaje en el backend configurado (como el Durable Task Scheduler o Azure Storage) y luego devuelve. Este mensaje desencadena de forma asincrónica el inicio de una orquestación con el nombre especificado.

Estos son los parámetros para iniciar una nueva instancia de orquestación:

  • Name: el nombre de la función de orquestador que programar.
  • Entrada: cualquier dato serializable json que se debe pasar como entrada a la función de orquestador.
  • InstanceId: (Opcional) El identificador único de la instancia. Si no especifica este parámetro, el método usa un identificador aleatorio.

Sugerencia

Use un identificador aleatorio para el identificador de instancia siempre que sea posible. Los identificadores de instancia aleatorios ayudan a garantizar una distribución de carga igual al escalar las funciones de orquestador en varias máquinas virtuales. El momento adecuado para usar identificadores de instancia no aleatorios es cuando el identificador procede de un origen externo o cuando se implementa el patrón de orquestador singleton.

  • Nombre: El nombre de la orquestación que se va a programar.
  • Entrada: cualquier dato serializable por JSON que se debe pasar como entrada a la orquestación.
  • InstanceId: (Opcional) El identificador único de la instancia. Si no especifica este parámetro, el método usa un identificador aleatorio.

Sugerencia

Use un identificador aleatorio para el identificador de instancia siempre que sea posible. Los identificadores de instancia aleatorios ayudan a garantizar una distribución de carga igual al escalar orquestaciones entre varias máquinas virtuales. El momento adecuado para usar identificadores de instancia no aleatorios es cuando el identificador procede de un origen externo o cuando se implementa el patrón de orquestador singleton.

La siguiente función de ejemplo inicia una nueva instancia de orquestación:

[FunctionName("HelloWorldQueueTrigger")]
public static async Task Run(
    [QueueTrigger("start-queue")] string input,
    [DurableClient] IDurableOrchestrationClient starter,
    ILogger log)
{
    string instanceId = await starter.StartNewAsync("HelloWorld", input);
    log.LogInformation($"Started orchestration with ID = '{instanceId}'.");
}

Nota:

El código de C# anterior es para Durable Functions 2.x. Para Durable Functions 1.x, use el atributo en lugar del atributo /> en lugar de . Para obtener más información sobre las diferencias entre versiones, vea Durable Functions versiones.

Importante

Actualmente, el SDK de Durable Task de PowerShell no está disponible.

En el código siguiente se muestra cómo iniciar una nueva instancia de orquestación mediante los SDK de Durable Task:

using Microsoft.DurableTask.Client;

// Schedule a new orchestration instance
string instanceId = await client.ScheduleNewOrchestrationInstanceAsync("HelloWorld", input);
Console.WriteLine($"Started orchestration with ID = '{instanceId}'.");

// Optionally, wait for the orchestration to start
OrchestrationMetadata metadata = await client.WaitForInstanceStartAsync(instanceId, timeout: TimeSpan.FromSeconds(30));

Consulta de instancias

Después de iniciar nuevas instancias de orquestación, lo más probable es que tenga que consultar sus estados en tiempo de ejecución para saber si se están ejecutando, han completado o han fallado.

El método get-status del cliente de orquestación devuelve el estado de una instancia de orquestación.

Toma (obligatorio), (opcional), (opcional) y (opcional) como parámetros.

  • : si se establece en , la respuesta contiene el historial de ejecución.
  • : si se establece en , el historial de ejecución contiene salidas de actividad.
  • : si se establece en , la respuesta no contiene la entrada de la función. El valor predeterminado es .

El método devuelve un objeto con las siguientes propiedades:

  • Nombre: el nombre de la función de orquestación.
  • InstanceId: el identificador de instancia de la orquestación (debe ser el mismo que la entrada).
  • CreatedTime: hora en la que se inicia la ejecución de la función de orquestador.
  • LastUpdatedTime: La hora en que la orquestación realizó el último registro de los puntos de control.
  • Entrada: entrada de la función como un valor JSON. Este campo no se rellena si es .
  • CustomStatus: estado de orquestación personalizada en formato JSON.
  • Salida: la salida de la función como un valor JSON (si se completa la función). Si se produce un error en la función de orquestador, esta propiedad incluye los detalles del error. Si la función de orquestador está suspendida o terminada, esta propiedad incluye el motivo de la suspensión o finalización (si existe).
  • RuntimeStatus: uno de los siguientes valores:
    • Pendiente: la instancia está programada, pero aún no se ha iniciado la ejecución.
    • En ejecución: la instancia se está ejecutando.
    • Completado: la instancia se completó normalmente.
    • ContinuedAsNew: la instancia se ha reiniciado con un nuevo historial. Este estado es un estado transitorio.
    • Fallido: La instancia falló con un error.
    • Finalizado: la instancia se detuvo abruptamente.
    • Suspendido: la instancia se suspende y se puede reanudar en un momento posterior.
  • History: el historial de ejecución de la orquestación. Este campo solo se rellena si se establece en .
  • : si se establece en , la respuesta contiene el historial de ejecución.
  • : si se establece en , el historial de ejecución contiene salidas de actividad.
  • : si se establece en , la respuesta no contiene la entrada de la orquestación. El valor predeterminado es .

El método devuelve un objeto con las siguientes propiedades:

  • Nombre: nombre de la orquestación.
  • InstanceId: el identificador de instancia de la orquestación (debe ser el mismo que la entrada).
  • CreatedTime: hora en la que se inicia la ejecución de la orquestación.
  • LastUpdatedTime: La hora en que la orquestación realizó el último registro de los puntos de control.
  • Entrada: entrada de la orquestación como un valor JSON. Este campo no se rellena si es .
  • CustomStatus: estado de orquestación personalizada en formato JSON.
  • Salida: la salida de la orquestación como un valor JSON (si se completa la orquestación). Si se produce un error en la orquestación, esta propiedad incluye los detalles del error. Si la orquestación se suspende o finaliza, esta propiedad incluye el motivo de la suspensión o finalización (si existe).
  • RuntimeStatus: uno de los siguientes valores:
    • Pendiente: la instancia está programada, pero aún no se ha iniciado la ejecución.
    • En ejecución: la instancia se está ejecutando.
    • Completado: la instancia se completó normalmente.
    • ContinuedAsNew: la instancia se ha reiniciado con un nuevo historial. Este estado es un estado transitorio.
    • Fallido: La instancia falló con un error.
    • Finalizado: la instancia se detuvo abruptamente.
    • Suspendido: la instancia se suspende y se puede reanudar en un momento posterior.
  • History: el historial de ejecución de la orquestación. Este campo solo se rellena si se establece en .

Nota:

Un orquestador no está marcado como hasta que finalicen todas sus tareas programadas y el orquestador vuelva. En otras palabras, no es suficiente que un orquestador llegue a su instrucción para que se marque como . Esto es especialmente relevante para los casos en los que se usa; esos orquestadores a menudo antes de que se ejecuten todas las tareas programadas.

Este método devuelve null (.NET y Java), undefined (JavaScript) o None (Python) si la instancia no existe.

[FunctionName("GetStatus")]
public static async Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [QueueTrigger("check-status-queue")] string instanceId)
{
    DurableOrchestrationStatus status = await client.GetStatusAsync(instanceId);
    // do something based on the current status.
}

Nota:

El código de C# anterior es para Durable Functions 2.x. Para Durable Functions 1.x, use el atributo en lugar del atributo /> en lugar de . Para obtener más información sobre las diferencias entre versiones, consulte el artículo Durable Functions versiones.

using Microsoft.DurableTask.Client;

// Get the status of an orchestration instance
OrchestrationMetadata? metadata = await client.GetInstanceAsync(instanceId, getInputsAndOutputs: true);
if (metadata != null)
{
    OrchestrationRuntimeStatus status = metadata.RuntimeStatus;
    // do something based on the current status
}

Consultar todas las instancias

Puede usar las API en el SDK de lenguaje para consultar los estados de todas las instancias de orquestación en el centro de tareas. Esta API "list-instances" o "get-status" devuelve una lista de objetos que representan las instancias de orquestación que coinciden con los parámetros de consulta.

[FunctionName("GetAllStatus")]
public static async Task Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestMessage req,
    [DurableClient] IDurableOrchestrationClient client,
    ILogger log)
{
    var noFilter = new OrchestrationStatusQueryCondition();
    OrchestrationStatusQueryResult result = await client.ListInstancesAsync(
        noFilter,
        CancellationToken.None);
    foreach (DurableOrchestrationStatus instance in result.DurableOrchestrationState)
    {
        log.LogInformation(JsonConvert.SerializeObject(instance));
    }

    // Note: ListInstancesAsync only returns the first page of results.
    // To request additional pages provide the result.ContinuationToken
    // to the OrchestrationStatusQueryCondition's ContinuationToken property.
}

Nota:

El código de C# anterior es para Durable Functions 2.x. Para Durable Functions 1.x, debe usar OrchestrationClient atributo en lugar del atributo DurableClient y debe usar el tipo de parámetro DurableOrchestrationClient en lugar de IDurableOrchestrationClient. Para obtener más información sobre las diferencias entre versiones, consulte el artículo Durable Functions versiones.

using Microsoft.DurableTask.Client;

// Query all orchestration instances
AsyncPageable<OrchestrationMetadata> instances = client.GetAllInstancesAsync(new OrchestrationQuery());

await foreach (OrchestrationMetadata instance in instances)
{
    Console.WriteLine(instance.InstanceId);
}

Consulta de instancias con filtros

¿Qué ocurre si no necesita toda la información que proporciona una consulta de instancia estándar? Por ejemplo, ¿qué ocurre si solo busca la hora de creación de la orquestación o el estado del tiempo de ejecución de la orquestación? Restrinja la consulta aplicando filtros.

[FunctionName("QueryStatus")]
public static async Task Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestMessage req,
    [DurableClient] IDurableOrchestrationClient client,
    ILogger log)
{
    // Get the first 100 running or pending instances that were created between 7 and 1 days ago
    var queryFilter = new OrchestrationStatusQueryCondition
    {
        RuntimeStatus = new[]
        {
            OrchestrationRuntimeStatus.Pending,
            OrchestrationRuntimeStatus.Running,
        },
        CreatedTimeFrom = DateTime.UtcNow.Subtract(TimeSpan.FromDays(7)),
        CreatedTimeTo = DateTime.UtcNow.Subtract(TimeSpan.FromDays(1)),
        PageSize = 100,
    };

    OrchestrationStatusQueryResult result = await client.ListInstancesAsync(
        queryFilter,
        CancellationToken.None);
    foreach (DurableOrchestrationStatus instance in result.DurableOrchestrationState)
    {
        log.LogInformation(JsonConvert.SerializeObject(instance));
    }
}

Nota:

El código de C# anterior es para Durable Functions 2.x. Para Durable Functions 1.x, debe usar OrchestrationClient atributo en lugar del atributo DurableClient y debe usar el tipo de parámetro DurableOrchestrationClient en lugar de IDurableOrchestrationClient. Para obtener más información sobre las diferencias entre versiones, consulte el artículo Durable Functions versiones.

using Microsoft.DurableTask.Client;

// Get running or pending instances created in the last 7 days
var query = new OrchestrationQuery
{
    Statuses = new[] { OrchestrationRuntimeStatus.Running, OrchestrationRuntimeStatus.Pending },
    CreatedFrom = DateTime.UtcNow.AddDays(-7),
    CreatedTo = DateTime.UtcNow.AddDays(-1),
    PageSize = 100
};

AsyncPageable<OrchestrationMetadata> instances = client.GetAllInstancesAsync(query);

await foreach (OrchestrationMetadata instance in instances)
{
    Console.WriteLine($"{instance.InstanceId}: {instance.RuntimeStatus}");
}

Finalización de instancias

Si tiene una instancia de orquestación que tarda demasiado tiempo en ejecutarse o necesita detenerla antes de que se complete por cualquier motivo, puede finalizarla.

Los dos parámetros de la API de terminación son un identificador de instancia y una cadena de razones, que escriben en los registros y en el estado de la instancia.

[FunctionName("TerminateInstance")]
public static Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [QueueTrigger("terminate-queue")] string instanceId)
{
    string reason = "Found a bug";
    return client.TerminateAsync(instanceId, reason);
}

Nota:

El código de C# anterior es para Durable Functions 2.x. Para Durable Functions 1.x, debe usar OrchestrationClient atributo en lugar del atributo DurableClient y debe usar el tipo de parámetro DurableOrchestrationClient en lugar de IDurableOrchestrationClient. Para obtener más información sobre las diferencias entre versiones, consulte el artículo Durable Functions versiones.

using Microsoft.DurableTask.Client;

string reason = "Found a bug";
await client.TerminateInstanceAsync(instanceId, reason);

Una instancia terminada finalmente pasa al estado. Pero esta transición no se produce inmediatamente. En su lugar, la operación de finalización se pone en cola en el hub de tareas junto con otras operaciones para esa instancia. Puede usar las API de consulta de instancia para saber cuándo una instancia terminada ha alcanzado realmente el estado .

Nota:

La finalización de la instancia no se propaga actualmente. Las funciones de actividad y las suborquestaciones se ejecutan hasta completarse, independientemente de si finaliza la instancia de orquestación que las llamó.

Suspender y reanudar instancias

Suspender una orquestación le permite detener una orquestación en ejecución. A diferencia de finalizar una orquestación, puede reanudar una orquestación suspendida más adelante.

Los dos parámetros de la API de suspensión son un identificador de instancia y una cadena de motivo, que se escriben en los registros y en el estado de la instancia.

[FunctionName("SuspendResumeInstance")]
public static async Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [QueueTrigger("suspend-resume-queue")] string instanceId)
{
    // To suspend an orchestration
    string suspendReason = "Need to pause workflow";
    await client.SuspendAsync(instanceId, suspendReason);

    // To resume an orchestration
    string resumeReason = "Continue workflow";
    await client.ResumeAsync(instanceId, resumeReason);
}
using Microsoft.DurableTask.Client;

// To suspend an orchestration
string suspendReason = "Need to pause workflow";
await client.SuspendInstanceAsync(instanceId, suspendReason);

// To resume an orchestration
string resumeReason = "Continue workflow";
await client.ResumeInstanceAsync(instanceId, resumeReason);

Una instancia suspendida finalmente realiza la transición al estado. Sin embargo, esta transición no se produce inmediatamente. En su lugar, la operación de suspensión se pone en cola en el hub de tareas junto con otras operaciones para esa instancia. Use las API de consulta de instancia para saber cuándo una instancia en ejecución ha alcanzado realmente el estado .

Cuando se reanuda un orquestador suspendido, su estado cambia de nuevo a su estado anterior.

Envío de eventos a instancias

En algunos escenarios, las funciones de orquestador deben esperar y escuchar eventos externos. Entre los ejemplos en los que este enfoque es útil se incluyen los escenarios de supervisión e interacción humana .

En algunos escenarios, las orquestaciones deben esperar y escuchar eventos externos. Entre los ejemplos en los que este enfoque es útil se incluyen los escenarios de supervisión e interacción humana .

Puede enviar notificaciones de eventos a instancias en ejecución mediante la API de generar eventos del cliente de orquestación. Las orquestaciones pueden escuchar y responder a estos eventos mediante la API de orquestador de esperar a evento externo.

Los parámetros para el evento 'raise' son:

  • Id. de instancia: identificador único de la instancia.
  • Nombre del evento: nombre del evento que se va a enviar.
  • Datos de eventos: una carga serializable en JSON para enviar a la instancia.
[FunctionName("RaiseEvent")]
public static Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [QueueTrigger("event-queue")] string instanceId)
{
    int[] eventData = new int[] { 1, 2, 3 };
    return client.RaiseEventAsync(instanceId, "MyEvent", eventData);
}

Nota:

El código de C# anterior es para Durable Functions 2.x. Para Durable Functions 1.x, debe usar OrchestrationClient atributo en lugar del atributo DurableClient y debe usar el tipo de parámetro DurableOrchestrationClient en lugar de IDurableOrchestrationClient. Para obtener más información sobre las diferencias entre versiones, consulte el artículo Durable Functions versiones.

using Microsoft.DurableTask.Client;

int[] eventData = new int[] { 1, 2, 3 };
await client.RaiseEventAsync(instanceId, "MyEvent", eventData);

Nota:

Si no hay ninguna instancia de orquestación con el identificador de instancia especificado, se descarta el mensaje de evento. Si existe una instancia, pero aún no está esperando el evento, el evento se almacena en el estado de la instancia hasta que esté listo para recibirse y procesarse.

Esperar a que finalice la orquestación

En orquestaciones de larga duración, es posible que desees esperar para obtener los resultados de una orquestación específica. En estos casos, también es útil definir un período de tiempo de espera en la orquestación. Si se supera el tiempo de espera, se devuelve el estado de la orquestación en lugar de los resultados.

Utilice el API "esperar a la finalización o crear respuesta de estado de comprobación" para obtener de forma sincrónica la salida real de una instancia de orquestación. De forma predeterminada, este método tiene un tiempo de espera de diez segundos y un intervalo de sondeo de un segundo.

Esta es una función de desencadenador HTTP de ejemplo que muestra cómo usar esta API:

// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the MIT License. See LICENSE in the project root for license information.

using System;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.DurableTask;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Logging;

namespace VSSample
{
    public static class HttpSyncStart
    {
        private const string Timeout = "timeout";
        private const string RetryInterval = "retryInterval";

        [FunctionName("HttpSyncStart")]
        public static async Task<HttpResponseMessage> Run(
            [HttpTrigger(AuthorizationLevel.Function, methods: "post", Route = "orchestrators/{functionName}/wait")]
            HttpRequestMessage req,
            [DurableClient] IDurableOrchestrationClient 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}'.");

            TimeSpan timeout = GetTimeSpan(req, Timeout) ?? TimeSpan.FromSeconds(30);
            TimeSpan retryInterval = GetTimeSpan(req, RetryInterval) ?? TimeSpan.FromSeconds(1);
            
            return await starter.WaitForCompletionOrCreateCheckStatusResponseAsync(
                req,
                instanceId,
                timeout,
                retryInterval);
        }

        private static TimeSpan? GetTimeSpan(HttpRequestMessage request, string queryParameterName)
        {
            string queryParameterStringValue = request.RequestUri.ParseQueryString()[queryParameterName];
            if (string.IsNullOrEmpty(queryParameterStringValue))
            {
                return null;
            }

            return TimeSpan.FromSeconds(double.Parse(queryParameterStringValue));
        }
    }
}

Los SDK de Durable Task proporcionan un método para esperar a que una orquestación finalice sincrónicamente.

using Microsoft.DurableTask.Client;

// Wait for orchestration to complete with a timeout
OrchestrationMetadata metadata = await client.WaitForInstanceCompletionAsync(
    instanceId,
    timeout: TimeSpan.FromSeconds(30),
    getInputsAndOutputs: true);

if (metadata.RuntimeStatus == OrchestrationRuntimeStatus.Completed)
{
    Console.WriteLine($"Output: {metadata.SerializedOutput}");
}

Utilice la función con la siguiente línea. Use dos segundos para el tiempo de espera y 0,5 segundos para el intervalo de reintento:

curl -X POST "http://localhost:7071/orchestrators/E1_HelloSequence/wait?timeout=2&retryInterval=0.5"

Nota:

El comando cURL anterior supone que tiene una función de orquestador denominada en el proyecto. Debido a cómo se escribe la función de desencadenador HTTP, puede reemplazarla por el nombre de cualquier función de orquestador del proyecto.

Dependiendo del tiempo necesario para obtener la respuesta de la instancia de orquestación, existen dos casos:

  • Las instancias de orquestación finalizan dentro del tiempo de espera definido (en este caso, dos segundos) y la respuesta es la salida de la instancia de orquestación real, entregada de forma sincrónica:
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Date: Thu, 14 Dec 2021 06:14:29 GMT
Transfer-Encoding: chunked

[
    "Hello Tokyo!",
    "Hello Seattle!",
    "Hello London!"
]
  • Las instancias de orquestación no pueden finalizar dentro del tiempo de espera definido y la respuesta es la que está predeterminada como se describe en descubrimiento de URL de API HTTP.
HTTP/1.1 202 Accepted
Content-Type: application/json; charset=utf-8
Date: Thu, 14 Dec 2021 06:13:51 GMT
Location: http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177?taskHub={taskHub}&connection={connection}&code={systemKey}
Retry-After: 10
Transfer-Encoding: chunked

{
    "id": "d3b72dddefce4e758d92f4d411567177",
    "sendEventPostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177/raiseEvent/{eventName}?taskHub={taskHub}&connection={connection}&code={systemKey}",
    "statusQueryGetUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177?taskHub={taskHub}&connection={connection}&code={systemKey}",
    "terminatePostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177/terminate?reason={text}&taskHub={taskHub}&connection={connection}&code={systemKey}",
    "suspendPostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177/suspend?reason={text}&taskHub={taskHub}&connection={connection}&code={systemKey}",
    "resumePostUri": "http://localhost:7071/runtime/webhooks/durabletask/instances/d3b72dddefce4e758d92f4d411567177/resume?reason={text}&taskHub={taskHub}&connection={connection}&code={systemKey}"
}

Nota:

El formato de las direcciones URL del webhook puede diferir, en función de la versión del host de Azure Functions que ejecute. El ejemplo anterior es para el host de Azure Functions 3.0.

Recuperación de las direcciones URL del webhook de administración de HTTP

Utilice un sistema externo para monitorizar o generar eventos en una orquestación. Los sistemas externos se comunican con Durable Functions a través de las direcciones URL de webhook que forman parte de la respuesta predeterminada descrita en detección de direcciones URL de APIHTTP. Las direcciones URL del webhook son accesibles programáticamente mediante la vinculación del cliente de orquestación. En concreto, la API de carga de administración HTTP crea un objeto serializable que contiene estas direcciones URL de webhook.

La API create HTTP management payload tiene un parámetro:

  • Id. de instancia: identificador único de la instancia.

Los métodos devuelven un objeto con las siguientes propiedades de cadena:

  • Id. : el identificador de instancia de la orquestación (debe ser el mismo que la entrada).
  • StatusQueryGetUri: la dirección URL de estado de la instancia de orquestación.
  • SendEventPostUri: La dirección URL para generar evento de la instancia de orquestación.
  • TerminatePostUri: la dirección URL de generación del evento de la instancia de orquestación.
  • PurgeHistoryDeleteUri: la dirección URL del "historial de purga" de la instancia de orquestación.
  • SuspendPostUri: la URL de suspensión de la instancia de orquestación.
  • ResumePostUri: la dirección URL "resume" de la instancia de orquestación.

Las funciones envían instancias de estos objetos a sistemas externos para supervisar o generar eventos en las orquestaciones correspondientes, como se muestra en los ejemplos siguientes.

[FunctionName("SendInstanceInfo")]
public static void SendInstanceInfo(
    [ActivityTrigger] IDurableActivityContext ctx,
    [DurableClient] IDurableOrchestrationClient client,
    [CosmosDB(
        databaseName: "MonitorDB",
        containerName: "HttpManagementPayloads",
        Connection = "CosmosDBConnectionSetting")]out dynamic document)
{
    HttpManagementPayload payload = client.CreateHttpManagementPayload(ctx.InstanceId);

    // send the payload to Azure Cosmos DB
    document = new { Payload = payload, id = ctx.InstanceId };
}

Nota:

El código de C# anterior es para Durable Functions 2.x. Para Durable Functions 1.x, use DurableActivityContext en lugar de IDurableActivityContext, use el atributo OrchestrationClient en lugar del atributo DurableClient y use el tipo de parámetro DurableOrchestrationClient en lugar de IDurableOrchestrationClient. Para obtener más información sobre las diferencias entre versiones, consulte el artículo Durable Functions versiones.

Retroceso de instancias

Si tiene un error de orquestación por un motivo inesperado, restaure la instancia a un estado correcto anteriormente mediante una API diseñada para ese propósito.

Nota:

Esta API no está pensada para reemplazar las directivas de control de errores y reintento adecuadas. En su lugar, está pensado para usarse solo en los casos en los que las instancias de orquestación fallen por razones inesperadas. Las orquestaciones en estados diferentes a (por ejemplo, , , u ) no pueden ser «rebobinadas». Para obtener más información sobre el control de errores y las directivas de reintento, consulte el artículo Control de errores.

Use el método RewindAsync (.NET) o rewind (JavaScript) del enlace de cliente orchestration para volver a colocar la orquestación en el estado Running. Este método también vuelve a ejecutar los errores de ejecución de la actividad o suborchestración que provocaron el error de orquestación.

Por ejemplo, supongamos que tiene un flujo de trabajo que implica una serie de aprobaciones humanas. Supongamos que una serie de funciones de actividad notifican a alguien que necesita su aprobación y espera una respuesta en tiempo real. Después de que todas las actividades de aprobación reciban respuestas o agotan el tiempo de espera, supongamos que se produce un error en otra actividad debido a una configuración incorrecta de la aplicación, como una cadena de conexión de base de datos no válida. El resultado es un error de orquestación en profundidad en el flujo de trabajo. Con la API de RewindAsync (.NET) o rewind (JavaScript), un administrador de aplicaciones puede corregir el error de configuración y rebobinar la orquestación que falló al estado inmediatamente antes del fallo. Ninguno de los pasos de interacción humana debe volver a aprobarse y la orquestación ahora puede completarse correctamente.

Nota:

La característica para rebobinar no admite el rebobinado de instancias de orquestación que utilizan temporizadores durables.

[FunctionName("RewindInstance")]
public static Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [QueueTrigger("rewind-queue")] string instanceId)
{
    string reason = "Orchestrator failed and needs to be revived.";
    return client.RewindAsync(instanceId, reason);
}

Nota:

El código de C# anterior es para Durable Functions 2.x. Para Durable Functions 1.x, debe usar OrchestrationClient atributo en lugar del atributo DurableClient y debe usar el tipo de parámetro DurableOrchestrationClient en lugar de IDurableOrchestrationClient. Para obtener más información sobre las diferencias entre versiones, consulte el artículo Durable Functions versiones.

using Microsoft.DurableTask.Client;

string reason = "Orchestrator failed and needs to be revived.";
await client.RewindInstanceAsync(instanceId, reason);

Reinicio de instancias

Al reiniciar una orquestación se crea una nueva instancia mediante el historial de una instancia de ejecución anterior. Esta característica es útil cuando desea volver a ejecutar una orquestación con el mismo patrón de identificador de instancia e entrada, creando una nueva ejecución basada en el original.

[FunctionName("RestartInstance")]
public static Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [QueueTrigger("restart-queue")] string instanceId)
{
    return client.RestartAsync(instanceId, restartWithNewInstanceId: true);
}

Nota:

El código de C# anterior es para Durable Functions 2.x. Para Durable Functions 1.x, debe usar OrchestrationClient atributo en lugar del atributo DurableClient y debe usar el tipo de parámetro DurableOrchestrationClient en lugar de IDurableOrchestrationClient. Para obtener más información sobre las diferencias entre versiones, consulte el artículo Durable Functions versiones.

using Microsoft.DurableTask.Client;

// Restart an orchestration with a new instance ID
string newInstanceId = await client.RestartInstanceAsync(instanceId, restartWithNewInstanceId: true);
Console.WriteLine($"Restarted as new instance: {newInstanceId}");

// Restart an orchestration keeping the same instance ID
await client.RestartInstanceAsync(instanceId, restartWithNewInstanceId: false);

Purga del historial de instancias

Para quitar todos los datos asociados a una orquestación, purgue el historial de instancias. Por ejemplo, elimine los recursos de almacenamiento asociados a una instancia completada. Use la API de instancia de purga definida por el cliente de orquestación.

En el ejemplo siguiente se muestra cómo purgar una única instancia de orquestación.

[FunctionName("PurgeInstanceHistory")]
public static Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [QueueTrigger("purge-queue")] string instanceId)
{
    return client.PurgeInstanceHistoryAsync(instanceId);
}
using Microsoft.DurableTask.Client;

// Purge a single orchestration instance
PurgeResult result = await client.PurgeInstanceAsync(instanceId);
Console.WriteLine($"Purged {result.PurgedInstanceCount} instance(s).");

En el ejemplo siguiente se muestra una función desencadenada por el temporizador que purga el historial de todas las instancias de orquestación que se completaron después del intervalo de tiempo especificado. En este caso, quita los datos de todas las instancias completadas hace 30 o más días. Esta función de ejemplo está programada para ejecutarse una vez al día, a las 12:00 UTC:

[FunctionName("PurgeInstanceHistory")]
public static Task Run(
    [DurableClient] IDurableOrchestrationClient client,
    [TimerTrigger("0 0 12 * * *")] TimerInfo myTimer)
{
    return client.PurgeInstanceHistoryAsync(
        DateTime.MinValue,
        DateTime.UtcNow.AddDays(-30),  
        new List<OrchestrationStatus>
        {
            OrchestrationStatus.Completed
        });
}

Nota:

El código de C# anterior es para Durable Functions 2.x. Para Durable Functions 1.x, debe usar OrchestrationClient atributo en lugar del atributo DurableClient y debe usar el tipo de parámetro DurableOrchestrationClient en lugar de IDurableOrchestrationClient. Para obtener más información sobre las diferencias entre versiones, consulte el artículo Durable Functions versiones.

using Microsoft.DurableTask.Client;

// Purge completed instances older than 30 days
var filter = new PurgeInstancesFilter(
    CreatedFrom: DateTime.MinValue,
    CreatedTo: DateTime.UtcNow.AddDays(-30),
    Statuses: new[] { OrchestrationRuntimeStatus.Completed });

PurgeResult result = await client.PurgeAllInstancesAsync(filter);
Console.WriteLine($"Purged {result.PurgedInstanceCount} instance(s).");

Nota:

Para que la operación del historial de purga se realice correctamente, el estado en tiempo de ejecución de la instancia de destino debe ser Completado, Finalizado o Erróneo.

Pasos siguientes

Control de versiones

Referencia de API HTTP integrada para la administración de instancias

Introducción a los SDK de Durable Task

Más información sobre el programador de tareas duraderas