Dayanıklı İşlevler nedir?
Dayanıklı İşlevler, sunucusuz Azure İşlevleri durum bilgi işlem ortamında durum bilgi işlem işlevleri yazmanız için bir uzantıdır. Uzantı, programlama modelini kullanarak varlık işlevleri yazarak orchestrator işlevleri ve durum bilgisi olan varlıklar yazarak durum bilgisi Azure İşlevleri tanımlamanızı sağlar. Uzantı arka perde arkasında sizin için durumu, denetim noktalarını ve yeniden başlatmaları yönetir ve iş mantığınıza odaklanmanıza olanak sağlar.
Desteklenen diller
Dayanıklı İşlevler şu anda aşağıdaki dilleri destekler:
- C#: hem önceden derlemeli sınıf kitaplıkları hem de C# betiği.
- JavaScript: yalnızca çalışma zamanının 2.x veya sonraki bir sürümü Azure İşlevleri destekler. Uygulama uzantısının 1.7.0 Dayanıklı İşlevler veya sonraki bir sürümünü gerektirir.
- Python: Dayanıklı İşlevler uzantısının 2.3.1 sürümünü veya sonraki bir sürümünü gerektirir.
- F#: önceden derlemeli sınıf kitaplıkları ve F# betiği. F# betiği yalnızca Azure İşlevleri çalışma zamanının 1.x sürümü için kullanılabilir.
- PowerShell: Yalnızca Azure İşlevleri çalışma zamanının 3.x sürümü ve PowerShell 7 için desteklenen. Paket uzantılarının 2.x sürümünü gerektirir.
En son özelliklere ve güncelleştirmelere erişmek için, Dayanıklı İşlevler uzantısının en son sürümlerini ve dile özgü Dayanıklı İşlevler önerilir. Sürümler hakkında daha Dayanıklı İşlevler bilgi.
Dayanıklı İşlevler tüm dillerini desteklemeyi Azure İşlevleri vardır. Ek dilleri Dayanıklı İşlevler için en son çalışma durumuyla ilgili sorunlar listesine bakın.
Diğer Azure İşlevleri gibi, Dayanıklı İşlevler 2019 ,Visual Studio Visual Studio Code ve Azure portal kullanarak Azure portal geliştirmeniz için şablonlar Azure portal.
Uygulama desenleri
Bu uygulamaların birincil kullanım Dayanıklı İşlevler sunucusuz uygulamalarda karmaşık, durum bilgili koordinasyon gereksinimlerini basitleştirmektir. Aşağıdaki bölümlerde, uygulama modellerinden yararlanabilecek tipik uygulama desenleri Dayanıklı İşlevler:
- İşlev zinciri oluşturma
- Yelpaze dışarı/yelpaze içeri
- Zaman uyumsuz HTTP API’leri
- İzleme
- İnsan etkileşimi
- Toplayıcı (durumful varlıklar)
Desen 1: İşlev zincirleme
İşlev zincirleme düzeninde bir işlev dizisi belirli bir sırada yürütülür. Bu düzende, bir işlevin çıkışı başka bir işlevin girişine uygulanır.

