Sdílet prostřednictvím


Zpracování externích událostí v Durable Functions (Azure Functions)

Funkce orchestratoru mají možnost čekat a naslouchat externím událostem. Tato funkce Durable Functions je často užitečná pro zpracování lidské interakce nebo jiných externích triggerů.

Poznámka:

Externí události jsou jednosměrné asynchronní operace. Nejsou vhodné pro situace, kdy klient odesílající událost potřebuje synchronní odpověď z funkce orchestrátoru.

Čekání na události

Rozhraní API "wait-for-external-event" vazby triggeru orchestrace umožňuje funkci orchestrátoru asynchronně čekat a naslouchat události doručované externím klientem. Funkce orchestrátoru naslouchá deklaruje název události a tvar dat , která očekává.

[FunctionName("BudgetApproval")]
public static async Task Run(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    bool approved = await context.WaitForExternalEvent<bool>("Approval");
    if (approved)
    {
        // approval granted - do the approved action
    }
    else
    {
        // approval denied - send a notification
    }
}

Poznámka:

Předchozí kód jazyka C# je pro Durable Functions 2.x. Pro Durable Functions 1.x je nutné použít DurableOrchestrationContext místo IDurableOrchestrationContext. Další informace o rozdílech mezi verzemi najdete v článku o verzích Durable Functions.

Předchozí příklad naslouchá konkrétní jedné události a provede akci při přijetí.

Můžete naslouchat více událostem souběžně, například v následujícím příkladu, což čeká na jedno ze tří možných oznámení o událostech.

[FunctionName("Select")]
public static async Task Run(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    var event1 = context.WaitForExternalEvent<float>("Event1");
    var event2 = context.WaitForExternalEvent<bool>("Event2");
    var event3 = context.WaitForExternalEvent<int>("Event3");

    var winner = await Task.WhenAny(event1, event2, event3);
    if (winner == event1)
    {
        // ...
    }
    else if (winner == event2)
    {
        // ...
    }
    else if (winner == event3)
    {
        // ...
    }
}

Poznámka:

Předchozí kód jazyka C# je pro Durable Functions 2.x. Pro Durable Functions 1.x je nutné použít DurableOrchestrationContext místo IDurableOrchestrationContext. Další informace o rozdílech mezi verzemi najdete v článku o verzích Durable Functions.

Předchozí příklad naslouchá libovolné z více událostí. Je také možné počkat na všechny události.

[FunctionName("NewBuildingPermit")]
public static async Task Run(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    string applicationId = context.GetInput<string>();

    var gate1 = context.WaitForExternalEvent("CityPlanningApproval");
    var gate2 = context.WaitForExternalEvent("FireDeptApproval");
    var gate3 = context.WaitForExternalEvent("BuildingDeptApproval");

    // all three departments must grant approval before a permit can be issued
    await Task.WhenAll(gate1, gate2, gate3);

    await context.CallActivityAsync("IssueBuildingPermit", applicationId);
}

Poznámka:

Předchozí kód je pro Durable Functions 2.x. Pro Durable Functions 1.x je nutné použít DurableOrchestrationContext místo IDurableOrchestrationContext. Další informace o rozdílech mezi verzemi najdete v článku o verzích Durable Functions.

Pokud v .NET nelze datovou část události převést na očekávaný typ T, vyvolá se výjimka.

Rozhraní API "wait-for-external-event" čeká na určitý vstup neomezeně dlouho. Aplikace funkcí může být při čekání bezpečně uvolněna. Pokud a když událost dorazí pro tuto instanci orchestrace, probouzí se automaticky a okamžitě zpracuje událost.

Poznámka:

Pokud vaše aplikace funkcí používá plán Consumption, nebudou účtovány žádné poplatky za fakturaci, když funkce orchestrátoru čeká na úkol externí události bez ohledu na to, jak dlouho čeká.

Stejně jako u funkcí aktivit mají externí události záruku doručení alespoň jednou . To znamená, že za určitých podmínek (například restartování, škálování, chybové ukončení atd.) může vaše aplikace obdržet duplicity stejné externí události. Proto doporučujeme, aby externí události obsahovaly určitý druh ID, který umožňuje jejich ruční odstranění v orchestrátorech.

Odesílání událostí

K odeslání externí události do orchestrace můžete použít rozhraní API "raise-event" definované vazbou klienta orchestrace. K odeslání externí události do orchestrace můžete použít také integrované rozhraní API HTTP pro vyvolání události.

Vyvoláná událost obsahuje ID instance, eventName a eventData jako parametry. Funkce orchestratoru zpracovávají tyto události pomocí rozhraní API "wait-for-external-event" . Název události se musí shodovat jak na odesílajícím, tak i přijímajícím konci, aby se událost zpracovávala. Data události musí být také serializovatelná ve formátu JSON.

Mechanismy "raise-event" interně vytvoří frontu zprávy, která se vyzvedne funkcí čekající orchestrátoru. Pokud instance nečeká na zadaný název události, přidá se zpráva události do fronty v paměti. Pokud instance orchestrace později začne naslouchat názvu události, zkontroluje frontu zpráv událostí.

Poznámka:

Pokud neexistuje žádná instance orchestrace se zadaným ID instance, zpráva události se zahodí.

Níže je příklad funkce aktivované frontou, která odesílá událost Schválení do instance funkce orchestrátoru. ID instance orchestrace pochází z textu zprávy fronty.

[FunctionName("ApprovalQueueProcessor")]
public static async Task Run(
    [QueueTrigger("approval-queue")] string instanceId,
    [DurableClient] IDurableOrchestrationClient client)
{
    await client.RaiseEventAsync(instanceId, "Approval", true);
}

Poznámka:

Předchozí kód jazyka C# je pro Durable Functions 2.x. Pro Durable Functions 1.x, musíte použít OrchestrationClient atribut místo DurableClient atributu a musíte použít DurableOrchestrationClient typ parametru místo IDurableOrchestrationClient. Další informace o rozdílech mezi verzemi najdete v článku o verzích Durable Functions.

Rozhraní API "raise-event" interně vypíše zprávu, která se vyzvedne funkcí čekající orchestrátoru. Pokud instance nečeká na zadaný název události, zpráva události se přidá do vyrovnávací paměti v paměti. Pokud instance orchestrace později začne naslouchat názvu události, zkontroluje vyrovnávací paměť pro zprávy událostí a aktivuje úlohu, která na ni čekala.

Poznámka:

Pokud neexistuje žádná instance orchestrace se zadaným ID instance, zpráva události se zahodí.

HTTP

Následuje příklad požadavku HTTP, který vyvolá událost Schválení instanci orchestrace.

POST /runtime/webhooks/durabletask/instances/MyInstanceId/raiseEvent/Approval&code=XXX
Content-Type: application/json

"true"

V tomto případě je ID instance pevně zakódované jako MyInstanceId.

Další kroky