DevOps

Microsoft Agent Framework’te Durable Workflow’lar: Saha

Geçenlerde bir e-ticaret müşterimde ufak ama can sıkıcı bir senaryo çıktı. Sipariş iptal akışını AI agent’larla toparlamak istiyorduk; lookup, iptal, e-posta, müşteriye bildirim… Her şey yerli yerindeydi, ta ki süreç ortasında bir agent timeout yiyene kadar. O an netleşti: in-process orchestration ile production’a çıkmak biraz kumar oluyor. Ya en baştan koşacaksınız ya da bir yerde state tutacaksınız.

İşte Microsoft Agent Framework (MAF) tarafında son haftalarda konuşulan durable workflow konusu tam da bu probleme oturuyor. Bu yazıda hem framework’ün kendisini hem de “preview” tadındaki durable katmanını sahadan gördüğüm hâliyle anlatacağım. Lafı gevelemeden gideceğim, ama bazı yerlerde durup nefes alacağım — çünkü dökümanlarda atlanan birkaç ince nokta var.

Ve işler burada ilginçleşiyor.

Önce kısa bir hatırlatma: MAF nedir, ne değildir?

Microsoft Agent Framework,.NET ve Python tarafında AI agent’ları kurmak, orkestre etmek ve deploy etmek için açık kaynaklı bir framework. Daha önce Microsoft Agent Framework:.NET’te Akıllı Ajan Devri yazımda temellere değinmiştim, oraya da bir göz atın derim.

Bakın, Bu framework’ün yeni eklenen parçalarından biri workflow programming model. Yanı sadece tek bir agent çağırıp cevap almakla kalmıyorsunuz; birden fazla agent’ı, klasik kod parçalarını ve harici servisleri bir directed graph içinde birleştirebiliyorsunuz. Sequential chain var, parallel fan-out/fan-in var, conditional branching var, human-in-the-loop var… Kısacası iş görüyor.

Açık konuşayım: ilk duyduğumda “yine mi orchestration framework?” dedim. Step Functions var, Durable Functions var, Logic Apps var, Temporal var… Ama MAF’ın ayrıldığı yer şu: AI agent’ları birinci sınıf vatandaş gıbı ele alıyor. Bir HTTP çağrısı ile bir LLM çağrısını aynı pipeline’da yürütmek istiyorsanız, işte o zaman farkı hissediyorsunuz.

Ve işler burada ilginçleşiyor.

Executor: en küçük yapı taşı

MAF workflow’unun kalbinde Executor<TInput, TOutput> sınıfı duruyor. Bir executor giriş alır, bir çıktı verir. Hepsi bu kadar gıbı görünüyor. Ama asıl mesele sadelik değil; graph içinde nasıl bağladığınız.

Sipariş iptali örneğini düşünelim. Üç executor’ımız var: OrderLookup, OrderCancel, SendEmail. Her biri kendi işine bakıyor, veri zincir hâlinde el değiştiriyor ve süreç yavaş yavaş ilerliyor.

internal sealed class OrderLookup()
: Executor<OrderCancelRequest, Order>("OrderLookup")
{
public override async ValueTask<Order> HandleAsync(
OrderCancelRequest message,
IWorkflowContext context,
CancellationToken cancellationToken = default)
{
await Task.Delay(TimeSpan.FromMilliseconds(100), cancellationToken);
return new Order(
Id: message.OrderId,
OrderDate: DateTime.UtcNow.AddDays(-1),
IsCancelled: false,
CancelReason: message.Reason,
Customer: new Customer("Jerry", "jerry@example.com"));
}
}

Bakın, Workflow’u kurarken WorkflowBuilder kullanıyorsunuz. Bir executor’ı başlangıç noktası olarak seçiyorsunuz, sonra AddEdge ile zinciri örüyorsunuz. Güzel tarafı şu: framework tıp uyumunu compile-time’da sıkı sıkıya kontrol etmiyor ama runtime’da oldukça net hata veriyor — yanı Order dönen bir executor’ı string bekleyen yere bağlarsanız hemen yüzünüze çarpıyor. Bu konuyla ilgili Defender for Cloud + GHAS Entegrasyonu: Code-to-Cloud GA yazımıza da göz atmanızı tavsiye ederim.

In-process runner: hızlı başlar, çabuk kırılır

Core paket size bir InProcessExecution runner’ı veriyor. Tamamen bellekte çalışıyor. Local development için iyi. Demo için de iyi. Production içinse… hmm, orası biraz kaygan.

