Share via


Függvényláncolás a Durable Functions - Hello sorozatminta

A függvényláncolás egy függvénysorozat adott sorrendben történő végrehajtásának mintáját jelenti. Gyakran egy függvény kimenetét egy másik függvény bemenetére kell alkalmazni. Ez a cikk a Durable Functions rövid útmutató (C#, JavaScript, TypeScript, Python, PowerShell vagy Java) befejezésekor létrehozott láncolássorozatot ismerteti. A Durable Functions kapcsolatos további információkért lásd: Durable Functions áttekintése.

Előfeltételek

Megjegyzés

A Azure Functions Node.js programozási modelljének 4. verziója általánosan elérhető. Az új v4-es modell rugalmasabb és intuitívabb élményt nyújt a JavaScript- és TypeScript-fejlesztők számára. A v3 és a v4 közötti különbségekről a migrálási útmutatóban talál további információt.

A következő kódrészletekben a JavaScript (PM4) a V4 programozási modellt, az új felületet jelöli.

A függvények

Ez a cikk az alábbi függvényeket ismerteti a mintaalkalmazásban:

  • E1_HelloSequence: Egy vezénylő függvény , amely sorozatban többször is meghívja a hívásokat E1_SayHello . Tárolja a hívások kimeneteit E1_SayHello , és rögzíti az eredményeket.
  • E1_SayHello: Egy tevékenységfüggvény , amely egy "Hello" karakterláncot tartalmaz.
  • HttpStart: Egy HTTP által aktivált tartós ügyfélfüggvény , amely elindítja a vezénylő egy példányát.

E1_HelloSequence vezénylő függvény

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

Minden C#-vezénylési függvénynek rendelkeznie kell egy , típusú DurableOrchestrationContextparaméterrel, amely megtalálható a Microsoft.Azure.WebJobs.Extensions.DurableTask szerelvényben. Ezzel a környezeti objektummal meghívhat más tevékenységfüggvényeket, és bemeneti paramétereket adhat át annak metódusávalCallActivityAsync.

A kód háromszor hív meg E1_SayHello egymás után különböző paraméterértékeket. A rendszer hozzáadja az egyes hívások visszatérési értékét a outputs listához, amelyet a függvény végén ad vissza.

E1_SayHello tevékenységfüggvény

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

A tevékenységek a attribútumot ActivityTrigger használják. A megadott IDurableActivityContext paranccsal tevékenységgel kapcsolatos műveleteket hajthat végre, például elérheti a bemeneti értéket a használatával GetInput<T>.

A implementációja E1_SayHello egy viszonylag triviális sztringformázási művelet.

A helyett IDurableActivityContextközvetlenül a tevékenységfüggvénybe átadott típushoz köthet kötést. Például:

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

HttpStart-ügyfélfüggvény

A vezénylőfüggvények egy példányát egy ügyfélfüggvény használatával indíthatja el. HttpStart A HTTP által aktivált függvénnyel indíthatja el a E1_HelloSequencepéldányait.

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

A vezénylőkkel való interakcióhoz a függvénynek tartalmaznia kell egy bemeneti kötést DurableClient . Vezénylés indításához az ügyfelet kell használnia. Segítséget nyújthat az új vezénylés állapotának ellenőrzéséhez URL-címeket tartalmazó HTTP-válasz visszaadásában is.

Minta futtatása

A E1_HelloSequence vezénylés végrehajtásához küldje el a következő HTTP POST kérést a HttpStart függvénynek.

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

Megjegyzés

Az előző HTTP-kódrészlet feltételezi, hogy van egy bejegyzés a host.json fájlban, amely eltávolítja az alapértelmezett api/ előtagot az összes HTTP-eseményindító függvény URL-címéről. A konfiguráció korrektúráját a mintákban található host.json fájlban találja.

Ha például egy "myfunctionapp" nevű függvényalkalmazásban futtatja a mintát, cserélje le a "{host}" kifejezést a "myfunctionapp.azurewebsites.net" kifejezésre.

Az eredmény egy HTTP 202-válasz, mint ez (a rövidség kedvéért levágva):

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

Ekkor a vezénylés várólistára kerül, és azonnal elindul. A fejlécben található Location URL-cím a végrehajtás állapotának ellenőrzésére használható.

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

Az eredmény a vezénylés állapota. Gyorsan fut és befejeződik, így a Kész állapotban jelenik meg az alábbihoz hasonló válaszsal (a rövidség kedvéért levágva):

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

Amint látható, a runtimeStatus példány Befejezve , a output pedig a vezénylőfüggvény végrehajtásának JSON-szerializált eredményét tartalmazza.

Megjegyzés

Hasonló kezdő logikát implementálhat más triggertípusokhoz, például queueTrigger, eventHubTriggervagy timerTrigger.

Tekintse meg a függvény végrehajtási naplóit. A E1_HelloSequence függvény többször is elindult és befejeződött a vezénylés megbízhatósági témakörében leírt visszajátszási viselkedés miatt. Másrészt csak három végrehajtás E1_SayHello volt, mivel ezek a függvényvégrehajtások nem kerülnek visszajátszásra.

Következő lépések

Ez a minta egy egyszerű függvénylánc-vezénylést mutatott be. A következő minta bemutatja, hogyan valósíthatja meg a ventilátor-out/ventilátor-in mintát.