Condividi tramite


Concatenamento di funzioni in Funzioni permanenti - Esempio di sequenza di Hello

Il concatenamento delle funzioni si riferisce al modello di esecuzione di una sequenza di funzioni in un ordine specifico. Spesso l'output di una funzione deve essere applicato all'input di un'altra funzione. Questo articolo descrive la sequenza di concatenamento creata al termine della guida introduttiva di Durable Functions (C#, JavaScript, TypeScript, Python, PowerShell o Java). Per altre informazioni su Durable Functions, vedere Panoramica di Durable Functions.

Prerequisiti

Nota

La versione 4 del modello di programmazione Node.js per Funzioni di Azure è disponibile a livello generale. Il nuovo modello v4 è progettato per offrire un'esperienza più flessibile e intuitiva agli sviluppatori JavaScript e TypeScript. Altre informazioni sulle differenze tra v3 e v4 sono disponibili nella guida alla migrazione.

Nei frammenti di codice seguenti JavaScript (PM4) indica il modello di programmazione V4, la nuova esperienza.

Funzioni

Questo articolo descrive le funzioni seguenti nell'app di esempio:

Funzione dell’agente di orchestrazione E1_HelloSequence

[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;
}

Tutte le funzioni di orchestrazione C# devono avere un parametro di tipo DurableOrchestrationContext disponibile nell'assembly Microsoft.Azure.WebJobs.Extensions.DurableTask. Questo contesto di ambiente consente di chiamare altre funzioni dell’attività e di passare i parametri di input usando il metodo CallActivityAsync.

Il codice chiama E1_SayHello tre volte in sequenza con valori dei parametri diversi. Il valore restituito di ogni chiamata viene aggiunto all'elenco outputs, che viene restituito al termine della funzione.

Funzione dell’attività E1_SayHello

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

Le attività usano l'attributo ActivityTrigger. Usare l'oggetto fornito IDurableActivityContext per eseguire azioni correlate alle attività, ad esempio l'accesso al valore di input tramite GetInput<T>.

L'implementazione di E1_SayHello è un'operazione di formattazione delle stringhe relativamente semplice.

Anziché eseguire l'associazione a un oggetto IDurableActivityContext, è possibile eseguire l’associazione direttamente al tipo passato alla funzione dell'attività. Ad esempio:

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

Funzione client HttpStart

È possibile avviare un'istanza della funzione dell'agente di orchestrazione usando una funzione client. In questo caso verà usata la funzione HttpStart attivata da HTTP per avviare le istanze di 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);
    }
}

Per interagire con gli agenti di orchestrazione, la funzione deve includere un'associazione DurableClient di input. Usare il client per avviare un'orchestrazione. Può anche essere utile per restituire una risposta HTTP contenente URL per controllare lo stato della nuova orchestrazione.

Eseguire l'esempio

Per eseguire l'orchestrazione E1_HelloSequence, inviare la richiesta POST HTTP seguente alla funzione HttpStart.

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

Nota

Il frammento di codice HTTP precedente presuppone che sia presente una voce nel file host.json che consente di rimuovere il prefisso predefinito api/ da tutti gli URL di funzioni di trigger HTTP. È possibile trovare il markup per la configurazione nel file host.json negli esempi.

Ad esempio, se si esegue l'esempio in un'app per le funzioni denominata "myfunctionapp", sostituire "{host}" con "myfunctionapp.azurewebsites.net".

Il risultato è una risposta HTTP 202, simile alla seguente (tagliata per brevità):

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...)

A questo punto, l'orchestrazione viene messa in coda e inizia ad avviarsi immediatamente. L'URL nell'intestazione Location può essere usato per controllare lo stato dell'esecuzione.

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

Il risultato è lo stato dell'orchestrazione. Si esegue e completa rapidamente e appare nello stato Completato con una risposta simile alla seguente (tagliata per brevità):

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"}

Come si può notare, il runtimeStatus dell'istanza è Completato e output contiene il risultato JSON serializzato dell'esecuzione della funzione di orchestrazione.

Nota

È possibile implementare una logica di avvio simile per altri tipi di trigger, ad esempio queueTrigger, eventHubTrigger, o timerTrigger.

Esaminare i log di esecuzione della funzione. La funzione E1_HelloSequence si è avviata ed è stata completata più volte a causa del comportamento di riproduzione descritto nell’argomento Affidabilità dell’orchestrazione. In compenso, si sono verificate solo tre esecuzioni di E1_SayHello da quando tali esecuzioni delle funzioni non vengono riprodotte.

Passaggi successivi

In questo esempio è stata illustrata una semplice orchestrazione di concatenamento delle funzioni. Nell'esempio successivo viene illustrato come implementare il criterio di fan-out/fan-in.