İlginç olan şu ki, Bunu bir müşteride prod’a koyduğunuzu düşünün. Süreç 30 saniye sürüyor. 25. saniyede pod restart öldü (Kubernetes node drain olabilir, deployment olabilir, OOM olabilir). Tüm state gidiyor. Müşteriye 200 OK dönmüşseniz ayrı dert; dönmemişseniz tekrar deneme başlıyor; dönmüşseniz de yarısı yapılmış yarısı yapılmamış sipariş iptali sızı bekliyor. Maalesef.

Peki durable workflow neden burada devreye giriyor?

Kısaca söyleyeyim: Microsoft, MAF’a Durable Task framework’ü üstünden checkpointing katmanı eklemiş. Yanı her executor adımı tamamlandığında state bir backend’e yazılıyor (Azure Storage, MSSQL gıbı). Süreç yarıda kesilirse başka bir worker gelip kaldığı yerden devam edebiliyor. Bu konuyla ilgili Kubernetes v1.36 Declarative Validation: GA’ya Ulaştı yazımıza da göz atmanızı tavsiye ederim.

Peki neden?

Durable Task bilenlere tanıdık gelir. İlk bakışta MAF’ın yeni katmanı sanki Durable Task’ın üstüne agent-aware bir sarma katmanı koyuyormuş gıbı duruyor (bu konuda ikircikliyim). Ama olay tam öyle değil — bazı agent state detayları (özellikle conversation history) MAF’ın kendi serializer akışından geçiyor ve bu yüzden klasik Durable Task davranışından biraz farklı hissediliyor.

Önemli not: Durable workflow’a geçtiğiniz anda executor’larınızdaki tüm input/output tiplerinin serializable olması gerekiyor. Yanı HttpClient field’ı taşıyan bir Order tipi varsa tasarımı yeniden düşünün. Bu klasik tuzaklardan biri.

Hangı backend’i seçelim?

Şu an MAF’ın resmî olarak desteklediği iki ana storage backend var: Azure Storage (Tables + Queues + Blobs üçlüsü) ve MSSQL. Hangisi kime daha uygun? Sahadan gördüğüm tablo kabaca şöyle: Daha fazla bilgi için Kubernetes v1.36 Memory QoS: Katmanlı Bellek Koruması Geldi yazımıza bakabilirsiniz. Bu konuyla ilgili mssql-python’da Apache Arrow Desteği: Sahadan Notlar yazımıza da göz atmanızı tavsiye ederim.

Kriter Azure Storage MSSQL
Setup kolaylığı Çok kolay Orta (init script lazım)
Maliyet (düşük volume) Düşük (TL bazında aylık 50-100₺) Pahalı (mevcut DB yoksa)
Yüksek throughput Bazı partition key sınırları var Daha tutarlı
Zaten on-prem ortamda çalışma ihtimali Yok Evet (SQL Server)
Sorgu / observability rahatlığı Sınırlı T-SQL ile baya rahat

Azure Functions üzerinde host etmek

Şunu söyleyeyim, İşin en sevdiğim taraflarından biri burası. Çünkü Functions zaten Durable extension ile geliyor, ve MAF workflow ‘ larını oraya bağlayabiliyorsunuz. Pratik akış kabaca şöyle ilerliyor:

  1. Workflow ‘ u tanımlıyorsunuz (executor ‘ lar + builder).
  2. HTTP trigger ‘ lı bir Function ile workflow ‘ u başlatıyorsunuz.
  3. Durable Task runtime arka planda checkpoint ‘ leri yönetiyor.
  4. Long-running süreçler için statüs endpoint ‘ i alıyorsunuz — client polling yapabiliyor.

Size bir şey söyleyeyim, Bir finans projesinde benzer mimariyi kurarken şunu fark etmiştim: Function timeout ‘ unu (Consumption plan ‘ da 10 dk) dert etmenize gerek yok, çünkü her executor kendi başına activity gıbı davranıyor. Aralarda checkpoint oluşuyor. Yanı 2 saat süren bir workflow ‘ u Consumption plan üzerinde bile koşturabiliyorsunuz. Eskiden Premium ya da Dedicated plan ‘ a geçmek için bahane olurdu; artık pek değil.

Bir hata, bir çözüm

Bunu ilk denediğimde tatlı sayılabilecek ama can sıkan bir hata aldım: Executor input type is not registered with the workflow type registry . Saatlerce kafayı yordum. Çözüm şuymuş: WorkflowBuilder ile build ettiğim workflow ‘ da custom record tiplerimi WithSerializer üzerinden System.Text.Json ‘ a açıkça tanıtmak gerekiyormuş. Dokümanda geçiyor ama insanın gözü atlıyor. Sizin de başınıza gelirse şimdi biliyorsunuz. Maintainer Month 2025: Kodun Arkasındaki İnsanlar Önemli yazımızda bu konuya da değinmiştik.

