Share via


Dayanıklı İşlevler dış olayları işleme (Azure İşlevleri)

Orchestrator işlevleri, dış olayları bekleme ve dinleme özelliğine sahiptir. bu Dayanıklı İşlevler özelliği genellikle insan etkileşimini veya diğer dış tetikleyicileri işlemek için yararlıdır.

Not

Dış olaylar tek yönlü zaman uyumsuz işlemlerdir. Olayı gönderen istemcinin orchestrator işlevinden zaman uyumlu bir yanıta ihtiyaç duyduğu durumlar için uygun değildir.

Olayları bekleme

Düzenleme tetikleyicisi bağlamasının "wait-for-external-event" API'si, bir düzenleyici işlevinin zaman uyumsuz olarak bir dış istemci tarafından teslim edilen bir olayı beklemesine ve dinlemesine olanak tanır. Dinleme düzenleyici işlevi olayın adını ve almayı beklediği verilerin şeklini bildirir.

[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
    }
}

Not

Önceki C# kodu Dayanıklı İşlevler 2.x içindir. Dayanıklı İşlevler 1.x için yerine IDurableOrchestrationContextkullanmanız DurableOrchestrationContext gerekir. Sürümler arasındaki farklar hakkında daha fazla bilgi için Dayanıklı İşlevler sürümleri makalesine bakın.

Yukarıdaki örnek, belirli bir olayı dinler ve alındığında işlem yapar.

Aşağıdaki örnekte olduğu gibi, üç olası olay bildiriminden birini bekleyen birden çok olayı eşzamanlı olarak dinleyebilirsiniz.

[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)
    {
        // ...
    }
}

Not

Önceki C# kodu Dayanıklı İşlevler 2.x içindir. Dayanıklı İşlevler 1.x için yerine IDurableOrchestrationContextkullanmanız DurableOrchestrationContext gerekir. Sürümler arasındaki farklar hakkında daha fazla bilgi için Dayanıklı İşlevler sürümleri makalesine bakın.

Önceki örnek birden çok olaydan herhangi birini dinler. Tüm olayları beklemek de mümkündür.

[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);
}

Not

Önceki kod Dayanıklı İşlevler 2.x içindir. Dayanıklı İşlevler 1.x için yerine IDurableOrchestrationContextkullanmanız DurableOrchestrationContext gerekir. Sürümler arasındaki farklar hakkında daha fazla bilgi için Dayanıklı İşlevler sürümleri makalesine bakın.

.NET'te, olay yükü beklenen türe Tdönüştürülemiyorsa bir özel durum oluşturulur.

"Wait-for-external-event" API'sinin bazı girişler için süresiz olarak beklemesi gerekir. İşlev uygulaması beklerken güvenli bir şekilde kaldırılabilir. Bu düzenleme örneği için bir olay gelirse ve geldiğinde, olay otomatik olarak uyandırılır ve olayı hemen işler.

Not

İşlev uygulamanız Tüketim Planı'nı kullanıyorsa, düzenleyici işlevi ne kadar beklerse beklesin bir dış olay görevi beklerken faturalama ücreti uygulanmaz.

Etkinlik İşlevleri'nde olduğu gibi dış olayların da en az bir kez teslim garantisi vardır. Bu, belirli koşullar altında (yeniden başlatmalar, ölçeklendirme, kilitlenmeler vb.) uygulamanızın aynı dış olayın yinelenenlerini alabileceği anlamına gelir. Bu nedenle, dış olayların düzenleyicilerde el ile çoğaltılmasını sağlayan bir tür kimlik içermesini öneririz.

Olayları gönderme

Düzenleme istemci bağlaması tarafından tanımlanan "raise-event" API'sini kullanarak bir düzenlemeye dış olay gönderebilirsiniz. Ayrıca, bir düzenlemeye dış olay göndermek için yerleşik yükseltme olayı HTTP API'sini de kullanabilirsiniz.

Tetiklenen olay parametre olarak bir örnek kimliği, eventName ve eventData içerir. Orchestrator işlevleri bu olayları "wait-for-external-event" API'lerini kullanarak işler. Olayın işlenmesi için eventName öğesinin hem gönderen hem de alan uçlarda eşleşmesi gerekir. Olay verileri de JSON serileştirilebilir olmalıdır.

Dahili olarak, "raise-event" mekanizmaları, bekleyen orchestrator işlevi tarafından alınmış bir iletiyi kuyruhlar. Örnek belirtilen olay adını beklemiyorsa, olay iletisi bellek içi kuyruğa eklenir. Düzenleme örneği daha sonra bu olay adını dinlemeye başlarsa, olay iletileri için kuyruğu denetler.

Not

Belirtilen örnek kimliğine sahip bir düzenleme örneği yoksa, olay iletisi atılır.

Aşağıda, bir orchestrator işlev örneğine "Approval" olayı gönderen kuyrukla tetiklenen bir işlev örneği verilmiştir. Düzenleme örneği kimliği, kuyruk iletisinin gövdesinden gelir.

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

Not

Önceki C# kodu Dayanıklı İşlevler 2.x içindir. Dayanıklı İşlevler 1.x için özniteliği OrchestrationClient yerine DurableClient özniteliğini ve yerine IDurableOrchestrationClientparametre türünü kullanmanız DurableOrchestrationClient gerekir. Sürümler arasındaki farklar hakkında daha fazla bilgi için Dayanıklı İşlevler sürümleri makalesine bakın.

Dahili olarak, "raise-event" API'si, bekleyen orchestrator işlevi tarafından alınmış bir iletiyi sıralar. Örnek belirtilen olay adını beklemiyorsa, olay iletisi bellek içi arabelleğe eklenir. Düzenleme örneği daha sonra bu olay adını dinlemeye başlarsa, olay iletileri için arabelleği denetler ve bekleyen görevi tetikler.

Not

Belirtilen örnek kimliğine sahip bir düzenleme örneği yoksa, olay iletisi atılır.

HTTP

Aşağıda, bir düzenleme örneğine "Onay" olayı oluşturan bir HTTP isteği örneği verilmiştir.

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

"true"

Bu durumda örnek kimliği MyInstanceId olarak sabit kodlanır.

Sonraki adımlar