Gerenciar instâncias em funções duráveis no Azure
As orquestrações em funções duráveis são funções com monitoração de estado de longa duração que podem ser iniciadas, consultadas, suspensas, retomadas e encerradas usando APIs de gerenciamento internas. Várias outras APIs de gerenciamento de instâncias também são expostas pela vinculação do cliente de orquestração de funções duráveis, como o envio de eventos externos para instâncias, limpeza do histórico de instâncias, etc. Este artigo aborda os detalhes de todas as operações de gerenciamento de instâncias suportadas.
Iniciar instâncias
O método start-new (ou schedule-new) na ligação do cliente de orquestração inicia uma nova instância de orquestração. Internamente, esse método grava uma mensagem por meio do provedor de armazenamento Durable Functions e, em seguida, retorna. Esta mensagem dispara de forma assíncrona o início de uma função de orquestração com o nome especificado.
Os parâmetros para iniciar uma nova instância de orquestração são os seguintes:
- Nome: O nome da função orquestradora a ser agendada.
- Entrada: Qualquer dado serializável em JSON que deve ser passado como entrada para a função orchestrator.
- InstanceId: (Opcional) A ID exclusiva da instância. Se você não especificar esse parâmetro, o método usará uma ID aleatória.
Gorjeta
Use um identificador aleatório para o ID da instância sempre que possível. IDs de instância aleatória ajudam a garantir uma distribuição de carga igual quando você dimensiona funções do orquestrador em várias VMs. O momento adequado para usar IDs de instância não aleatórias é quando o ID deve vir de uma fonte externa ou quando você está implementando o padrão singleton orchestrator .
O código a seguir é uma função de exemplo que inicia uma nova instância de orquestração:
[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
O código C# anterior é para Durable Functions 2.x. Para Durable Functions 1.x, você deve usar atributo em vez do atributo DurableClient
e deve usar OrchestrationClient
o DurableOrchestrationClient
tipo de parâmetro em vez de IDurableOrchestrationClient
. Para obter mais informações sobre as diferenças entre versões, consulte o artigo Durable Functions versions .
Azure Functions Core Tools
Você também pode iniciar uma instância diretamente usando o func durable start-new
comando em Core Tools, que usa os seguintes parâmetros:
function-name
(obrigatório): Nome da função a iniciar.input
(opcional): Entrada para a função, em linha ou através de um arquivo JSON. Para arquivos, adicione um prefixo ao caminho para o arquivo com@
, como@path/to/file.json
.id
(opcional): ID da instância de orquestração. Se você não especificar esse parâmetro, o comando usará um GUID aleatório.connection-string-setting
(opcional): Nome da configuração do aplicativo que contém a cadeia de conexão de armazenamento a ser usada. O padrão é AzureWebJobsStorage.task-hub-name
(opcional): Nome do hub de tarefas Funções Duráveis a ser usado. O padrão é DurableFunctionsHub. Você também pode definir isso em host.json usando durableTask:HubName.
Nota
Os comandos das Ferramentas Principais pressupõem que você os esteja executando a partir do diretório raiz de um aplicativo de função. Se você fornecer explicitamente os parâmetros e task-hub-name
, poderá executar os connection-string-setting
comandos de qualquer diretório. Embora você possa executar esses comandos sem um host de aplicativo de função em execução, você pode achar que não pode observar alguns efeitos, a menos que o host esteja em execução. Por exemplo, o start-new
comando enfileira uma mensagem inicial no hub de tarefas de destino, mas a orquestração não é executada na verdade, a menos que haja um processo de host de aplicativo de função em execução que possa processar a mensagem.
Nota
Atualmente, os comandos das Ferramentas Principais só têm suporte ao usar o provedor de Armazenamento do Azure padrão para o estado de tempo de execução persistente.
O comando a seguir inicia a função chamada HelloWorld e passa o conteúdo do arquivo counter-data.json
para ela:
func durable start-new --function-name HelloWorld --input @counter-data.json --task-hub-name TestTaskHub
Instâncias de consulta
Depois de iniciar novas instâncias de orquestração, você provavelmente precisará consultar seu status de tempo de execução para saber se elas estão em execução, foram concluídas ou falharam.
O método get-status na vinculação do cliente de orquestração consulta o status de uma instância de orquestração.
Ele usa um instanceId
(obrigatório), showHistory
(opcional), showHistoryOutput
(opcional) e showInput
(opcional) como parâmetros.
showHistory
: Se definido comotrue
, a resposta contém o histórico de execução.showHistoryOutput
: Se definido comotrue
, o histórico de execução contém saídas de atividade.showInput
: Se definido comofalse
, a resposta não conterá a entrada da função. O valor predefinido étrue
.
O método retorna um objeto com as seguintes propriedades:
- Nome: O nome da função orquestradora.
- InstanceId: O ID da instância da orquestração (deve ser o mesmo que a
instanceId
entrada). - CreatedTime: A hora em que a função orquestradora começou a ser executada.
- LastUpdatedTime: A hora em que a orquestração foi verificada pela última vez.
- Entrada: A entrada da função como um valor JSON. Este campo não será preenchido se
showInput
for falso. - CustomStatus: Status de orquestração personalizado no formato JSON.
- Saída: A saída da função como um valor JSON (se a função tiver sido concluída). Se a função orchestrator falhou, esta propriedade inclui os detalhes da falha. Se a função de orquestrador foi suspensa ou encerrada, esta propriedade inclui o motivo da suspensão ou rescisão (se houver).
- RuntimeStatus: Um dos seguintes valores:
- Pendente: A instância foi agendada, mas ainda não começou a ser executada.
- Em execução: a instância começou a ser executada.
- Concluído: A instância foi concluída normalmente.
- ContinuedAsNew: A instância recomeçou-se com uma nova história. Este estado é um estado transitório.
- Falha: A instância falhou com um erro.
- Encerrado: A instância foi interrompida abruptamente.
- Suspenso: A instância foi suspensa e pode ser retomada posteriormente.
- História: O histórico de execução da orquestração. Este campo só será preenchido se
showHistory
estiver definido comotrue
.
Nota
Um orquestrador não é marcado como Completed
até que todas as suas tarefas programadas tenham terminado e o orquestrador tenha retornado. Por outras palavras, não basta que um orquestrador chegue à sua return
declaração para que seja marcado como Completed
. Isto é particularmente relevante para os casos em que WhenAny
é usado, esses orquestradores muitas vezes return
antes de todas as tarefas programadas terem sido executadas.
Esse método retorna null
(.NET e Java), undefined
(JavaScript) ou None
(Python) se a instância não existir.
[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
O código C# anterior é para Durable Functions 2.x. Para Durable Functions 1.x, você deve usar atributo em vez do atributo DurableClient
e deve usar OrchestrationClient
o DurableOrchestrationClient
tipo de parâmetro em vez de IDurableOrchestrationClient
. Para obter mais informações sobre as diferenças entre versões, consulte o artigo Durable Functions versions .
Azure Functions Core Tools
Também é possível obter o status de uma instância de orquestração diretamente usando o func durable get-runtime-status
comando em Core Tools.
Nota
Atualmente, os comandos das Ferramentas Principais só têm suporte ao usar o provedor de Armazenamento do Azure padrão para o estado de tempo de execução persistente.
O durable get-runtime-status
comando usa os seguintes parâmetros:
id
(obrigatório): ID da instância de orquestração.show-input
(opcional): Se definido comotrue
, a resposta contém a entrada da função. O valor predefinido éfalse
.show-output
(opcional): Se definido comotrue
, a resposta contém a saída da função. O valor predefinido éfalse
.connection-string-setting
(opcional): Nome da configuração do aplicativo que contém a cadeia de conexão de armazenamento a ser usada. A predefinição éAzureWebJobsStorage
.task-hub-name
(opcional): Nome do hub de tarefas Funções Duráveis a ser usado. A predefinição éDurableFunctionsHub
. Ele também pode ser definido em host.json, usando durableTask:HubName.
O comando a seguir recupera o status (incluindo entrada e saída) de uma instância com um ID de instância de orquestração de 0ab8c55a66644d68a3a8b220b12d209c. Ele assume que você está executando o func
comando a partir do diretório raiz do aplicativo de função:
func durable get-runtime-status --id 0ab8c55a66644d68a3a8b220b12d209c --show-input true --show-output true
Você pode usar o comando para recuperar o durable get-history
histórico de uma instância de orquestração. Ele leva os seguintes parâmetros:
id
(obrigatório): ID da instância de orquestração.connection-string-setting
(opcional): Nome da configuração do aplicativo que contém a cadeia de conexão de armazenamento a ser usada. A predefinição éAzureWebJobsStorage
.task-hub-name
(opcional): Nome do hub de tarefas Funções Duráveis a ser usado. A predefinição éDurableFunctionsHub
. Ele também pode ser definido em host.json, usando durableTask:HubName.
func durable get-history --id 0ab8c55a66644d68a3a8b220b12d209c
Consultar todas as instâncias
Você pode usar APIs em seu SDK de idioma para consultar os status de todas as instâncias de orquestração em seu hub de tarefas. Essa API "list-instances" ou "get-status" retorna uma lista de objetos que representam as instâncias de orquestração correspondentes aos 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
O código C# anterior é para Durable Functions 2.x. Para Durable Functions 1.x, você deve usar atributo em vez do atributo DurableClient
e deve usar OrchestrationClient
o DurableOrchestrationClient
tipo de parâmetro em vez de IDurableOrchestrationClient
. Para obter mais informações sobre as diferenças entre versões, consulte o artigo Durable Functions versions .
Azure Functions Core Tools
Também é possível consultar instâncias diretamente, usando o func durable get-instances
comando em Core Tools.
Nota
Atualmente, os comandos das Ferramentas Principais só têm suporte ao usar o provedor de Armazenamento do Azure padrão para o estado de tempo de execução persistente.
O durable get-instances
comando usa os seguintes parâmetros:
top
(opcional): Este comando suporta paginação. Esse parâmetro corresponde ao número de instâncias recuperadas por solicitação. O padrão é 10.continuation-token
(opcional): um token para indicar qual página ou seção de instâncias deve ser recuperada. Cadaget-instances
execução retorna um token para o próximo conjunto de instâncias.connection-string-setting
(opcional): Nome da configuração do aplicativo que contém a cadeia de conexão de armazenamento a ser usada. A predefinição éAzureWebJobsStorage
.task-hub-name
(opcional): Nome do hub de tarefas Funções Duráveis a ser usado. A predefinição éDurableFunctionsHub
. Ele também pode ser definido em host.json, usando durableTask:HubName.
func durable get-instances
Consultar instâncias com filtros
E se você realmente não precisar de todas as informações que uma consulta de instância padrão pode fornecer? Por exemplo, e se você estiver apenas procurando o tempo de criação da orquestração ou o status do tempo de execução da orquestração? Você pode restringir sua 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 day(s) 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
O código C# anterior é para Durable Functions 2.x. Para Durable Functions 1.x, você deve usar atributo em vez do atributo DurableClient
e deve usar OrchestrationClient
o DurableOrchestrationClient
tipo de parâmetro em vez de IDurableOrchestrationClient
. Para obter mais informações sobre as diferenças entre versões, consulte o artigo Durable Functions versions .
Azure Functions Core Tools
Nas Ferramentas Principais do Azure Functions, você também pode usar o durable get-instances
comando com filtros. Além dos parâmetros , , , e acima mencionados, você pode usar três parâmetros top
de filtro (created-after
, continuation-token
created-before
connection-string-setting
, e ).task-hub-name
runtime-status
Nota
Atualmente, os comandos das Ferramentas Principais só têm suporte ao usar o provedor de Armazenamento do Azure padrão para o estado de tempo de execução persistente.
A seguir estão os parâmetros para o durable get-instances
comando.
created-after
(opcional): Recupere as instâncias criadas após esta data/hora (UTC). Datas/datas aceites formatadas ISO 8601.created-before
(opcional): Recupere as instâncias criadas antes desta data/hora (UTC). Datas/datas aceites formatadas ISO 8601.runtime-status
(opcional): recupere as instâncias com um status específico (por exemplo, em execução ou concluídas). Pode fornecer vários status (espaço separado).top
(opcional): Número de instâncias recuperadas por solicitação. O padrão é 10.continuation-token
(opcional): um token para indicar qual página ou seção de instâncias deve ser recuperada. Cadaget-instances
execução retorna um token para o próximo conjunto de instâncias.connection-string-setting
(opcional): Nome da configuração do aplicativo que contém a cadeia de conexão de armazenamento a ser usada. A predefinição éAzureWebJobsStorage
.task-hub-name
(opcional): Nome do hub de tarefas Funções Duráveis a ser usado. A predefinição éDurableFunctionsHub
. Ele também pode ser definido em host.json, usando durableTask:HubName.
Se você não fornecer nenhum filtro (created-after
, , ou ), o comando simplesmente recuperará top
instâncias, created-before
sem considerar o status do tempo de execução ou runtime-status
o tempo de criação.
func durable get-instances --created-after 2021-03-10T13:57:31Z --created-before 2021-03-10T23:59Z --top 15
Encerrar instâncias
Se você tiver uma instância de orquestração que está demorando muito para ser executada, ou se você só precisa pará-la antes que ela seja concluída por qualquer motivo, você pode encerrá-la.
Os dois parâmetros para a API de encerramento são um ID de instância e uma cadeia de caracteres de motivo , que são gravados em logs e no status da instância.
[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
O código C# anterior é para Durable Functions 2.x. Para Durable Functions 1.x, você deve usar atributo em vez do atributo DurableClient
e deve usar OrchestrationClient
o DurableOrchestrationClient
tipo de parâmetro em vez de IDurableOrchestrationClient
. Para obter mais informações sobre as diferenças entre versões, consulte o artigo Durable Functions versions .
Uma instância encerrada acabará por transitar para o Terminated
estado. No entanto, essa transição não acontecerá imediatamente. Em vez disso, a operação de encerramento será enfileirada no hub de tarefas junto com outras operações para essa instância. Você pode usar as APIs de consulta de instância para saber quando uma instância encerrada realmente atingiu o Terminated
estado.
Nota
Atualmente, o encerramento da instância não se propaga. As funções de atividade e as suborquestrações são executadas até a conclusão, independentemente de você ter encerrado a instância de orquestração que as chamou.
Suspender e retomar instâncias
Suspender uma orquestração permite que você interrompa uma orquestração em execução. Ao contrário da rescisão, você tem a opção de retomar um orquestrador suspenso em um momento posterior.
Os dois parâmetros para a API de suspensão são um ID de instância e uma cadeia de caracteres de motivo, que são gravados em logs e no status da instância.
[FunctionName("SuspendResumeInstance")]
public static async Task Run(
[DurableClient] IDurableOrchestrationClient client,
[QueueTrigger("suspend-resume-queue")] string instanceId)
{
string suspendReason = "Need to pause workflow";
await client.SuspendAsync(instanceId, suspendReason);
// Wait for 30 seconds to ensure that the orchestrator state is updated to suspended.
DateTime dueTime = context.CurrentUtcDateTime.AddSeconds(30);
await context.CreateTimer(dueTime, CancellationToken.None);
string resumeReason = "Continue workflow";
await client.ResumeAsync(instanceId, resumeReason);
}
Uma instância suspensa acabará por transitar para o Suspended
estado. No entanto, essa transição não acontecerá imediatamente. Em vez disso, a operação de suspensão será enfileirada no hub de tarefas junto com outras operações para essa instância. Você pode usar as APIs de consulta de instância para saber quando uma instância em execução realmente atingiu o estado Suspenso.
Quando um orquestrador suspenso é retomado, seu status será alterado novamente para Running
.
Azure Functions Core Tools
Você também pode encerrar uma instância de orquestração diretamente, usando o func durable terminate
comando em Core Tools.
Nota
Atualmente, os comandos das Ferramentas Principais só têm suporte ao usar o provedor de Armazenamento do Azure padrão para o estado de tempo de execução persistente.
O durable terminate
comando usa os seguintes parâmetros:
id
(obrigatório): ID da instância de orquestração a ser encerrada.reason
(opcional): Motivo da rescisão.connection-string-setting
(opcional): Nome da configuração do aplicativo que contém a cadeia de conexão de armazenamento a ser usada. A predefinição éAzureWebJobsStorage
.task-hub-name
(opcional): Nome do hub de tarefas Funções Duráveis a ser usado. A predefinição éDurableFunctionsHub
. Ele também pode ser definido em host.json, usando durableTask:HubName.
O comando a seguir encerra uma instância de orquestração com uma ID de 0ab8c55a66644d68a3a8b220b12d209c:
func durable terminate --id 0ab8c55a66644d68a3a8b220b12d209c --reason "Found a bug"
Enviar eventos para instâncias
Em alguns cenários, as funções do orquestrador precisam esperar e ouvir eventos externos. Exemplos de cenários em que isso é útil incluem os cenários de monitoramento e interação humana.
Você pode enviar notificações de eventos para instâncias em execução usando a API de evento raise do cliente de orquestração. As orquestrações podem ouvir e responder a esses eventos usando a API do orquestrador de eventos externo de espera.
Os parâmetros para o evento raise são os seguintes:
- ID da instância: a ID exclusiva da instância.
- Nome do evento: o nome do evento a ser enviado.
- Dados do evento: uma carga útil serializável em JSON para enviar à instância.
[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
O código C# anterior é para Durable Functions 2.x. Para Durable Functions 1.x, você deve usar atributo em vez do atributo DurableClient
e deve usar OrchestrationClient
o DurableOrchestrationClient
tipo de parâmetro em vez de IDurableOrchestrationClient
. Para obter mais informações sobre as diferenças entre versões, consulte o artigo Durable Functions versions .
Nota
Se não houver nenhuma instância de orquestração com o ID de instância especificado, a mensagem de evento será descartada. Se uma instância existir, mas ainda não estiver aguardando o evento, o evento será armazenado no estado da instância até que esteja pronto para ser recebido e processado.
Azure Functions Core Tools
Você também pode elevar um evento para uma instância de orquestração diretamente, usando o func durable raise-event
comando em Core Tools.
Nota
Atualmente, os comandos das Ferramentas Principais só têm suporte ao usar o provedor de Armazenamento do Azure padrão para o estado de tempo de execução persistente.
O durable raise-event
comando usa os seguintes parâmetros:
id
(obrigatório): ID da instância de orquestração.event-name
: Nome do evento a angariar.event-data
(opcional): Dados a serem enviados para a instância de orquestração. Esse pode ser o caminho para um arquivo JSON ou você pode fornecer os dados diretamente na linha de comando.connection-string-setting
(opcional): Nome da configuração do aplicativo que contém a cadeia de conexão de armazenamento a ser usada. A predefinição éAzureWebJobsStorage
.task-hub-name
(opcional): Nome do hub de tarefas Funções Duráveis a ser usado. A predefinição éDurableFunctionsHub
. Ele também pode ser definido em host.json, usando durableTask:HubName.
func durable raise-event --id 0ab8c55a66644d68a3a8b220b12d209c --event-name MyEvent --event-data @eventdata.json
func durable raise-event --id 1234567 --event-name MyOtherEvent --event-data 3
Aguarde a conclusão da orquestração
Em orquestrações de longa duração, você pode querer esperar e obter os resultados de uma orquestração. Nesses casos, também é útil poder definir um período de tempo limite na orquestração. Se o tempo limite for excedido, o estado da orquestração deve ser retornado em vez dos resultados.
A API "aguardar a conclusão ou criar resposta de status de verificação" pode ser usada para obter a saída real de uma instância de orquestração de forma síncrona. Por padrão, esse método tem um tempo limite padrão de 10 segundos e um intervalo de sondagem de 1 segundo.
Aqui está um exemplo de função HTTP-trigger que demonstra como usar essa 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));
}
}
}
Chame a função com a seguinte linha. Use 2 segundos para o tempo limite e 0,5 segundo para o intervalo de repetição:
curl -X POST "http://localhost:7071/orchestrators/E1_HelloSequence/wait?timeout=2&retryInterval=0.5"
Nota
O comando cURL acima pressupõe que você tenha uma função orchestrator nomeada E1_HelloSequence
em seu projeto. Devido a como a função de gatilho HTTP é escrita, você pode substituí-la pelo nome de qualquer função orquestradora em seu projeto.
Dependendo do tempo necessário para obter a resposta da instância de orquestração, há dois casos:
- As instâncias de orquestração são concluídas dentro do tempo limite definido (neste caso, 2 segundos), e a resposta é a saída real da instância de orquestração, entregue de forma síncrona:
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!"
]
- As instâncias de orquestração não podem ser concluídas dentro do tempo limite definido e a resposta é a padrão descrita na descoberta 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
O formato das URLs do webhook pode ser diferente, dependendo da versão do host do Azure Functions que você está executando. O exemplo anterior é para o host do Azure Functions 3.0.
Recuperar URLs de webhook de gerenciamento HTTP
Você pode usar um sistema externo para monitorar ou elevar eventos a uma orquestração. Os sistemas externos podem se comunicar com funções duráveis por meio das URLs de webhook que fazem parte da resposta padrão descrita na descoberta de URL de API HTTP. Como alternativa, as URLs do webhook podem ser acessadas programaticamente usando a associação do cliente de orquestração. Especificamente, a API de carga útil de gerenciamento HTTP de criação pode ser usada para obter um objeto serializável que contenha essas URLs de webhook.
A API de carga útil de gerenciamento HTTP create tem um parâmetro:
- ID da instância: a ID exclusiva da instância.
Os métodos retornam um objeto com as seguintes propriedades de cadeia de caracteres:
- Id: O ID da instância da orquestração (deve ser o mesmo que a
InstanceId
entrada). - StatusQueryGetUri: A URL de status da instância de orquestração.
- SendEventPostUri: A URL de "evento de aumento" da instância de orquestração.
- TerminatePostUri: A URL "terminate" da instância de orquestração.
- PurgeHistoryDeleteUri: A URL "purge history" da instância de orquestração.
- suspendPostUri: A URL "suspend" da instância de orquestração.
- resumePostUri: A URL "resume" da instância de orquestração.
As funções podem enviar instâncias desses objetos para sistemas externos para monitorar ou gerar eventos nas orquestrações correspondentes, conforme mostrado nos exemplos a seguir:
[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
O código C# anterior é para Durable Functions 2.x. Para Durable Functions 1.x, você deve usar em vez de , você deve usar o atributo em vez do atributo e você deve usar DurableActivityContext
o DurableOrchestrationClient
OrchestrationClient
tipo de DurableClient
parâmetro em vez de IDurableOrchestrationClient
IDurableActivityContext
. Para obter mais informações sobre as diferenças entre versões, consulte o artigo Durable Functions versions .
Retroceder instâncias (visualização)
Se você tiver uma falha de orquestração por um motivo inesperado, poderá retroceder a instância para um estado anteriormente íntegro usando uma API criada para essa finalidade.
Nota
Esta API não se destina a ser um substituto para o tratamento adequado de erros e políticas de novas tentativas. Em vez disso, destina-se a ser usado apenas nos casos em que as instâncias de orquestração falham por razões inesperadas. Orquestrações em estados diferentes de Failed
(por exemplo, , Running
, Pending
, Terminated
Completed
) não podem ser "rebobinadas". Para obter mais informações sobre políticas de tratamento de erros e novas tentativas, consulte o artigo Tratamento de erros.
Use o RewindAsync
método (.NET) ou rewind
(JavaScript) da ligação do cliente de orquestração para colocar a orquestração de volta no estado de execução . Esse método também executará novamente as falhas de execução de atividade ou suborquestração que causaram a falha de orquestração.
Por exemplo, digamos que você tenha um fluxo de trabalho envolvendo uma série de aprovações humanas. Suponha que há uma série de funções de atividade que notificam alguém de que sua aprovação é necessária e aguardam a resposta em tempo real. Depois que todas as atividades de aprovação tiverem recebido respostas ou expirado, suponha que outra atividade falhe devido a uma configuração incorreta do aplicativo, como uma cadeia de conexão de banco de dados inválida. O resultado é uma falha de orquestração profunda no fluxo de trabalho. Com a API (.NET) ou rewind
(JavaScript), um administrador de aplicativo pode corrigir o erro de configuração e retroceder a RewindAsync
orquestração com falha de volta ao estado imediatamente antes da falha. Nenhuma das etapas de interação humana precisa ser reaprovada, e a orquestração agora pode ser concluída com sucesso.
Nota
O recurso de retrocesso não oferece suporte a instâncias de orquestração de rebobinagem que usam temporizadores duráveis.
[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
O código C# anterior é para Durable Functions 2.x. Para Durable Functions 1.x, você deve usar atributo em vez do atributo DurableClient
e deve usar OrchestrationClient
o DurableOrchestrationClient
tipo de parâmetro em vez de IDurableOrchestrationClient
. Para obter mais informações sobre as diferenças entre versões, consulte o artigo Durable Functions versions .
Azure Functions Core Tools
Você também pode retroceder uma instância de orquestração diretamente usando o func durable rewind
comando em Core Tools.
Nota
Atualmente, os comandos das Ferramentas Principais só têm suporte ao usar o provedor de Armazenamento do Azure padrão para o estado de tempo de execução persistente.
O durable rewind
comando usa os seguintes parâmetros:
id
(obrigatório): ID da instância de orquestração.reason
(opcional): Motivo para rebobinar a instância de orquestração.connection-string-setting
(opcional): Nome da configuração do aplicativo que contém a cadeia de conexão de armazenamento a ser usada. A predefinição éAzureWebJobsStorage
.task-hub-name
(opcional): Nome do hub de tarefas Funções Duráveis a ser usado. Por padrão, o nome do hub de tarefas no arquivo host.json é usado.
func durable rewind --id 0ab8c55a66644d68a3a8b220b12d209c --reason "Orchestrator failed and needs to be revived."
Limpar histórico de instâncias
Para remover todos os dados associados a uma orquestração, você pode limpar o histórico de instâncias. Por exemplo, talvez você queira excluir todos os recursos de armazenamento associados a uma instância concluída. Para fazer isso, use a API de instância de limpeza definida pelo cliente de orquestração.
Este primeiro exemplo mostra como limpar uma única instância de orquestração.
[FunctionName("PurgeInstanceHistory")]
public static Task Run(
[DurableClient] IDurableOrchestrationClient client,
[QueueTrigger("purge-queue")] string instanceId)
{
return client.PurgeInstanceHistoryAsync(instanceId);
}
O próximo exemplo mostra uma função acionada por temporizador que limpa o histórico de todas as instâncias de orquestração concluídas após o intervalo de tempo especificado. Nesse caso, ele remove dados de todas as instâncias concluídas há 30 ou mais dias. Esta função de exemplo está programada para ser executada uma vez por dia, às 12:00 PM 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
O código C# anterior é para Durable Functions 2.x. Para Durable Functions 1.x, você deve usar atributo em vez do atributo DurableClient
e deve usar OrchestrationClient
o DurableOrchestrationClient
tipo de parâmetro em vez de IDurableOrchestrationClient
. Para obter mais informações sobre as diferenças entre versões, consulte o artigo Durable Functions versions .
Nota
Para que a operação do histórico de limpeza seja bem-sucedida, o status do tempo de execução da instância de destino deve ser Concluído, Encerrado ou Falhado.
Azure Functions Core Tools
Você pode limpar o histórico de uma instância de orquestração usando o func durable purge-history
comando em Ferramentas principais. Semelhante ao segundo exemplo de C# na seção anterior, ele limpa o histórico de todas as instâncias de orquestração criadas durante um intervalo de tempo especificado. Você pode filtrar ainda mais instâncias limpas por status de tempo de execução.
Nota
Atualmente, os comandos das Ferramentas Principais só têm suporte ao usar o provedor de Armazenamento do Azure padrão para o estado de tempo de execução persistente.
O durable purge-history
comando tem vários parâmetros:
created-after
(opcional): Limpe o histórico de instâncias criadas após essa data/hora (UTC). Datas/datas aceites formatadas ISO 8601.created-before
(opcional): Limpe o histórico de instâncias criadas antes dessa data/hora (UTC). Datas/datas aceites formatadas ISO 8601.runtime-status
(opcional): limpe o histórico de instâncias com um status específico (por exemplo, em execução ou concluída). Pode fornecer vários status (espaço separado).connection-string-setting
(opcional): Nome da configuração do aplicativo que contém a cadeia de conexão de armazenamento a ser usada. A predefinição éAzureWebJobsStorage
.task-hub-name
(opcional): Nome do hub de tarefas Funções Duráveis a ser usado. Por padrão, o nome do hub de tarefas no arquivo host.json é usado.
O comando a seguir exclui o histórico de todas as instâncias com falha criadas antes de 14 de novembro de 2021 às 19h35 (UTC).
func durable purge-history --created-before 2021-11-14T19:35:00.0000000Z --runtime-status failed
Excluir um hub de tarefas
Usando o func durable delete-task-hub
comando em Ferramentas Principais, você pode excluir todos os artefatos de armazenamento associados a um hub de tarefas específico, incluindo tabelas de armazenamento do Azure, filas e blobs.
Nota
Atualmente, os comandos das Ferramentas Principais só têm suporte ao usar o provedor de Armazenamento do Azure padrão para o estado de tempo de execução persistente.
O durable delete-task-hub
comando tem dois parâmetros:
connection-string-setting
(opcional): Nome da configuração do aplicativo que contém a cadeia de conexão de armazenamento a ser usada. A predefinição éAzureWebJobsStorage
.task-hub-name
(opcional): Nome do hub de tarefas Funções Duráveis a ser usado. Por padrão, o nome do hub de tarefas no arquivo host.json é usado.
O comando a seguir exclui todos os dados de armazenamento do Azure associados ao hub de UserTest
tarefas.
func durable delete-task-hub --task-hub-name UserTest