Durum Bilgili İş Akışları için Durable Functions
Uzun süren iş akışlarını Durable Functions düzenleyici kalıplarıyla (çatallanma-birleşme, zincirleme, izleme) yönetin ve durumun nasıl denetim noktalarına kaydedildiğini anlayın.
Durum Bilgili İş Akışları için Durable Functions, CoddyKit'te ücretsiz bir Cloud & IT Cert Prep dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Cloud & IT Cert Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Cloud & IT Cert Prep kursu toplamda 4 dersten oluşur.
Neden Durable Functions?
Normal Azure İşlevleri durum bilgisi içermez; her çağrı, önceki çağrılarla ilgili hiçbir bilgi olmadan bağımsız şekilde çalışır. Durable Functions, düz async/await kodu kullanarak durum bilgisi içeren, uzun süre çalışan iş akışları yazma olanağı sağlayarak Azure İşlevlerini genişletir. Durable Task Framework, her adımdan sonra durumu Azure Storage'a otomatik olarak denetim noktasıyla kaydeder. Böylece iş akışları sunucu yeniden başlatmalarından, zaman aşımlarından veya planlı bakımdan etkilenmeden kaldıkları yerden devam edebilir.
Üç İşlev Türü
Durable Functions üç işlev türü sunar. Bir düzenleyici işlev, genel iş akışını koordine eder; etkinlik işlevlerini çağırır ve bir iş parçacığını gerçekten engellemeden yield veya await kullanarak sonuçları bekler. Bir etkinlik işlevi, tek bir iş birimini gerçekleştirir (bir API çağırmak veya bir veritabanına yazmak gibi) ve yan etkilerin gerçekleşmesi gereken tek yerdir. Bir varlık işlevi, çağrılar arasında küçük kalıcı durum parçalarını (sayaçlar, işaretler) korur.
// Client function (HTTP trigger) — starts the orchestration
module.exports = async function (context, req) {
const client = df.getClient(context);
const orderId = req.body.orderId;
const instanceId = await client.startNew('OrderOrchestrator', undefined, { orderId });
return client.createCheckStatusResponse(context.bindingData.req, instanceId);
};Zincirleme Deseni
zincirleme deseni, etkinlik işlevlerini sıralı olarak çalıştırır ve birinin çıktısını sonraki işlevin girdisi olarak aktarır. Düzenleyici, her etkinliği sırayla bekler. Herhangi bir etkinlik başarısız olursa iş akışı durur ve başarısız olan adımdan yeniden başlatılabilir. Bu, en basit Durable Functions desenidir ve sipariş işleme işlem hatları gibi her adımın önceki adımın sonucuna bağlı olduğu iş akışları için uygundur.
// Orchestrator: chaining pattern
const df = require('durable-functions');
module.exports = df.orchestrator(function* (context) {
const orderId = context.df.getInput().orderId;
const validated = yield context.df.callActivity('ValidateOrder', orderId);
const charged = yield context.df.callActivity('ChargePayment', validated);
const shipped = yield context.df.callActivity('ShipOrder', charged);
return { status: 'shipped', trackingId: shipped.trackingId };
});Fan-Out / Fan-In Deseni
fan-out/fan-in deseni, birden çok etkinlik işlevini paralel olarak başlatır ve devam etmeden önce hepsinin tamamlanmasını bekler. Düzenleyici, tüm görevleri aynı anda callActivity kullanarak ve onları beklemeden başlatır, görev nesnelerini bir dizi içinde toplar ve ardından Task.all() üzerinde yield uygular. Bu yaklaşım, birden çok dosyayı işleme, birden çok API'yi çağırma veya toplu işlemler gibi bağımsız iş öğelerinde sıralı işleme göre çok daha hızlıdır.
// Orchestrator: fan-out / fan-in
module.exports = df.orchestrator(function* (context) {
const items = context.df.getInput().items;
// Fan-out: start all tasks in parallel
const tasks = items.map(item => context.df.callActivity('ProcessItem', item));
// Fan-in: wait for all tasks to complete
const results = yield context.df.Task.all(tasks);
return results;
});İzleme Deseni
izleme deseni, bir koşul karşılanana kadar dış sistemi belirli aralıklarla sorgular; bu yönüyle tamamen kalıcı bir sorgulama döngüsüne benzer. Düzenleyici, durumu denetlemek için bir etkinlik çağırır, createTimer kullanarak yapılandırılabilir bir aralık kadar bekler ve ardından döngüyü sürdürür. Durum her sorgulama arasında depolamaya denetim noktasıyla kaydedildiğinden düzenleyici beklerken işlem kaynaklarını tüketmez. Bu da yaklaşımı, uykuya geçen zamanlayıcı tabanlı çözümlerden çok daha verimli kılar.
// Orchestrator: monitor pattern (poll until job completes)
module.exports = df.orchestrator(function* (context) {
const jobId = context.df.getInput().jobId;
const expiry = new Date(context.df.currentUtcDateTime);
expiry.setHours(expiry.getHours() + 24); // 24-hour timeout
while (context.df.currentUtcDateTime < expiry) {
const status = yield context.df.callActivity('GetJobStatus', jobId);
if (status === 'completed') return { jobId, status };
if (status === 'failed') throw new Error('Job failed');
// Wait 30 seconds before next poll
const nextCheck = new Date(context.df.currentUtcDateTime);
nextCheck.setSeconds(nextCheck.getSeconds() + 30);
yield context.df.createTimer(nextCheck);
}
throw new Error('Workflow timed out');
});İnsan Etkileşimi Deseni
insan etkileşimi deseni, bir düzenlemeyi duraklatır ve yönetici onayı gibi bir dış olayı bekler. Düzenleyici, işlem kaynağı tüketmeden günlerce veya haftalarca bekleyebilen waitForExternalEvent üzerinde yield uygular. Harici bir sistem (e-posta onay bağlantısı, mobil uygulama veya web kancası), olayı tetiklemek için Durable Functions HTTP API'sini çağırır ve düzenlemenin devam etmesini sağlar. Yanıt gelmezse otomatik zaman aşımı ve yükseltme uygulamak için bunu bir zamanlayıcıyla birleştirebilirsiniz.
// Orchestrator: wait for human approval with timeout
module.exports = df.orchestrator(function* (context) {
const request = context.df.getInput();
yield context.df.callActivity('SendApprovalEmail', request);
const timeout = df.Task.createTimer(context, new Date(Date.now() + 48 * 3600 * 1000));
const approval = context.df.waitForExternalEvent('ApprovalResponse');
const winner = yield context.df.Task.any([approval, timeout]);
if (winner === approval) {
const approved = winner.result;
return approved ? 'Approved' : 'Rejected';
} else {
return 'Timed out — escalated';
}
});Düzenleyici Kısıtlamaları
Düzenleyici işlevleri, durumu yeniden oluşturmak için geçmişten birden çok kez yeniden oynatılabileceğinden önemli kısıtlamalara sahiptir. İşlevler belirlenimci olmalıdır; hiçbir zaman Date.now() veya Math.random() kullanmayın ve doğrudan G/Ç çağrıları yapmayın. Bunun yerine zaman damgaları için context.df.currentUtcDateTime kullanın ve tüm G/Ç işlemleri için etkinlik işlevlerini çağırın. Düzenleyici gövdesindeki günlükleme, yeniden oynatma sırasında yinelenen günlük girdileri oluşturur; günlükleme için bunun yerine etkinlik işlevlerini kullanın.
// WRONG — non-deterministic, will cause replay bugs
module.exports = df.orchestrator(function* (context) {
const now = new Date(); // Don't use Date()
const rand = Math.random(); // Don't use Math.random()
const data = await fetch('/api'); // Don't make HTTP calls directly
});
// CORRECT
module.exports = df.orchestrator(function* (context) {
const now = context.df.currentUtcDateTime; // OK
const data = yield context.df.callActivity('FetchData', null); // OK
});Örnekleri Yönetme: Durum ve Sonlandırma
Her düzenleme çalıştırmasının, durumunu sorgulamak, olay göndermek veya çalıştırmayı sonlandırmak için kullanabileceğiniz benzersiz bir örnek kimliği vardır. Durable Functions HTTP yönetim API'si durumu denetleme (GET /instances/{id}), olay gönderme (POST /instances/{id}/raiseEvent/{name}) ve sonlandırma (POST /instances/{id}/terminate) uç noktalarını sağlar. Bu işlemlere program aracılığıyla erişmek için işlevlerinizde Durable istemci bağlamasını kullanın.
// Client function: check orchestration status
module.exports = async function (context, req) {
const client = df.getClient(context);
const instanceId = req.params.instanceId;
const status = await client.getStatus(instanceId, true, true, true);
return {
status: 200,
body: {
instanceId,
runtimeStatus: status.runtimeStatus,
customStatus: status.customStatus,
output: status.output
}
};
};Depolama Arka Ucu ve Performans
Durable Functions, düzenleme geçmişini, örnek durumunu ve işlevler arası ileti kuyruğunu bir Azure Storage Hesabında depolar (daha yüksek aktarım hızı için Azure SQL/Netherite arka uçları da kullanılabilir). Her denetim noktası Azure Table Storage'a ve Azure Queue Storage'a yazma işlemi gerçekleştirir. Yüksek aktarım hızı gerektiren senaryolarda (eş zamanlı binlerce düzenleme), Netherite depolama arka ucu çok daha iyi performans için Azure Event Hubs'ı kullanır. Darboğazları tespit etmek için düzenleme kuyruğunun derinliğini izleyin.
// host.json: configure the Durable Task storage provider
{
'version': '2.0',
'extensions': {
'durableTask': {
'hubName': 'MyTaskHub',
'storageProvider': {
'type': 'azure',
'connectionStringName': 'AzureWebJobsStorage',
'controlQueueBatchSize': 32,
'maxQueuePollingInterval': '00:00:02'
}
}
}
}Hata İşleme ve Yeniden Denemeler
Etkinlik işlevleri özel durum oluşturabilir; bu özel durumlar düzenleyiciye TaskFailedException olarak iletilir. Hataları uygun şekilde ele almak için düzenleyicide try-catch bloklarını kullanın. Geçici hatalar için callActivityWithRetry kullanarak geri çekilmeli otomatik yeniden denemeler yapılandırın; en fazla deneme sayısını, ilk yeniden deneme aralığını ve geri çekilme katsayısını belirtin. Bu, dış API'leri veya veritabanlarını çağıran etkinlikler için önerilen desendir.
// Orchestrator: retry an activity with exponential backoff
module.exports = df.orchestrator(function* (context) {
const retryOptions = new df.RetryOptions(
5000, // firstRetryIntervalInMilliseconds
3 // maxNumberOfAttempts
);
retryOptions.backoffCoefficient = 2; // 5s, 10s, 20s
try {
const result = yield context.df.callActivityWithRetry(
'CallExternalAPI',
retryOptions,
context.df.getInput()
);
return result;
} catch (e) {
yield context.df.callActivity('SendFailureAlert', e.message);
throw e;
}
});Durable Varlıklar
Durable Entities (varlık işlevleri), kimlik üzerinden erişilebilen küçük kalıcı durum parçalarını uygular; sanal aktörlere benzer. Bir varlığın kimliği ve çağrılar arasında kalıcı olan bir durumu vardır. Bir düzenleyiciden veya istemciden varlık üzerindeki işlemleri çağırırsınız ve varlık bunları tek tek (serileştirilmiş olarak) işler. Yaygın kullanım alanları arasında sayaçlar, onay durum makineleri, hız sınırlayıcılar ve alışveriş sepetleri bulunur; yani veritabanı olmadan kalıcı ve güncellenebilir durum gerektiren her senaryoda kullanılabilirler.
// Counter entity function
const df = require('durable-functions');
module.exports = df.entity(function (context) {
let count = context.df.getState(() => 0);
const operation = context.df.operationName;
if (operation === 'add') count += context.df.getInput();
if (operation === 'reset') count = 0;
if (operation === 'get') context.df.return(count);
context.df.setState(count);
});
// From orchestrator, increment counter entity
// const entityId = new df.EntityId('Counter', 'myCounter');
// yield context.df.callEntity(entityId, 'add', 1);Kısa Kontrol
Bu derste öğrendiğiniz Microsoft Azure Fundamentals (AZ-900) kavramlarını ne kadar anladığınızı test edin.
Ders Özeti
Bu derste şunları öğrendiniz: Durable Functions, düzenleyici durumunu Azure Storage'a denetim noktalarıyla kaydederek durum bilgisi içeren, uzun süre çalışan iş akışlarını mümkün kılar; temel desenler arasında zincirleme, fan-out/fan-in, izleme ve insan etkileşimi bulunur; düzenleyiciler belirlenimci olmalıdır ve tüm G/Ç işlemleri ile belirlenimci olmayan çağrılar etkinlik işlevleri üzerinden gerçekleştirilmelidir. Sırada Azure Logic Apps'ı inceleyeceğiz.
Sıkça Sorulan Sorular
“Durum Bilgili İş Akışları için Durable Functions” dersi ücretsiz mi?
Evet — “Durum Bilgili İş Akışları için Durable Functions” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Cloud & IT Cert Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Cloud & IT Cert Prep kursu toplamda 4 dersten oluşur.
“Durum Bilgili İş Akışları için Durable Functions” dersinde ne öğreneceğim?
Uzun süren iş akışlarını Durable Functions düzenleyici kalıplarıyla (çatallanma-birleşme, zincirleme, izleme) yönetin ve durumun nasıl denetim noktalarına kaydedildiğini anlayın. Cloud & IT Cert Prep ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Cloud & IT Cert Prep öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Cloud & IT Cert Prep, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“Durum Bilgili İş Akışları için Durable Functions” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Cloud & IT Cert Prep dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Cloud & IT Cert Prep dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Azure Functions Tetikleyicileri ve Bağlamaları
- Durum Bilgili İş Akışları için Durable Functions
- Azure Logic Apps
- Event Grid ve Olay Odaklı Mimari