İşlev zincirleme Dayanıklı İşlevler uygulamak için aşağıdaki örnekte gösterildiği gibi kullanabilirsiniz.
Bu örnekte , F1 F2 , ve değerleri aynı F3 işlev F4 uygulamasındaki diğer işlevlerin adlarıdır. Denetim akışını normal bir gereklilik kodlama yapılarını kullanarak gerçekleştirin. Kod, en üstten aşağı doğru yürütülür. Kod, koşullular ve döngüler gibi mevcut dil denetimi akış semantiğine sahip olabilir. Bloklara hata işleme mantığı try / catch / finally ekleyebilirsiniz.
[FunctionName("Chaining")]
public static async Task<object> Run(
[OrchestrationTrigger] IDurableOrchestrationContext context)
{
try
{
var x = await context.CallActivityAsync<object>("F1", null);
var y = await context.CallActivityAsync<object>("F2", x);
var z = await context.CallActivityAsync<object>("F3", y);
return await context.CallActivityAsync<object>("F4", z);
}
catch (Exception)
{
// Error handling or compensation goes here.
}
}
Diğer işlevleri adına göre çağırmak, parametreleri geçmek ve context işlev çıktısını iade etmek için parametresini kullanabilirsiniz. Kod her await çağrısında, Dayanıklı İşlevler çerçeve denetim noktaları geçerli işlev örneğinin ilerlemesini kontroller. İşlem veya sanal makine yürütmenin ortasında geri dönüşüme geçiyorsa işlev örneği önceki çağrıdan devam await eder. Daha fazla bilgi için Sonraki bölüm olan Desen #2: Fan out/fan in bölümüne bakın.
Desen 2: Vantilatör/vantilatör
Fan out/fan desende, birden çok işlevi paralel olarak yürütür ve ardından tüm işlevlerin bitimini beklersiniz. Genellikle, işlevlerden döndürülen sonuçlar üzerinde bazı toplama çalışmaları yapılır.

Normal işlevlerle, işlevin bir kuyruğa birden çok ileti göndermesi gerektirerek uzabilirsiniz. Geri dönmek çok daha zordur. Normal bir işlevde, kuyruğa alınan işlevlerin ne zaman bit olduğunu izlemek için kod yazar ve ardından işlev çıkışlarını depolarsiniz.
Bu Dayanıklı İşlevler uzantısı görece basit kodla bu düzeni işlemeye devam ediyor:
[FunctionName("FanOutFanIn")]
public static async Task Run(
[OrchestrationTrigger] IDurableOrchestrationContext context)
{
var parallelTasks = new List<Task<int>>();
// Get a list of N work items to process in parallel.
object[] workBatch = await context.CallActivityAsync<object[]>("F1", null);
for (int i = 0; i < workBatch.Length; i++)
{
Task<int> task = context.CallActivityAsync<int>("F2", workBatch[i]);
parallelTasks.Add(task);
}
await Task.WhenAll(parallelTasks);
// Aggregate all N outputs and send the result to F3.
int sum = parallelTasks.Sum(t => t.Result);
await context.CallActivityAsync("F3", sum);
}
Fan-out işi, işlevin birden çok örneğine F2 dağıtılır. Çalışma, dinamik bir görev listesi kullanılarak iz takip edildi. Task.WhenAll çağrılır ve çağrılır tüm işlevlerin bitimini bekler. Ardından, F2 işlev çıkışları dinamik görev listesinden toplanır ve işleve F3 geçiri.
çağrısında meydana gelen otomatik denetim noktası, olası bir orta yol kilitlenmesi veya yeniden başlatmanın zaten tamamlanmış bir görevin await Task.WhenAll yeniden başlatılmasını gerektirmeyer.
Not
Nadir durumlarda, etkinlik işlevi tamamlandıktan sonra ancak tamamlanmadan önce düzenleme geçmişine kaydedilene kadar pencerede bir kilitlenme olabilir. Bu durumda etkinlik işlevi, işlem kurtarıldıktan sonra en baştan yeniden çalıştırılabilir.
Desen #3: Zaman uyumsuz HTTP API'leri
Zaman uyumsuz HTTP API 'SI stili, uzun süreli işlemlerin durumunu dış istemcilerle koordine etme sorununu ele alınmaktadır. Bu düzenin uygulanması için ortak bir yol, bir HTTP uç noktasının uzun süreli eylemi tetiklemesine sahip olunmalıdır. Daha sonra, istemciyi, işlem bittiğinde öğrenmek için yokladığı bir durum uç noktasına yönlendirin.

