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

Funkce orchestrátoru 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-eventvazby triggeru orchestrace umožňuje funkci orchestrátoru asynchronně čekat a naslouchat události doručené externím klientem. Funkce naslouchacího orchestrátoru deklaruje název události a tvar dat , která očekává, že bude přijímat.

[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 určený pro Durable Functions 2.x. Pro Durable Functions 1.x musíte místo IDurableOrchestrationContextpoužít DurableOrchestrationContext . Další informace o rozdílech mezi verzemi najdete v článku Durable Functions verze.

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

Můžete naslouchat více událostem současně, jako v následujícím příkladu, který čeká na jedno ze tří možných oznámení událostí.

[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 určený pro Durable Functions 2.x. Pro Durable Functions 1.x musíte místo IDurableOrchestrationContextpoužít DurableOrchestrationContext . Další informace o rozdílech mezi verzemi najdete v článku Durable Functions verze.

Předchozí příklad naslouchá všem 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 musíte místo IDurableOrchestrationContextpoužít DurableOrchestrationContext . Další informace o rozdílech mezi verzemi najdete v článku Durable Functions verze.

Pokud v .NET datovou část události nelze 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. Aplikaci funkcí je možné při čekání bezpečně uvolnit. Pokud a když pro tuto instanci orchestrace dorazí událost, automaticky se probudí a událost okamžitě zpracuje.

Poznámka

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

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 také použít integrované rozhraní HTTP API pro vyvolání událostí .

Vyvolaná událost obsahuje ID instance, eventName a eventData jako parametry. Funkce orchestratoru tyto události zpracovávají pomocí rozhraní API wait-for-external-event . EventName se musí shodovat na straně odesílání i přijímání, aby se událost mohla zpracovat. Data události musí být také serializovatelná ve formátu JSON.

Mechanismy "raise-event" interně začtou do fronty zprávu, kterou vyzvedne čekající funkce orchestrátoru. Pokud instance nečeká na zadaný název události, zpráva o události se přidá do fronty v paměti. Pokud instance orchestrace později začne naslouchat názvu události, zkontroluje ve frontě zprávy 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 Approval instanci 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 určený pro Durable Functions 2.x. Pro Durable Functions 1.x musíte místo atributu DurableClient použít OrchestrationClient atribut a typ parametru DurableOrchestrationClientIDurableOrchestrationClientmísto . Další informace o rozdílech mezi verzemi najdete v článku Durable Functions verze.

Rozhraní API "raise-event" interně zařidí zprávu, která se vyzvedne čekající funkcí orchestrátoru. Pokud instance nečeká na zadaný název události, zpráva události se přidá do vyrovnávací paměti. Pokud instance orchestrace později začne naslouchat názvu události, zkontroluje ve vyrovnávací paměti 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 Approval pro instanci orchestration.

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