Megosztás a következőn keresztül:


Függvényláncolás a Durable Functionsben – 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 az egyik függvény kimenetét egy másik függvény bemenetére kell alkalmazni. Ez a cikk a Durable Functions rövid útmutatójának (C#, JavaScript, TypeScript, Python, PowerShell vagy Java) elvégzésekor létrehozott láncolássorozatot ismerteti. A Durable Functionsről további információt a Durable Functions áttekintésében talál.

Előfeltételek

Feljegyzés

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

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 a mintaalkalmazás alábbi funkcióit ismerteti:

  • E1_HelloSequence: Egy vezénylő függvény , amely sorozatban többször hív meg E1_SayHello . Tárolja a hívások kimeneteit E1_SayHello , és rögzíti az eredményeket.
  • E1_SayHello: Olyan tevékenységfüggvény , amely egy "Hello" karakterláncot előszűrésként tartalmaz.
  • HttpStart: 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 olyan típusú DurableOrchestrationContextparaméterrel, amely a Microsoft.Azure.WebJobs.Extensions.DurableTask szerelvényben létezik. Ezzel a környezeti objektummal meghívhat más tevékenységfüggvényeket , és bemeneti paramétereket adhat át annak metódusával CallActivityAsync .

A kód egymás után háromszor hív E1_SayHello meg 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 az attribútumot ActivityTrigger használják. A megadott IDurableActivityContext műveletekkel tevékenységgel kapcsolatos műveleteket hajthat végre, például a bemeneti értékhez való hozzáférést a használatával GetInput<T>.

A megvalósítás E1_SayHello egy viszonylag triviális sztringformázási művelet.

Ahelyett, hogy a tevékenységfüggvényhez kötést IDurableActivityContextvégez, közvetlenül a tevékenységfüggvénybe átadott típushoz köthet. Példa:

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

HttpStart ügyfélfüggvény

A vezénylő függvény egy példányát ügyfélfüggvény használatával indíthatja el. A HTTP által aktivált függvényt fogja használni a HttpStart példányok E1_HelloSequenceelindításához.

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 használja az ügyfelet. Az új vezénylés állapotának ellenőrzéséhez az URL-eket tartalmazó HTTP-választ is visszaadhatja.

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

Feljegyzé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ó jelölője a host.json mintákban található fájlban található.

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

Az eredmény egy HTTP 202-válasz, mint ez (vágva a rövidítés):

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

Ezen a ponton a vezénylés várólistára kerül, és azonnal elindul. A fejléc url-címe Location 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 fejeződik be, így a kész állapotban jelenik meg az alábbihoz hasonló válaszsal (a rövidítés 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"}

Mint látható, a runtimeStatus példány befejeződött, és a output vezénylő függvény végrehajtásának JSON-szerializált eredményét tartalmazza.

Feljegyzé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.