Functiekoppeling in Durable Functions - Voorbeeld van hello-reeks
Artikel
Functiekoppeling verwijst naar het patroon van het uitvoeren van een reeks functies in een bepaalde volgorde. Vaak moet de uitvoer van een functie worden toegepast op de invoer van een andere functie. In dit artikel wordt de ketenreeks beschreven die u maakt wanneer u de quickstart Durable Functions (C#, JavaScript, TypeScript, Python, PowerShell of Java) voltooit. Zie Durable Functions overzicht voor meer informatie over Durable Functions.
Versie 4 van het Node.js programmeermodel voor Azure Functions is algemeen beschikbaar. Het nieuwe v4-model is ontworpen voor een flexibelere en intuĆÆtievere ervaring voor JavaScript- en TypeScript-ontwikkelaars. Meer informatie over de verschillen tussen v3 en v4 vindt u in de migratiehandleiding.
In de volgende codefragmenten geeft JavaScript (PM4) het programmeermodel V4 aan, de nieuwe ervaring.
De functies
In dit artikel worden de volgende functies in de voorbeeld-app uitgelegd:
E1_HelloSequence: Een orchestratorfunctie die meerdere keren in een reeks aanroept E1_SayHello . Het slaat de uitvoer van de E1_SayHello aanroepen op en registreert de resultaten.
E1_SayHello: Een activiteitsfunctie die een tekenreeks vooraf laat gaan door 'Hallo'.
Alle C#-indelingsfuncties moeten een parameter van het type DurableOrchestrationContexthebben die aanwezig is in de Microsoft.Azure.WebJobs.Extensions.DurableTask assembly. Met dit contextobject kunt u andere activiteitsfuncties aanroepen en invoerparameters doorgeven met behulp van de CallActivityAsync bijbehorende methode.
De code roept E1_SayHello drie keer achter elkaar aan met verschillende parameterwaarden. De retourwaarde van elke aanroep wordt toegevoegd aan de outputs lijst, die wordt geretourneerd aan het einde van de functie.
function.json
Als u Visual Studio Code of de Azure Portal gebruikt voor ontwikkeling, volgt hier de inhoud van het bestand function.json voor de orchestratorfunctie. De meeste orchestrator function.json-bestanden zien er bijna precies zo uit.
Het belangrijkste is het orchestrationTrigger bindingstype. Alle orchestratorfuncties moeten dit triggertype gebruiken.
Waarschuwing
Als u zich wilt houden aan de regel 'geen I/O' van orchestratorfuncties, gebruikt u geen invoer- of uitvoerbindingen wanneer u de orchestrationTrigger triggerbinding gebruikt. Als er andere invoer- of uitvoerbindingen nodig zijn, moeten deze in plaats daarvan worden gebruikt in de context van activityTrigger functies, die worden aangeroepen door de orchestrator. Zie het artikel codebeperkingen voor orchestratorfuncties voor meer informatie.
Alle JavaScript-indelingsfuncties moeten de durable-functions module bevatten. Het is een bibliotheek waarmee u Durable Functions in JavaScript kunt schrijven. Er zijn drie belangrijke verschillen tussen een orchestratorfunctie en andere JavaScript-functies:
De functie wordt verpakt in een aanroep van de -methode van orchestrator de durable-functions module (hier df).
De functie moet synchroon zijn. Omdat de methode orchestrator de laatste aanroep van 'context.done' afhandelt, moet de functie gewoon 'return' zijn.
Het context object bevat een df duurzaam indelingscontextobject waarmee u andere activiteitsfuncties kunt aanroepen en invoerparameters kunt doorgeven met behulp van de callActivity bijbehorende methode. De code roept E1_SayHello drie keer achter elkaar aan met verschillende parameterwaarden, waarbij wordt gebruikt yield om aan te geven dat de uitvoering moet wachten op de aanroepen van de asynchrone activiteitsfunctie die moeten worden geretourneerd. De retourwaarde van elke aanroep wordt toegevoegd aan de outputs matrix, die wordt geretourneerd aan het einde van de functie.
Alle JavaScript-indelingsfuncties moeten de durable-functions module bevatten. Met deze module kunt u Durable Functions schrijven in JavaScript. Als u het V4-knooppuntprogrammeringsmodel wilt gebruiken, moet u de preview-versie v3.x van durable-functionsinstalleren.
Er zijn twee belangrijke verschillen tussen een orchestratorfunctie en andere JavaScript-functies:
De functie moet synchroon zijn. De functie moet gewoon 'return' zijn.
Het context object bevat een df duurzaam indelingscontextobject waarmee u andere activiteitsfuncties kunt aanroepen en invoerparameters kunt doorgeven met behulp van de callActivity bijbehorende methode. De code roept sayHello drie keer achter elkaar aan met verschillende parameterwaarden, waarbij wordt gebruikt yield om aan te geven dat de uitvoering moet wachten op de aanroepen van de asynchrone activiteitsfunctie die moeten worden geretourneerd. De retourwaarde van elke aanroep wordt toegevoegd aan de outputs matrix, die wordt geretourneerd aan het einde van de functie.
Notitie
Python-Durable Functions zijn alleen beschikbaar voor de Functions 3.0-runtime.
function.json
Als u Visual Studio Code of de Azure Portal gebruikt voor ontwikkeling, volgt hier de inhoud van het bestand function.json voor de orchestratorfunctie. De meeste orchestrator function.json-bestanden zien er bijna precies zo uit.
Het belangrijkste is het orchestrationTrigger bindingstype. Alle orchestratorfuncties moeten dit triggertype gebruiken.
Waarschuwing
Als u zich wilt houden aan de regel 'geen I/O' van orchestratorfuncties, gebruikt u geen invoer- of uitvoerbindingen wanneer u de orchestrationTrigger triggerbinding gebruikt. Als er andere invoer- of uitvoerbindingen nodig zijn, moeten deze in plaats daarvan worden gebruikt in de context van activityTrigger functies, die worden aangeroepen door de orchestrator. Zie het artikel codebeperkingen voor orchestratorfuncties voor meer informatie.
Alle Python-indelingsfuncties moeten het durable-functions pakket bevatten. Het is een bibliotheek waarmee u Durable Functions kunt schrijven in Python. Er zijn twee belangrijke verschillen tussen een orchestratorfunctie en andere Python-functies:
Het bestand moet de orchestrator-functie registreren als een orchestrator door aan het einde van het bestand aan te geven main = df.Orchestrator.create(<orchestrator function name>) . Dit helpt om het te onderscheiden van andere helperfuncties die in het bestand zijn gedeclareerd.
Met context het object kunt u andere activiteitsfuncties aanroepen en invoerparameters doorgeven met behulp van de call_activity bijbehorende methode. De code roept E1_SayHello drie keer achter elkaar aan met verschillende parameterwaarden, waarbij wordt gebruikt yield om aan te geven dat de uitvoering moet wachten op de aanroepen van de asynchrone activiteitsfunctie die moeten worden geretourneerd. De retourwaarde van elke aanroep wordt geretourneerd aan het einde van de functie.
[FunctionName("E1_SayHello")]
public static string SayHello([ActivityTrigger] IDurableActivityContext context)
{
string name = context.GetInput<string>();
return $"Hello {name}!";
}
Activiteiten gebruiken het ActivityTrigger kenmerk. Gebruik de opgegeven IDurableActivityContext om activiteitengerelateerde acties uit te voeren, zoals toegang tot de invoerwaarde met behulp van GetInput<T>.
De implementatie van E1_SayHello is een relatief eenvoudige tekenreeksopmaakbewerking.
In plaats van te binden aan een IDurableActivityContext, kunt u rechtstreeks binden aan het type dat wordt doorgegeven aan de activiteitsfunctie. Bijvoorbeeld:
Het bestand function.json voor de activiteitsfunctie E1_SayHello is vergelijkbaar met dat van E1_HelloSequence , behalve dat er een activityTrigger bindingstype wordt gebruikt in plaats van een orchestrationTrigger bindingstype.
Alle activiteitsfuncties die door een indelingsfunctie worden aangeroepen, moeten de activityTrigger binding gebruiken.
De implementatie van E1_SayHello is een relatief eenvoudige tekenreeksopmaakbewerking.
E1_SayHello/index.js
module.exports = function (context) {
context.done(null, `Hello ${context.bindings.name}!`);
};
In tegenstelling tot de indelingsfunctie heeft een activiteitsfunctie geen speciale instellingen nodig. De invoer die door de orchestratorfunctie wordt doorgegeven, bevindt zich op het context.bindings -object onder de naam van de activityTrigger binding, context.bindings.namein dit geval . De bindingsnaam kan worden ingesteld als een parameter van de geƫxporteerde functie en rechtstreeks worden geopend, wat de voorbeeldcode doet.
De implementatie van sayHello is een relatief eenvoudige tekenreeksopmaakbewerking.
In tegenstelling tot de indelingsfunctie heeft een activiteitsfunctie geen speciale instellingen nodig. De invoer die door de orchestratorfunctie wordt doorgegeven, is het eerste argument voor de functie. Het tweede argument is de aanroepcontext, die niet in dit voorbeeld wordt gebruikt.
E1_SayHello/function.json
Het bestand function.json voor de activiteitsfunctie E1_SayHello is vergelijkbaar met dat van E1_HelloSequence , behalve dat er een activityTrigger bindingstype wordt gebruikt in plaats van een orchestrationTrigger bindingstype.
In tegenstelling tot de orchestrator-functie heeft een activiteitsfunctie geen speciale instellingen nodig. De invoer die door de orchestratorfunctie wordt doorgegeven, is rechtstreeks toegankelijk als de parameter voor de functie.
HttpStart-clientfunctie
U kunt een exemplaar van de orchestratorfunctie starten met behulp van een clientfunctie. U gebruikt de HttpStart door HTTP geactiveerde functie om exemplaren van E1_HelloSequencete starten.
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);
}
}
Als u wilt communiceren met orchestrators, moet de functie een DurableClient invoerbinding bevatten. U gebruikt de client om een indeling te starten. Het kan u ook helpen bij het retourneren van een HTTP-antwoord met URL's voor het controleren van de status van de nieuwe indeling.
Gebruik df.getClient om een DurableOrchestrationClient -object te verkrijgen. U gebruikt de client om een indeling te starten. Het kan u ook helpen bij het retourneren van een HTTP-antwoord met URL's voor het controleren van de status van de nieuwe indeling.
Als u orchestrators wilt beheren en ermee wilt werken, heeft de functie een durableClient invoerbinding nodig. Deze binding moet worden opgegeven in het argument bij het extraInputs registreren van de functie. Een durableClient invoer kan worden verkregen door aan te roepen df.input.durableClient().
Gebruik df.getClient om een DurableClient -object te verkrijgen. U gebruikt de client om een indeling te starten. Het kan u ook helpen bij het retourneren van een HTTP-antwoord met URL's voor het controleren van de status van de nieuwe indeling.
Als u wilt communiceren met orchestrators, moet de functie een durableClient invoerbinding bevatten.
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)
Gebruik de DurableOrchestrationClient constructor om een Durable Functions-client te verkrijgen. U gebruikt de client om een indeling te starten. Het kan u ook helpen bij het retourneren van een HTTP-antwoord met URL's voor het controleren van de status van de nieuwe indeling.
De voorbeeldtoepassing uitvoeren
Als u de E1_HelloSequence indeling wilt uitvoeren, verzendt u de volgende HTTP POST-aanvraag naar de HttpStart functie.
POST http://{host}/orchestrators/E1_HelloSequence
Notitie
In het vorige HTTP-fragment wordt ervan uitgegaan dat er een vermelding in het host.json bestand is die het standaardvoorvoegsel api/ verwijdert uit alle URL's voor HTTP-triggerfuncties. U vindt de markeringen voor deze configuratie in het host.json bestand in de voorbeelden.
Als u bijvoorbeeld het voorbeeld uitvoert in een functie-app met de naam 'myfunctionapp', vervangt u {host} door 'myfunctionapp.azurewebsites.net'.
Het resultaat is een HTTP 202-antwoord, zoals dit (ingekort voor de beknoptheid):
Op dit moment wordt de indeling in de wachtrij geplaatst en wordt deze onmiddellijk uitgevoerd. De URL in de Location header kan worden gebruikt om de status van de uitvoering te controleren.
GET http://{host}/runtime/webhooks/durabletask/instances/96924899c16d43b08a536de376ac786b?taskHub=DurableFunctionsHub&connection=Storage&code={systemKey}
Het resultaat is de status van de indeling. Het wordt snel uitgevoerd en voltooid, zodat u deze ziet in de status Voltooid met een antwoord dat er als volgt uitziet (ingekort voor de beknoptheid):
Zoals u ziet, is de runtimeStatus van het exemplaar Voltooid en bevat het output JSON-geserialiseerde resultaat van de uitvoering van de orchestratorfunctie.
Notitie
U kunt vergelijkbare starterslogica implementeren voor andere triggertypen, zoals queueTrigger, eventHubTriggerof timerTrigger.
Bekijk de uitvoeringslogboeken van de functie. De E1_HelloSequence functie is meerdere keren gestart en voltooid vanwege het gedrag van opnieuw afspelen dat wordt beschreven in het onderwerp orchestration reliability . Aan de andere kant waren er slechts drie uitvoeringen van E1_SayHello , omdat deze functie-uitvoeringen niet opnieuw worden afgespeeld.
Volgende stappen
In dit voorbeeld is een eenvoudige indeling voor functiekoppeling aangetoond. In het volgende voorbeeld ziet u hoe u het patroon voor uitwaaieren/inwaaieren implementeert.