Függvényláncolás a Durable Functionsben – Hello sorozatminta
Cikk
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.
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.
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.
function.json
Ha a Visual Studio Code-ot vagy az Azure Portalt használja fejlesztésre, a vezénylési függvény function.json fájljának tartalma. A legtöbb vezénylő function.json fájl szinte pontosan így néz ki.
A fontos a orchestrationTrigger kötés típusa. Minden vezénylő függvénynek ezt az eseményindítótípust kell használnia.
Figyelmeztetés
A vezénylőfüggvények "nincs I/O" szabályának betartásához ne használjon bemeneti vagy kimeneti kötéseket az orchestrationTrigger eseményindító kötés használatakor. Ha más bemeneti vagy kimeneti kötésekre van szükség, a függvények kontextusában activityTrigger kell használni őket, amelyeket a vezénylő hív meg. További információkért tekintse meg a vezénylő függvénykód korlátozásait ismertető cikket.
Minden JavaScript vezénylési függvénynek tartalmaznia kell a modultdurable-functions. Ez egy kódtár, amely lehetővé teszi a Durable Functions JavaScriptben való írását. A vezénylő függvény és az egyéb JavaScript-függvények között három jelentős különbség van:
A függvény a modul orchestrator metódusának durable-functions hívásába van csomagolva (ittdf).
A függvénynek szinkronnak kell lennie. Mivel a "vezénylő" metódus kezeli a "context.done" végső hívását, a függvénynek egyszerűen "return" (visszatérés) kell lennie.
Az context objektum egy df tartós vezénylési környezeti objektumot tartalmaz, amely lehetővé teszi más tevékenységfüggvények meghívását és bemeneti paraméterek átadását annak metódusával callActivity . A kód egymás után háromszor hív E1_SayHello különböző paraméterértékekkel, és jelzi, yield hogy a végrehajtásnak várnia kell a visszaadni kívánt aszinkron tevékenységfüggvény-hívásokra. A rendszer hozzáadja az egyes hívások visszatérési értékét a outputs tömbhöz, amelyet a függvény végén ad vissza.
Minden JavaScript vezénylési függvénynek tartalmaznia kell a modultdurable-functions. Ez a modul lehetővé teszi a Durable Functions JavaScriptben való írását. A V4-csomópont programozási modelljének használatához telepítenie kell a verzió előzetes v3.x verzióját durable-functions.
A vezénylő függvény és az egyéb JavaScript-függvények között két jelentős különbség van:
A függvénynek szinkronnak kell lennie. A függvénynek egyszerűen "return" (visszatérés) kell lennie.
Az context objektum egy df tartós vezénylési környezeti objektumot tartalmaz, amely lehetővé teszi más tevékenységfüggvények meghívását és bemeneti paraméterek átadását annak metódusával callActivity . A kód egymás után háromszor hív sayHello különböző paraméterértékekkel, és jelzi, yield hogy a végrehajtásnak várnia kell a visszaadni kívánt aszinkron tevékenységfüggvény-hívásokra. A rendszer hozzáadja az egyes hívások visszatérési értékét a outputs tömbhöz, amelyet a függvény végén ad vissza.
Feljegyzés
A Python Durable Functions csak a Functions 3.0-s futtatókörnyezetekhez érhető el.
function.json
Ha a Visual Studio Code-ot vagy az Azure Portalt használja fejlesztésre, a vezénylési függvény function.json fájljának tartalma. A legtöbb vezénylő function.json fájl szinte pontosan így néz ki.
A fontos a orchestrationTrigger kötés típusa. Minden vezénylő függvénynek ezt az eseményindítótípust kell használnia.
Figyelmeztetés
A vezénylőfüggvények "nincs I/O" szabályának betartásához ne használjon bemeneti vagy kimeneti kötéseket az orchestrationTrigger eseményindító kötés használatakor. Ha más bemeneti vagy kimeneti kötésekre van szükség, a függvények kontextusában activityTrigger kell használni őket, amelyeket a vezénylő hív meg. További információkért tekintse meg a vezénylő függvénykód korlátozásait ismertető cikket.
Minden Python vezénylési függvénynek tartalmaznia kell a durable-functions csomagot. Ez egy kódtár, amely lehetővé teszi a Durable Functions pythonban való írását. A vezénylő függvény és más Python-függvények között két jelentős különbség van:
A fájlnak a fájl végén megadott main = df.Orchestrator.create(<orchestrator function name>) módon regisztrálnia kell a vezénylői funkciót vezénylőként. Ez segít megkülönböztetni a fájlban deklarált többi segédfüggvénytől.
Az context objektum lehetővé teszi más tevékenységfüggvények meghívását és bemeneti paraméterek átadását annak metódusával call_activity . A kód egymás után háromszor hív E1_SayHello különböző paraméterértékekkel, és jelzi, yield hogy a végrehajtásnak várnia kell a visszaadni kívánt aszinkron tevékenységfüggvény-hívásokra. Az egyes hívások visszatérési értéke a függvény végén lesz visszaadva.
[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:
A tevékenységfüggvény E1_SayHello function.json fájlja E1_HelloSequence hasonló ahhoz, hogy kötéstípus helyett kötéstípust activityTriggerorchestrationTrigger használ.
A vezénylési függvény által hívott összes tevékenységfüggvénynek a kötést kell használnia activityTrigger .
A megvalósítás E1_SayHello egy viszonylag triviális sztringformázási művelet.
E1_SayHello/index.js
module.exports = function (context) {
context.done(null, `Hello ${context.bindings.name}!`);
};
A vezénylési függvénnyel ellentétben a tevékenységfüggvénynek nincs szüksége speciális beállításra. A vezénylő függvény által neki átadott bemenet a context.bindings kötés neve alatt található az activityTrigger objektumon – ebben az esetben context.bindings.name. A kötés neve megadható az exportált függvény paramétereként, és közvetlenül is elérhető, ami a mintakód feladata.
A megvalósítás sayHello egy viszonylag triviális sztringformázási művelet.
A vezénylési függvénnyel ellentétben a tevékenységfüggvénynek nincs szüksége speciális beállításra. A vezénylő függvény által neki átadott bemenet a függvény első argumentuma. A második argumentum a meghívási környezet, amelyet ebben a példában nem használunk.
E1_SayHello/function.json
A tevékenységfüggvény E1_SayHello function.json fájlja E1_HelloSequence hasonló ahhoz, hogy kötéstípus helyett kötéstípust activityTriggerorchestrationTrigger használ.
A vezénylő függvénnyel ellentétben a tevékenységfüggvénynek nincs szüksége speciális beállításra. A vezénylő függvény által neki átadott bemenet közvetlenül elérhető a függvény paramétereként.
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.
Objektum lekérésére DurableOrchestrationClient használhatódf.getClient. 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.
A vezénylők kezeléséhez és kezeléséhez a függvénynek bemeneti kötésre durableClient van szüksége. Ezt a kötést meg kell adni az extraInputs argumentumban a függvény regisztrálásakor. A durableClient bemenet a hívással df.input.durableClient()kérhető le.
Objektum lekérésére DurableClient használhatódf.getClient. 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.
A vezénylőkkel való interakcióhoz a függvénynek tartalmaznia kell egy bemeneti kötést durableClient .
HttpStart/__init__.py
import logging
import azure.functions as func
import azure.durable_functions as df
async def main(req: func.HttpRequest, starter: str) -> func.HttpResponse:
client = df.DurableOrchestrationClient(starter)
instance_id = await client.start_new(req.route_params["functionName"], None, None)
logging.info(f"Started orchestration with ID = '{instance_id}'.")
return client.create_check_status_response(req, instance_id)
A konstruktor használatával DurableOrchestrationClient szerezze be a Durable Functions-ügyfelet. 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):
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):
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.