Řetězení funkcí v Durable Functions – ukázka sekvence Hello
Článek
Řetězení funkcí označuje vzor provádění posloupnosti funkcí v určitém pořadí. Výstup jedné funkce je často potřeba použít na vstup jiné funkce. Tento článek popisuje posloupnost řetězení, kterou vytvoříte při dokončení Durable Functions rychlého startu (C#, JavaScript, TypeScript, Python, PowerShell nebo Java). Další informace o Durable Functions najdete v přehledu Durable Functions.
Verze 4 programovacího modelu Node.js pro Azure Functions je obecně dostupná. Nový model v4 je navržený tak, aby měl flexibilnější a intuitivnější prostředí pro vývojáře v JavaScriptu a TypeScriptu. Další informace o rozdílech mezi verzemi v3 a v4 najdete v průvodci migrací.
V následujících fragmentech kódu označuje JavaScript (PM4) programovací model V4, nové prostředí.
Funkce
Tento článek vysvětluje následující funkce v ukázkové aplikaci:
E1_HelloSequence: Funkce orchestrátoru , která volá E1_SayHello vícekrát v sekvenci. Ukládá výstupy z E1_SayHello volání a zaznamenává výsledky.
E1_SayHello: Funkce aktivity , která předsadí řetězec s "Hello".
HttpStart: Funkce odolného klienta aktivovaná protokolem HTTP, která spouští instanci orchestrátoru.
Všechny funkce orchestrace jazyka C# musí mít parametr typu DurableOrchestrationContext, který existuje v Microsoft.Azure.WebJobs.Extensions.DurableTask sestavení. Tento kontextový objekt umožňuje volat další funkce aktivit a předávat vstupní parametry pomocí své CallActivityAsync metody.
Kód volá E1_SayHello třikrát po sobě s různými hodnotami parametrů. Návratová hodnota každého volání se přidá do outputs seznamu, který se vrátí na konci funkce.
function.json
Pokud pro vývoj používáte Visual Studio Code nebo Azure Portal, tady je obsah souboru function.json pro funkci orchestrátoru. Většina souborů orchestrator function.json vypadá téměř přesně takto.
Důležité je typ vazby orchestrationTrigger . Tento typ triggeru musí používat všechny funkce orchestrátoru.
Upozornění
Pokud chcete dodržovat pravidlo "žádné vstupně-výstupní operace" funkcí orchestrátoru, nepoužívejte při použití orchestrationTrigger aktivační vazby žádné vstupní ani výstupní vazby. Pokud jsou potřeba jiné vstupní nebo výstupní vazby, měly by se místo toho používat v kontextu activityTrigger funkcí, které jsou volány orchestrátorem. Další informace najdete v článku Omezení kódu funkce orchestrátoru .
Všechny funkce orchestrace JavaScriptu musí obsahovat moduldurable-functions. Je to knihovna, která umožňuje psát Durable Functions v JavaScriptu. Existují tři významné rozdíly mezi funkcí orchestrátoru a dalšími funkcemi JavaScriptu:
Funkce je zabalená do volání durable-functions metody modulu orchestrator (zde df).
Funkce musí být synchronní. Vzhledem k tomu, že metoda "orchestrator" zpracovává konečné volání "context.done", měla by funkce jednoduše "return".
Objekt context obsahuje df trvalý objekt kontextu orchestrace, který umožňuje volat další funkce aktivity a předávat vstupní parametry pomocí své callActivity metody. Kód volá E1_SayHello třikrát sekvenci s různými hodnotami parametrů, pomocí yield které indikuje, že spuštění by mělo počkat na vrácení volání funkce asynchronní aktivity. Návratová hodnota každého volání se přidá do outputs pole, které se vrátí na konci funkce.
Všechny funkce orchestrace JavaScriptu musí obsahovat moduldurable-functions. Tento modul umožňuje psát Durable Functions v JavaScriptu. Pokud chcete používat programovací model uzlů V4, musíte nainstalovat verzi Preview v3.x nástroje durable-functions.
Mezi funkcí orchestrátoru a dalšími funkcemi JavaScriptu existují dva významné rozdíly:
Funkce musí být synchronní. Funkce by měla jednoduše "vrátit".
Objekt context obsahuje df trvalý objekt kontextu orchestrace, který umožňuje volat další funkce aktivity a předávat vstupní parametry pomocí své callActivity metody. Kód volá sayHello třikrát sekvenci s různými hodnotami parametrů, pomocí yield které indikuje, že spuštění by mělo počkat na vrácení volání funkce asynchronní aktivity. Návratová hodnota každého volání se přidá do outputs pole, které se vrátí na konci funkce.
Poznámka
Durable Functions Pythonu jsou k dispozici pouze pro modul runtime Functions 3.0.
function.json
Pokud pro vývoj používáte Visual Studio Code nebo Azure Portal, tady je obsah souboru function.json pro funkci orchestrátoru. Většina souborů orchestrator function.json vypadá téměř přesně takto.
Důležité je typ vazby orchestrationTrigger . Tento typ triggeru musí používat všechny funkce orchestrátoru.
Upozornění
Pokud chcete dodržovat pravidlo "žádné vstupně-výstupní operace" funkcí orchestrátoru, nepoužívejte při použití orchestrationTrigger aktivační vazby žádné vstupní ani výstupní vazby. Pokud jsou potřeba jiné vstupní nebo výstupní vazby, měly by se místo toho používat v kontextu activityTrigger funkcí, které jsou volány orchestrátorem. Další informace najdete v článku Omezení kódu funkce orchestrátoru .
Všechny funkce orchestrace Pythonu durable-functionsmusí obsahovat balíček. Je to knihovna, která umožňuje psát Durable Functions v Pythonu. Mezi funkcí orchestrátoru a dalšími funkcemi Pythonu existují dva významné rozdíly:
Soubor by měl zaregistrovat funkci orchestrátoru jako orchestrátor tak, že na konci souboru uvedemain = df.Orchestrator.create(<orchestrator function name>). To pomáhá odlišit ho od ostatních pomocných funkcí deklarovaných v souboru.
Objekt context umožňuje volat další funkce aktivit a předávat vstupní parametry pomocí své call_activity metody. Kód volá E1_SayHello třikrát sekvenci s různými hodnotami parametrů, pomocí yield které indikuje, že spuštění by mělo počkat na vrácení volání funkce asynchronní aktivity. Návratová hodnota každého volání se vrátí na konci funkce.
[FunctionName("E1_SayHello")]
public static string SayHello([ActivityTrigger] IDurableActivityContext context)
{
string name = context.GetInput<string>();
return $"Hello {name}!";
}
Aktivity používají ActivityTrigger atribut . K provádění akcí souvisejících s aktivitami, jako je například přístup ke vstupní hodnotě pomocí GetInput<T>nástroje , použijte zadaný parametr IDurableActivityContext .
Implementace E1_SayHello je relativně triviální operace formátování řetězců.
Místo vazby na IDurableActivityContext, můžete vytvořit vazbu přímo na typ, který je předán do funkce aktivity. Příklad:
Soubor function.json pro funkci E1_SayHello aktivity je podobný souboru s tím rozdílem E1_HelloSequenceactivityTrigger , že místo typu vazby používá typ vazby orchestrationTrigger .
Všechny funkce aktivit volané orchestrační funkcí musí používat activityTrigger vazbu.
Implementace E1_SayHello je relativně triviální operace formátování řetězců.
E1_SayHello/index.js
module.exports = function (context) {
context.done(null, `Hello ${context.bindings.name}!`);
};
Na rozdíl od funkce orchestrace nevyžaduje funkce aktivity žádné zvláštní nastavení. Vstup předaný funkci orchestrátoru se nachází na objektu context.bindings pod názvem activityTrigger vazby – v tomto případě context.bindings.name. Název vazby je možné nastavit jako parametr exportované funkce a přistupovat k ho přímo, což je to, co vzorový kód dělá.
Implementace sayHello je relativně triviální operace formátování řetězců.
Na rozdíl od funkce orchestrace nevyžaduje funkce aktivity žádné zvláštní nastavení. Vstup předaný funkci orchestrátoru je prvním argumentem funkce. Druhým argumentem je kontext vyvolání, který se v tomto příkladu nepoužívá.
E1_SayHello/function.json
Soubor function.json pro funkci E1_SayHello aktivity je podobný souboru s tím rozdílem E1_HelloSequenceactivityTrigger , že místo typu vazby používá typ vazby orchestrationTrigger .
Na rozdíl od funkce orchestrátoru nevyžaduje funkce aktivity žádné zvláštní nastavení. Vstup předaný funkci orchestrátoru je přímo přístupný jako parametr funkce.
Funkce klienta HttpStart
Instanci funkce orchestrátoru můžete spustit pomocí klientské funkce. Ke spuštění instancí použijete HttpStart funkci aktivovanou protokolem E1_HelloSequenceHTTP.
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);
}
}
K interakci s orchestrátory musí funkce obsahovat DurableClient vstupní vazbu. Pomocí klienta spustíte orchestraci. Může vám také pomoct vrátit odpověď HTTP obsahující adresy URL pro kontrolu stavu nové orchestrace.
Slouží df.getClient k získání objektu DurableOrchestrationClient . Pomocí klienta spustíte orchestraci. Může vám také pomoct vrátit odpověď HTTP obsahující adresy URL pro kontrolu stavu nové orchestrace.
Ke správě orchestrátorů a interakci s nimi potřebuje durableClient funkce vstupní vazbu. Tuto vazbu je potřeba zadat v argumentu extraInputs při registraci funkce. Vstup durableClient lze získat voláním df.input.durableClient()příkazu .
Slouží df.getClient k získání objektu DurableClient . Pomocí klienta spustíte orchestraci. Může vám také pomoct vrátit odpověď HTTP obsahující adresy URL pro kontrolu stavu nové orchestrace.
K interakci s orchestrátory musí funkce obsahovat durableClient vstupní vazbu.
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)
Pomocí konstruktoru DurableOrchestrationClient získejte klienta Durable Functions. Pomocí klienta spustíte orchestraci. Může vám také pomoct vrátit odpověď HTTP obsahující adresy URL pro kontrolu stavu nové orchestrace.
Spuštění ukázky
Pokud chcete orchestraci spustit E1_HelloSequence , odešlete do HttpStart funkce následující požadavek HTTP POST.
POST http://{host}/orchestrators/E1_HelloSequence
Poznámka
Předchozí fragment kódu HTTP předpokládá, že v host.json souboru je položka, která ze všech adres URL aktivačních funkcí HTTP odebere výchozí api/ předponu. Značky pro tuto konfiguraci najdete v host.json souboru v ukázkách.
Pokud například spouštíte ukázku v aplikaci funkcí s názvem "myfunctionapp", nahraďte {host} názvem "myfunctionapp.azurewebsites.net".
Výsledkem je odpověď HTTP 202, jako je tato (zkrácená pro stručnost):
V tomto okamžiku je orchestrace zařazena do fronty a začne se okamžitě spouštět. Adresu URL v hlavičce Location můžete použít ke kontrole stavu spuštění.
GET http://{host}/runtime/webhooks/durabletask/instances/96924899c16d43b08a536de376ac786b?taskHub=DurableFunctionsHub&connection=Storage&code={systemKey}
Výsledkem je stav orchestrace. Rychle se spustí a dokončí, takže se zobrazí ve stavu Dokončeno s odpovědí, která vypadá takto (zkráceně pro stručnost):
Jak vidíte, runtimeStatus instance je Dokončeno a output obsahuje serializovaný výsledek spuštění funkce orchestrátoru JSON.
Poznámka
Podobnou počáteční logiku můžete implementovat pro jiné typy triggerů, jako jsou queueTrigger, eventHubTriggernebo timerTrigger.
Podívejte se na protokoly provádění funkcí. Funkce se spustila E1_HelloSequence a dokončila několikrát kvůli chování přehrávání popsanému v tématu o spolehlivosti orchestrace . Na druhou stranu došlo pouze ke třem spuštěním E1_SayHello , protože tato spuštění funkcí se nepřehrávají.
Další kroky
Tato ukázka demonstrovala jednoduchou orchestraci zřetězení funkcí. Další ukázka ukazuje, jak implementovat model fan-out/fan-in.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu: https://aka.ms/ContentUserFeedback.