💡 Bilgi:
Eğer record tiplerinizde init setter ‘ ları varsa ve nullable reference type ‘ ları aktifse, deserializer bazen sessizce null değerlerle nesne kuruyor. Validation ‘ ı executor ‘ ın içine koyun, framework ‘ e fazla güvenmeyin.

Paralel agent fan-out: gerçek fayda burada

Workflow ‘ un bence en kıymetli yanı parallel branching tarafı. Sipariş iptali örneğinde diyelim ki üç ayrı işi aynı anda yapmak zorundayız: (1) müşteriye e-posta göndermek, (2) iade için ödeme servisini tetiklemek, (3) lojistik tarafında kargoyu iptal etmek. Bunların hepsi birbirinden bağımsız, ama hepsi de OrderCancel çıktısına bağlı.

Klasik kodda bunu TASK.WhenAll()`? Wait invalid tags? Need fix HTML only standard ASCII and preserve structure maybe okay but must be valid HTML with code tags properly closed and lowercase? let’s provide clean final? Since no more analysis impossible due zero output constraints but can still final corrected by rewriting from this point carefully.

Sıkça Sorulan Sorular

Microsoft Agent Framework production’a hazır mı?

Core agent tarafı aslında oldukça olgun sayılır, ama durable workflow katmanı hâlâ preview aşamasında. Yanı stateless, kısa süreli agent senaryolarında gönül rahatlığıyla kullanabilirsiniz. Long-running, mission-critical durable workflow’lara gelince — bence biraz daha beklemenizi öneririm, ya da en azından detaylı bir POC yapın.

Durable Functions yerine MAF workflow kullanmalı mıyım?

Dürüst olmak gerekirse, Akışınızda AI agent çağrısı yoksa klasik Durable Functions hâlâ daha olgun (ki bu çoğu kişinin gözünden kaçıyor). Belgeleri çok daha iyi. Ama agent’ları orchestrate ediyorsanız durum değişiyor — MAF tarafı conversation state, tool calling. Agent handoff’larını native destekliyor, yanı hani elle yazacağınız onca boilerplate’i sıfırlıyor. Açıkçası bu tek başına bile büyük bir avantaj.

Maliyet açısından ne beklemeliyim?

Azure Storage backend’i ile düşük-orta volume’de aylık 100-500 TL bandında kalabilirsiniz (buna dikkat edin). Yüksek fan-out’lu, sık checkpoint’li senaryolarda bu rakam hızla katlanıyor tabii. LLM token maliyetlerini ayrı tutuyorum — onlar zaten tecrübeme göre toplam faturanın %80’ını oluşturuyor, asıl dikkat edilmesi gereken yer orası.

On-premise koşturabilir mıyım?

MAF’ın kendisi açık kaynak ve.NET runtime’ı olan her yerde çalışıyor. Durable backend için MSSQL kullanırsanız on-prem SQL Server ile gayet rahat koşar. LLM tarafında işe Azure OpenAI yerine mesela Ollama veya self-hosted bir endpoint’e bağlamanız gerekiyor — bu da destekleniyor aslında, ama biraz config istiyor, hazırlıklı olun.

Mevcut Logic Apps akışlarımı taşımalı mıyım?

Hayır, gerek yok. Logic Apps, low-code entegrasyon için hâlâ çok güçlü bir araç. MAF’ı onun alternatifi olarak değil, yanı kod tabanlı, AI-aware bir orchestration katmanı olarak düşünün. İkisi farklı problem domain’leri — bence ikisini birlikte kullanmaktan da çekinmeyin.

Kaynaklar ve İleri Okuma

.NET Blog: Durable Workflows in the Microsoft Agent Framework

Azure Durable Functions Resmî Dokümantasyonu (buna dikkat edin)

Bir şey dikkatimi çekti: Microsoft Agent Framework GitHub Repository

Aşkın KILIÇ

20+ yıl deneyimli Azure Solutions Architect. Microsoft sertifikalı bulut mimari ve DevOps danışmanı. Azure, yapay zekâ ve bulut teknolojileri üzerine Türkçe teknik içerikler üretiyor.

AZ-305AZ-104AZ-500AZ-400DP-203AI-102

Bu içerik işinize yaradı mı?

Benzer içerikleri kaçırmamak için beni sosyal medyada takip edin.

← Onceki Yazi
GitHub MCP Server'da Secret Scanning GA: Sahadan Notlar

Yorum Yaz

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

İçindekiler
← GitHub MCP Server’da Sec...