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 IDurableOrchestrationContext
kullanmanı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 IDurableOrchestrationContext
kullanmanı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 IDurableOrchestrationContext
kullanmanı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 T
dö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 IDurableOrchestrationClient
parametre 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.