Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
As orquestrações em funções duráveis são funções com estado de longa duração que podem ser iniciadas, consultadas, suspensas, retomadas e encerradas usando APIs de gerenciamento incorporadas. Várias outras APIs de gestão de instâncias são também disponibilizadas pela associação do cliente de orquestração das Funções Duráveis, como o envio de eventos externos para instâncias, a purgação do histórico de instâncias, etc. Este artigo aborda em detalhe todas as operações de gestão 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.
Sugestão
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}'.");
}
Observação
O código C# anterior é para Durable Functions 2.x. Para Durable Functions 1.x, deve usar o atributo OrchestrationClient em vez do atributo DurableClient, e deve usar o tipo de parâmetro DurableOrchestrationClient em vez de IDurableOrchestrationClient. Para obter mais informações sobre as diferenças entre versões, consulte o artigo Durable Functions versions .
Ferramentas principais do Azure Functions
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.
Observação
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 connection-string-setting parâmetros e task-hub-name , poderá executar os 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 comando start-new enfileira uma mensagem de início no hub de tarefas de destino, mas a orquestração não é efetivamente executada a menos que haja um processo host de aplicação de funções ativo que possa processar a mensagem.
Observação
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
instanceIdentrada). - 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 é preenchido se
showInputfor 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 do erro. 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 reiniciou-se com um novo histórico. 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
showHistoryestiver definido comotrue.
Observação
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.
}
Observação
O código C# anterior é para Durable Functions 2.x. Para Durable Functions 1.x, deve usar o atributo OrchestrationClient em vez do atributo DurableClient, e deve usar o tipo de parâmetro DurableOrchestrationClient em vez de IDurableOrchestrationClient. Para obter mais informações sobre as diferenças entre versões, consulte o artigo Durable Functions versions .
Ferramentas principais do Azure Functions
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.
Observação
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 durable get-history comando para recuperar o histórico de uma instância de orquestração. Aceita 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.
}
Observação
O código C# anterior é para Durable Functions 2.x. Para Durable Functions 1.x, deve usar o atributo OrchestrationClient em vez do atributo DurableClient, e deve usar o tipo de parâmetro DurableOrchestrationClient em vez de IDurableOrchestrationClient. Para obter mais informações sobre as diferenças entre versões, consulte o artigo Durable Functions versions .
Ferramentas principais do Azure Functions
Também é possível consultar instâncias diretamente, usando o func durable get-instances comando em Core Tools.
Observação
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-instancesexecuçã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));
}
}
Observação
O código C# anterior é para Durable Functions 2.x. Para Durable Functions 1.x, deve usar o atributo OrchestrationClient em vez do atributo DurableClient, e deve usar o tipo de parâmetro DurableOrchestrationClient em vez de IDurableOrchestrationClient. Para obter mais informações sobre as diferenças entre versões, consulte o artigo Durable Functions versions .
Ferramentas principais do Azure Functions
Nas Ferramentas Principais do Azure Functions, você também pode usar o durable get-instances comando com filtros. Além dos parâmetros top, continuation-token, connection-string-setting e task-hub-name acima mencionados, você pode usar três parâmetros de filtro (created-after, created-before e runtime-status).
Observação
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 aceitas formatadas segundo a norma ISO 8601. -
created-before(opcional): Recupere as instâncias criadas antes desta data/hora (UTC). Datas e horas formatadas de acordo com a norma ISO 8601 são aceites. -
runtime-status(opcional): recupere as instâncias com um status específico (por exemplo, em execução ou concluídas). Pode fornecer múltiplos estados separados por espaços. -
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-instancesexecuçã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 não fornecer quaisquer filtros (created-after, created-before ou runtime-status), o comando simplesmente recuperará instâncias top, sem considerar o status de execução ou 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);
}
Observação
O código C# anterior é para Durable Functions 2.x. Para Durable Functions 1.x, deve usar o atributo OrchestrationClient em vez do atributo DurableClient, e deve usar o tipo de parâmetro DurableOrchestrationClient 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á colocada na fila do hub de tarefas juntamente 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.
Observação
Atualmente, o encerramento da instância não se propaga. As funções de atividade e as suborquestrações continuam a ser executadas até à sua conclusão, independentemente de 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)
{
// 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);
}
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á colocada na fila 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, o seu estado será alterado novamente para Running.
Ferramentas principais do Azure Functions
Você também pode encerrar uma instância de orquestração diretamente, usando o func durable terminate comando em Core Tools.
Observação
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 através da API de raise event do cliente de orquestração. As orquestrações podem ouvir e responder a esses eventos usando a API do orquestrador de espera de evento externo.
Os parâmetros para gerar evento 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);
}
Observação
O código C# anterior é para Durable Functions 2.x. Para Durable Functions 1.x, deve usar o atributo OrchestrationClient em vez do atributo DurableClient, e deve usar o tipo de parâmetro DurableOrchestrationClient em vez de IDurableOrchestrationClient. Para obter mais informações sobre as diferenças entre versões, consulte o artigo Durable Functions versions .
Observação
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.
Ferramentas principais do Azure Functions
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.
Observação
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, deve ser retornado o estado da orquestração em vez dos resultados.
"A API “esperar pela conclusão ou criar resposta de verificação de estado” 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"
Observação
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}"
}
Observação
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 comunicar-se com as Funções Duráveis através das URLs de webhook que são parte da resposta padrão descrita na descoberta de URL de API HTTP. Como alternativa, as URLs do webhook podem ser acedidas programaticamente usando a vinculação do cliente de orquestração. Especificamente, a API de criação de carga útil de gestão HTTP pode ser usada para obter um objeto serializável que contenha os URLs de webhook.
A API de criação de carga útil de gerenciamento HTTP possui 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
InstanceIdentrada). - StatusQueryGetUri: A URL de status da instância de orquestração.
- SendEventPostUri: O URL de "gerar evento" da instância de orquestração.
- TerminatePostUri: URL "terminate" da instância de orquestração.
- PurgeHistoryDeleteUri: A URL do histórico de purga da instância de orquestração.
- suspendPostUri: O 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 };
}
Observação
O código C# anterior é para Durable Functions 2.x. Para Durable Functions 1.x, deve usar DurableActivityContext em vez de IDurableActivityContext, o atributo OrchestrationClient em vez do atributo DurableClient, e o tipo de parâmetro DurableOrchestrationClient em vez de IDurableOrchestrationClient. Para obter mais informações sobre as diferenças entre versões, consulte o artigo Durable Functions versions .
Retroceder instâncias (visualização)
Se tiveres uma falha de orquestração por um motivo imprevisto, poderás retroceder essa instância para um estado previamente saudável usando uma API destinada a esse fim.
Observação
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 método RewindAsync (.NET) ou rewind (JavaScript) da ligação do cliente de orquestração para colocar a orquestração de volta no estado Running. 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 RewindAsync API (.NET) ou rewind (JavaScript), um administrador de aplicativo pode corrigir o erro de configuração e retroceder a 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.
Observação
O recurso de rebobinar não oferece suporte a instâncias de orquestração que utilizam 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);
}
Observação
O código C# anterior é para Durable Functions 2.x. Para Durable Functions 1.x, deve usar o atributo OrchestrationClient em vez do atributo DurableClient, e deve usar o tipo de parâmetro DurableOrchestrationClient em vez de IDurableOrchestrationClient. Para obter mais informações sobre as diferenças entre versões, consulte o artigo Durable Functions versions .
Ferramentas principais do Azure Functions
Você também pode retroceder diretamente uma instância de orquestração usando o comando func durable rewind no Core Tools.
Observação
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 reiniciar 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
});
}
Observação
O código C# anterior é para Durable Functions 2.x. Para Durable Functions 1.x, deve usar o atributo OrchestrationClient em vez do atributo DurableClient, e deve usar o tipo de parâmetro DurableOrchestrationClient em vez de IDurableOrchestrationClient. Para obter mais informações sobre as diferenças entre versões, consulte o artigo Durable Functions versions .
Observação
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.
Ferramentas principais do Azure Functions
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 purgadas por estado de execução.
Observação
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 e horas formatadas de acordo com a norma ISO 8601 são aceites. -
created-before(opcional): Limpe o histórico de instâncias criadas antes dessa data/hora (UTC). Datas e horas formatadas de acordo com a norma ISO 8601 são aceites. -
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 múltiplos estados separados por espaços. -
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.
Observação
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