Függvényláncolás a Durable Functions - 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 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.
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.
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.
function.json
Ha a Visual Studio Code-ot vagy a Azure Portal használja a fejlesztéshez, itt látható a function.json fájl tartalma az orchestrator függvényhez. A legtöbb orchestrator function.json fájl majdnem pontosan így néz ki.
A legfontosabb 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ása érdekében 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, azokat inkább a vezénylő által meghívott függvények kontextusában activityTrigger kell használni. További információkért tekintse meg a vezénylő függvénykódokra vonatkozó korlátozásokról szóló cikket.
Minden JavaScript vezénylési függvénynek tartalmaznia kell a modultdurable-functions. Ez egy kódtár, amely lehetővé teszi Durable Functions JavaScriptben való írását. A vezénylőfüggvények és más JavaScript-függvények között három jelentős különbség van:
A függvény a modul metódusának hívásába durable-functions van burkolva (ittdf).orchestrator
A függvénynek szinkronnak kell lennie. Mivel az "orchestrator" 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 tartalmaz egy df tartós vezénylési környezeti objektumot, 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 háromszor hív E1_SayHello meg egymás után különböző paraméterértékekkel, a használatával yield jelezve, hogy a végrehajtásnak várnia kell a visszaadandó aszinkron tevékenységfüggvény-hívásokra. Az egyes hívások visszatérési értéke hozzáadódik 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 Durable Functions JavaScriptben való írását. A V4-csomópont programozási modelljének használatához telepítenie kell a előzetes v3.x verzióját durable-functions.
A vezénylőfüggvények és más 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"-nek kell lennie.
Az context objektum tartalmaz egy df tartós vezénylési környezeti objektumot, 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 háromszor hív sayHello meg egymás után különböző paraméterértékekkel, a használatával yield jelezve, hogy a végrehajtásnak várnia kell a visszaadandó aszinkron tevékenységfüggvény-hívásokra. Az egyes hívások visszatérési értéke hozzáadódik a outputs tömbhöz, amelyet a függvény végén ad vissza.
Megjegyzés
A Python Durable Functions csak a Functions 3.0 futtatókörnyezetben érhetők el.
function.json
Ha a Visual Studio Code-ot vagy a Azure Portal használja a fejlesztéshez, itt látható a function.json fájl tartalma az orchestrator függvényhez. A legtöbb orchestrator function.json fájl majdnem pontosan így néz ki.
A legfontosabb 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ása érdekében 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, azokat inkább a vezénylő által meghívott függvények kontextusában activityTrigger kell használni. További információkért tekintse meg a vezénylő függvénykódokra vonatkozó korlátozásokról szóló cikket.
Minden Python vezénylési függvénynek tartalmaznia kell a durable-functions csomagot. Ez egy kódtár, amellyel Durable Functions írhat Pythonban. A vezénylőfüggvények és más Python-függvények között két jelentős különbség van:
A fájlnak regisztrálnia kell a vezénylő funkciót vezénylőként a fájl végén megadott módon main = df.Orchestrator.create(<orchestrator function name>) . 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 háromszor hív E1_SayHello meg egymás után különböző paraméterértékekkel, a használatával yield jelezve, hogy a végrehajtásnak várnia kell a visszaadandó aszinkron tevékenységfüggvény-hívásokra. Az egyes hívások visszaadott é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 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:
A tevékenységfüggvény E1_SayHellofunction.json fájlja hasonló a következőhöz: azzal a kivételrel, hogy E1_HelloSequence kötéstípus helyett kötéstípust activityTriggerorchestrationTrigger használ.
A vezénylési függvény által meghívott összes tevékenységfüggvénynek a kötést kell használnia activityTrigger .
A implementációja 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 activityTrigger alatt található az objektumon – ebben az esetben. context.bindings.name A kötés neve az exportált függvény paramétereként állítható be, és közvetlenül elérhető, és ez a mintakód feladata.
A implementációja 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_SayHellofunction.json fájlja hasonló a következőhöz: azzal a kivételrel, hogy E1_HelloSequence kötéstípus helyett kötéstípust activityTriggerorchestrationTrigger használ.
A vezénylőfüggvénytől eltérően a tevékenységfüggvénynek nincs szüksége speciális beállításra. Az orchestrator 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é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.
Objektum lekéréséhez használja a parancsot df.getClientDurableOrchestrationClient . 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.
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 meghívásával df.input.durableClient()kérhető le.
Objektum lekéréséhez használja a parancsot df.getClientDurableClient . 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.
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)
Használja a DurableOrchestrationClient konstruktort egy Durable Functions-ügyfél beszerzéséhez. 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):
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):
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.