Dayanıklı İşlevler, bu düzene yönelik yerleşik destek sağlar, bu sayede yazmanız gereken kod, uzun süre çalışan işlev yürütmeleri ile etkileşime geçmek için gerekir. Örneğin, Dayanıklı İşlevler hızlı başlangıç örnekleri (C# ve JavaScript), yeni Orchestrator işlev örnekleri başlatmak IÇIN kullanabileceğiniz bir basit rest komutu gösterir. Bir örnek başlatıldıktan sonra uzantı, Orchestrator işlev durumunu sorgulayan Web kancası HTTP API 'Lerini kullanıma sunar.
Aşağıdaki örnekte, bir Orchestrator başlatan ve durumunu sorgulayan REST komutları gösterilmektedir. Anlaşılırsa, bazı protokol ayrıntıları örnekteki atlanır.
> curl -X POST https://myfunc.azurewebsites.net/api/orchestrators/DoWork -H "Content-Length: 0" -i
HTTP/1.1 202 Accepted
Content-Type: application/json
Location: https://myfunc.azurewebsites.net/runtime/webhooks/durabletask/instances/b79baf67f717453ca9e86c5da21e03ec
{"id":"b79baf67f717453ca9e86c5da21e03ec", ...}
> curl https://myfunc.azurewebsites.net/runtime/webhooks/durabletask/instances/b79baf67f717453ca9e86c5da21e03ec -i
HTTP/1.1 202 Accepted
Content-Type: application/json
Location: https://myfunc.azurewebsites.net/runtime/webhooks/durabletask/instances/b79baf67f717453ca9e86c5da21e03ec
{"runtimeStatus":"Running","lastUpdatedTime":"2019-03-16T21:20:47Z", ...}
> curl https://myfunc.azurewebsites.net/runtime/webhooks/durabletask/instances/b79baf67f717453ca9e86c5da21e03ec -i
HTTP/1.1 200 OK
Content-Length: 175
Content-Type: application/json
{"runtimeStatus":"Completed","lastUpdatedTime":"2019-03-16T21:20:57Z", ...}
Dayanıklı İşlevler Runtime, durumu sizin için yönettiğinden, kendi durum izleme mekanizmanızı uygulamanız gerekmez.
Dayanıklı İşlevler uzantısı, uzun süre çalışan düzenlemeleri yöneten yerleşik HTTP API 'Lerini kullanıma sunar. Bunun yerine kendi işlev tetikleyiclerinizi (HTTP, kuyruk veya Azure Event Hubs gibi) ve Orchestration istemci bağlamasınıkullanarak kendiniz uygulayabilirsiniz. Örneğin, sonlandırma tetiklenmesi için bir kuyruk iletisi kullanabilirsiniz. ya da, kimlik doğrulaması için oluşturulmuş bir anahtar kullanan yerleşik http apı 'leri yerine Azure Active Directory kimlik doğrulama ilkesi tarafından korunan bir HTTP tetikleyicisi kullanabilirsiniz.
Daha fazla bilgi için, Dayanıklı İşlevler uzantısını kullanarak HTTP üzerinden zaman uyumsuz, uzun süreli işlemleri nasıl sergilebileceğinizi anlatan http özellikleri makalesine bakın.
#4 Model: Izleyici
İzleyici deseninin bir iş akışında esnek ve yinelenen bir işlem anlamına gelir. Belirli koşullar karşılanana kadar bir örnek yoklanıyor. Düzenli bir temizleme işi gibi temel bir senaryoya yönelik olarak normal bir Zamanlayıcı tetikleyicisi kullanabilirsiniz, ancak aralığı statiktir ve örnek yaşam sürelerinin yönetilmesi karmaşık hale gelir. Esnek yineleme aralıkları oluşturmak, görev yaşam sürelerini yönetmek ve tek bir düzenleme işleminden birden çok izleme işlemi oluşturmak için Dayanıklı İşlevler kullanabilirsiniz.
İzleyici deseninin bir örneği, önceki zaman uyumsuz HTTP API senaryosunun tersine çevrilmeye yönelik bir örnektir. Bir dış istemcinin uzun süreli bir işlemi izlemeye yönelik bir uç nokta göstermek yerine, uzun süre çalışan izleyici bir dış uç nokta kullanır ve ardından bir durum değişikliği bekler.

Birkaç kod satırı içinde, rastgele uç noktaları gözlemleyecek birden çok izleyici oluşturmak için Dayanıklı İşlevler kullanabilirsiniz. İzleyiciler, bir koşul karşılandığında çalışmayı sonlandırabilir veya başka bir işlev, izleyicileri sonlandırmak için dayanıklı düzenleme istemcisini kullanabilir. Bir izleyicinin wait aralığını belirli bir koşula göre değiştirebilirsiniz (örneğin üstel geri alma)
Aşağıdaki kod temel bir izleyiciyi uygular:
[FunctionName("MonitorJobStatus")]
public static async Task Run(
[OrchestrationTrigger] IDurableOrchestrationContext context)
{
int jobId = context.GetInput<int>();
int pollingInterval = GetPollingInterval();
DateTime expiryTime = GetExpiryTime();
while (context.CurrentUtcDateTime < expiryTime)
{
var jobStatus = await context.CallActivityAsync<string>("GetJobStatus", jobId);
if (jobStatus == "Completed")
{
// Perform an action when a condition is met.
await context.CallActivityAsync("SendAlert", machineId);
break;
}
// Orchestration sleeps until this time.
var nextCheck = context.CurrentUtcDateTime.AddSeconds(pollingInterval);
await context.CreateTimer(nextCheck, CancellationToken.None);
}
// Perform more work here, or let the orchestration end.
}
Bir istek alındığında, bu iş KIMLIĞI için yeni bir düzenleme örneği oluşturulur. Örnek, bir koşul karşılanana ve döngünün çıkış yapılıncaya kadar bir durumu yoklar. Dayanıklı bir Zamanlayıcı yoklama aralığını denetler. Daha sonra, daha fazla iş gerçekleştirilebilir veya düzenleme sona erdirmek üzere. nextCheckAştığında expiryTime , izleyici sona erer.
#5 model: Insan etkileşimi
Birçok otomatikleştirilmiş süreç, bazı insan etkileşimini içerir. İnsanlar yüksek düzeyde kullanılabilir olmadığından ve bulut hizmetleri olarak yanıt veremediği için otomatikleştirilmiş bir işlem içindeki insanların dahil olması önemlidir. Otomatik bir işlem, zaman aşımları ve maaş mantığı kullanılarak bu etkileşime izin verebilir.
Onay süreci, insan etkileşimini içeren bir iş sürecinin örneğidir. Belirli bir dolar tutarını aşan bir gider raporu için bir yöneticinin onayı gerekli olabilir. Yönetici, 72 saat içinde gider raporunu onaylamaz (örneğin, bu da yönetici tatilde durumunda olursa), bir yükseltme işlemi, başka birinden (Belki de yöneticinin Yöneticisi) onay almak için ' de açılır.

Bu örnekte, bir Orchestrator işlevi kullanarak bir stili uygulayabilirsiniz. Orchestrator onay istemek için dayanıklı bir Zamanlayıcı kullanır. Zaman aşımı oluşursa Orchestrator ilerletir. Orchestrator, bir insan etkileşimi tarafından oluşturulan bildirim gibi bir dış olaybekler.
Bu örnekler insan etkileşimi modelini göstermek için bir onay işlemi oluşturur:
[FunctionName("ApprovalWorkflow")]
public static async Task Run(
[OrchestrationTrigger] IDurableOrchestrationContext context)
{
await context.CallActivityAsync("RequestApproval", null);
using (var timeoutCts = new CancellationTokenSource())
{
DateTime dueTime = context.CurrentUtcDateTime.AddHours(72);
Task durableTimeout = context.CreateTimer(dueTime, timeoutCts.Token);
Task<bool> approvalEvent = context.WaitForExternalEvent<bool>("ApprovalEvent");
if (approvalEvent == await Task.WhenAny(approvalEvent, durableTimeout))
{
timeoutCts.Cancel();
await context.CallActivityAsync("ProcessApproval", approvalEvent.Result);
}
else
{
await context.CallActivityAsync("Escalate", null);
}
}
}
Dayanıklı Zamanlayıcı 'yı oluşturmak için çağrısı yapın context.CreateTimer . Bildirim tarafından alınır context.WaitForExternalEvent . Ardından, Task.WhenAny ilerletilip yükseltilmeyeceğine karar vermek için çağrılır (Öncelikle zaman aşımı olur) veya onay işlemini işleyin (onay zaman aşımından önce alınır).
Dış istemci, YERLEŞIK HTTP API 'lerinikullanarak olay bildirimini bekleyen bir Orchestrator işlevine teslim edebilir:
curl -d "true" http://localhost:7071/runtime/webhooks/durabletask/instances/{instanceId}/raiseEvent/ApprovalEvent -H "Content-Type: application/json"
Aynı zamanda aynı işlev uygulamasındaki başka bir işlevden dayanıklı düzenleme istemcisi kullanılarak bir olay da oluşturulabilir:
[FunctionName("RaiseEventToOrchestration")]
public static async Task Run(
[HttpTrigger] string instanceId,
[DurableClient] IDurableOrchestrationClient client)
{
bool isApproved = true;
await client.RaiseEventAsync(instanceId, "ApprovalEvent", isApproved);
}
#6 Model: toplayıcı (durum bilgisi olan varlıklar)
Altıncı model, olay verilerini bir süre içinde tek bir adreslenebilir varlığa toplamak üzere kullanılır. Bu düzende, toplanan veriler birden çok kaynaktan gelebilir, toplu olarak teslim edilebilir veya uzun sürelerle dağılmış olabilir. Toplayıcı, ulaşan olay verileri üzerinde işlem yapması gerekebilir ve dış istemcilerin toplanan verileri sorgulaması gerekebilir.

Bu düzenin normal, durum bilgisiz işlevlerle uygulamaya çalışılması, eşzamanlılık denetiminin çok büyük bir zorluk haline gelmesi. Aynı anda aynı verileri değiştiren birden çok iş parçacığı hakkında endişelenmeniz gerekmez, ayrıca toplayıcı 'nın aynı anda yalnızca tek bir VM üzerinde çalışmasını sağlamaya de endişelenmeniz gerekir.
Bu kalıbı tek bir işlev olarak kolayca uygulamak için dayanıklı varlıkları kullanabilirsiniz.
[FunctionName("Counter")]
public static void Counter([EntityTrigger] IDurableEntityContext ctx)
{
int currentValue = ctx.GetState<int>();
switch (ctx.OperationName.ToLowerInvariant())
{
case "add":
int amount = ctx.GetInput<int>();
ctx.SetState(currentValue + amount);
break;
case "reset":
ctx.SetState(0);
break;
case "get":
ctx.Return(currentValue);
break;
}
}
Dayanıklı varlıklar, .NET ' de sınıflar olarak modellenebilir. Bu model, işlem listesi düzeltildiğinde ve büyük olursa yararlı olabilir. Aşağıdaki örnek, Counter .NET sınıfları ve yöntemleri kullanılarak varlığın eşdeğer bir uygulamasıdır.
public class Counter
{
[JsonProperty("value")]
public int CurrentValue { get; set; }
public void Add(int amount) => this.CurrentValue += amount;
public void Reset() => this.CurrentValue = 0;
public int Get() => this.CurrentValue;
[FunctionName(nameof(Counter))]
public static Task Run([EntityTrigger] IDurableEntityContext ctx)
=> ctx.DispatchAsync<Counter>();
}
İstemciler, varlık istemci bağlamasınıkullanarak bir varlık işlevi için ("sinyal" olarak da bilinir) işlemleri sıraya alabilir.
[FunctionName("EventHubTriggerCSharp")]
public static async Task Run(
[EventHubTrigger("device-sensor-events")] EventData eventData,
[DurableClient] IDurableEntityClient entityClient)
{
var metricType = (string)eventData.Properties["metric"];
var delta = BitConverter.ToInt32(eventData.Body, eventData.Body.Offset);
// The "Counter/{metricType}" entity is created on-demand.
var entityId = new EntityId("Counter", metricType);
await entityClient.SignalEntityAsync(entityId, "add", delta);
}
Not
Dinamik olarak oluşturulan proxy 'ler, sinyal varlıkları için tür açısından güvenli bir şekilde .NET içinde de kullanılabilir. Ayrıca, istemciler, düzenleme istemci bağlamasında tür kullanımı uyumlu yöntemler kullanarak bir varlık işlevinin durumunu da sorgulayabilir.
Varlık işlevleri C#, JavaScript ve Python için Dayanıklı İşlevler 2,0 ve üzeri sürümlerde kullanılabilir.
Teknoloji
arka planda Dayanıklı İşlevler uzantısı, kodda iş akışları oluşturmak için kullanılan GitHub açık kaynaklı bir kitaplık olan dayanıklı görev çerçevesininüzerine kurulmuştur. Azure Işlevleri gibi, Azure WebJobs 'ın sunucusuz bir gelişimi olduğundan, Dayanıklı İşlevler dayanıklı görev çerçevesinin sunucusuz bir gelişmidir. Microsoft ve diğer kuruluşlar, görev açısından kritik işlemleri otomatik hale getirmek için dayanıklı görev çerçevesini yoğun bir şekilde kullanır. Sunucusuz Azure Işlevleri ortamına yönelik doğal bir uyum.
Kod kısıtlamaları
Güvenilir ve uzun süreli yürütme garantisi sağlamak için, Orchestrator işlevlerinin izlenmesi gereken bir dizi kodlama kuralı vardır. Daha fazla bilgi için bkz. Orchestrator işlev kodu kısıtlamaları makalesi.
Faturalama
Dayanıklı İşlevler Azure Işlevleri ile aynı faturalandırılır. Daha fazla bilgi için bkz. Azure işlevleri fiyatlandırması. Azure Işlevleri Tüketim planındaOrchestrator işlevleri çalıştırıldığında, bazı fatura davranışları göz önünde bulundurulmalıdır. Bu davranışlar hakkında daha fazla bilgi için dayanıklı işlevler faturalandırma makalesine bakın.
Hemen geç
Bu dile özgü hızlı başlangıç öğreticilerden birini tamamlayarak 10 dakikadan kısa bir süre içinde Dayanıklı İşlevler kullanmaya başlamanızı sağlayabilirsiniz:
- Visual Studio 2019 kullanarak C#
- Visual Studio Code kullanan JavaScript
- Visual Studio Code kullanarak Python
- Visual Studio Code kullanarak PowerShell
Bu hızlı başlangıçlarda, "Hello World" dayanıklı işlevini yerel olarak oluşturup test edersiniz. Ardından işlev kodunu Azure’da yayımlayacaksınız. Oluşturduğunuz işlev, diğer işlevlere yapılan çağrıları düzenler ve birbirine zincirler.
Lardır
Dayanıklı İşlevler, Microsoft Research ile işbirliği içinde geliştirilmiştir. Sonuç olarak, Dayanıklı İşlevler ekibi etkin bir şekilde araştırma kağıtları ve yapıtları üretir; Bunlar şunları içerir:
- Dayanıklı işlevler: durum bilgisi sunucusuz (oopsla ' 21) için anlambilim
- Dayanıklı işlevler ve Netherite Ile sunucusuz Iş akışları (önceden yazdırma)
Daha fazla bilgi edinin
Aşağıdaki videoda Dayanıklı İşlevler avantajları vurgulanmıştır:
Dayanıklı İşlevler ve temel alınan teknolojinin daha ayrıntılı bir tartışması için aşağıdaki videoya bakın (.NET 'e odaklanılmıştır, ancak kavramlar desteklenen diğer diller için de geçerlidir):
Dayanıklı İşlevler Azure işlevleriiçin gelişmiş bir uzantı olduğundan, tüm uygulamalar için uygun değildir. Diğer Azure düzenleme teknolojileriyle bir karşılaştırma için bkz. Azure Işlevlerini karşılaştırma ve Azure Logic Apps.