Encadeamento de funções em funções duráveis - Exemplo de sequência Hello

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

Pré-requisitos

Nota

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

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

As funções

Este artigo explica as seguintes funções no aplicativo de exemplo:

  • E1_HelloSequence: Uma função de orquestrador que chama E1_SayHello várias vezes em uma sequência. Ele armazena as saídas das E1_SayHello chamadas e registra os resultados.
  • E1_SayHello: Uma função de atividade que precede uma cadeia de caracteres com "Olá".
  • HttpStart: Uma função de cliente durável acionada por HTTP que inicia uma instância do orquestrador.

E1_HelloSequence função orquestradora

[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# devem ter um parâmetro do tipo DurableOrchestrationContext, que existe no Microsoft.Azure.WebJobs.Extensions.DurableTask assembly. Este objeto de contexto permite chamar outras funções de atividade e passar parâmetros de entrada usando seu CallActivityAsync método.

O código chama E1_SayHello três vezes em sequência com diferentes valores de parâmetro. O valor de retorno de cada chamada é adicionado à outputs lista, que é retornada 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 usam o ActivityTrigger atributo. Use o fornecido IDurableActivityContext para executar ações relacionadas à atividade, como acessar o valor de entrada usando GetInput<T>.

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

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

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

Função de cliente HttpStart

Você pode iniciar uma instância da função orchestrator usando uma função de cliente. Você usará a função acionada HttpStart 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 deve incluir uma DurableClient ligação de entrada. Você usa o cliente para iniciar uma orquestração. Ele também pode ajudá-lo a retornar uma resposta HTTP contendo URLs para verificar o status da nova orquestração.

Executar o exemplo

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

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

Nota

O trecho HTTP anterior pressupõe que há uma entrada no arquivo que remove o prefixo padrão api/ de todas as URLs de funções de gatilho host.json HTTP. Você pode encontrar a marcação para essa configuração no host.json arquivo nos exemplos.

Por exemplo, se você estiver executando o exemplo em um aplicativo de função chamado "myfunctionapp", substitua "{host}" por "myfunctionapp.azurewebsites.net".

O resultado é uma resposta HTTP 202, como esta (cortada para 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 ponto, a orquestração é enfileirada e começa a ser executada imediatamente. O URL no Location cabeçalho pode ser usado para verificar o status da execução.

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

O resultado é o status da orquestração. Ele é executado e concluído rapidamente, para que você o veja no estado Concluído com uma resposta semelhante a esta (cortada para 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 você pode ver, o runtimeStatus da instância é Completed e contém output o resultado serializado em JSON da execução da função orchestrator.

Nota

Você pode implementar lógica inicial semelhante para outros tipos de gatilho, como queueTrigger, eventHubTriggerou timerTrigger.

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

Próximos passos

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