Partilhar via


Encadeamento de funções no Durable Functions – Exemplo de sequência hello

O encadeamento de funções refere-se ao padrão de execução de uma sequência de funções numa ordem específica. Muitas vezes, a saída de uma função tem de ser aplicada à entrada de outra função. Este artigo descreve a sequência de encadeamento que cria quando conclui o início rápido do Durable Functions (C#, JavaScript, TypeScript, Python, PowerShell ou Java). Para obter mais informações sobre Durable Functions, consulte Durable Functions descrição geral.

Pré-requisitos

Nota

A versão 4 do modelo de programação Node.js para Funções do Azure está geralmente disponível. O novo modelo v4 foi concebido para ter uma experiência mais flexível e intuitiva para programadores JavaScript e TypeScript. Saiba mais sobre as diferenças entre v3 e v4 no guia de migração.

Nos fragmentos de código seguintes, o JavaScript (PM4) indica o modelo de programação V4, a nova experiência.

As funções

Este artigo explica as seguintes funções na aplicação de exemplo:

  • E1_HelloSequence: uma função de orquestrador que chama E1_SayHello várias vezes numa sequência. Armazena as saídas das E1_SayHello chamadas e regista os resultados.
  • E1_SayHello: uma função de atividade que prepara uma cadeia com "Hello".
  • HttpStart: uma função de cliente durável acionada por HTTP que inicia uma instância do orquestrador.

E1_HelloSequence função do orquestrador

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

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

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

Todas as funções de orquestração C# têm de ter um parâmetro do tipo DurableOrchestrationContext, que existe na Microsoft.Azure.WebJobs.Extensions.DurableTask assemblagem. Este objeto de contexto permite-lhe chamar outras funções de atividade e transmitir parâmetros de entrada com o respetivo CallActivityAsync método.

O código chama E1_SayHello três vezes em sequência com valores de parâmetros diferentes. O valor devolvido de cada chamada é adicionado à outputs lista, que é devolvida no final da função.

E1_SayHello função de atividade

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

As atividades utilizam o ActivityTrigger atributo. Utilize o fornecido IDurableActivityContext para efetuar ações relacionadas com a atividade, como aceder ao valor de entrada com GetInput<T>.

A implementação de E1_SayHello é uma operação de formatação de cadeia relativamente trivial.

Em vez de vincular a um IDurableActivityContext, pode vincular diretamente ao tipo que é transmitido para a função de atividade. Por exemplo:

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

HttpStart client function (Função de cliente HttpStart)

Pode iniciar uma instância da função orchestrator com uma função de cliente. Irá utilizar a função acionada HttpStart por HTTP para iniciar instâncias do E1_HelloSequence.

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

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

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

Para interagir com orquestradores, a função tem de incluir um DurableClient enlace de entrada. Utilize o cliente para iniciar uma orquestração. Também pode ajudá-lo a devolver uma resposta HTTP que contém URLs para verificar o estado da nova orquestração.

Executar o exemplo

Para executar a E1_HelloSequence orquestração, envie o seguinte pedido HTTP POST para a HttpStart função.

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

Nota

O fragmento HTTP anterior pressupõe que existe uma entrada no host.json ficheiro que remove o prefixo predefinido api/ de todos os URLs das funções de acionador HTTP. Pode encontrar a marcação para esta configuração no host.json ficheiro nos exemplos.

Por exemplo, se estiver a executar o exemplo numa aplicação de funções com o nome "myfunctionapp", substitua "{host}" por "myfunctionapp.azurewebsites.net".

O resultado é uma resposta HTTP 202, como esta (cortada por brevidade):

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

(...trimmed...)

Neste momento, a orquestração está em fila de espera e começa a ser executada imediatamente. O URL no Location cabeçalho pode ser utilizado para verificar o estado da execução.

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

O resultado é o estado da orquestração. É executado e concluído rapidamente, para que o veja no estado Concluído com uma resposta semelhante a esta (cortada por brevidade):

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

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

Como pode ver, a runtimeStatus instância é Concluída e contém output o resultado serializado JSON da execução da função orchestrator.

Nota

Pode implementar lógica de arranque semelhante para outros tipos de acionadores, como queueTrigger, eventHubTriggerou timerTrigger.

Observe os registos de execução de funções. A E1_HelloSequence função foi iniciada e concluída várias vezes devido ao comportamento de repetição descrito no tópico de fiabilidade da orquestração . Por outro lado, houve apenas três execuções de, uma vez que essas execuções de E1_SayHello funções não são reproduzidas.

Passos seguintes

Este exemplo demonstrou uma orquestração simples de encadeamento de funções. O exemplo seguinte mostra como implementar o padrão fan-out/fan-in.