ASP.NET Core'da arka plan servisi mi, durable workflow mu?
Arka plan işleri için .NET'in hazır BackgroundService sınıfı çoğu zaman yeterli, ama iş birden fazla adıma, onaya ve restart sonrası devama dönüştüğünde tablo tersine dönüyor. C# Corner'daki makale iki yaklaşımı state, retry, recovery ve compensation açısından karşılaştırıp ne zaman workflow engine'e geçilmesi gerektiğini anlatıyor.
Kilit noktalar
- BackgroundService yalnızca ExecuteAsync döngüsü ve AddHostedService<T>() kaydı verir; persistence, retry ve recovery sizin kodunuzda kalır.
- Worker web host'un içinde çalıştığı için her instance kendi kopyasını başlatır; atomik claim veya kuyruk yoksa aynı job birden fazla kez işlenir.
- Durable workflow, adım bazında execution state sakladığı için restart'ı atlatır ve yalnızca başarısız adımı yeniden dener.
- Tüm sipariş akışını baştan tekrarlamak çift ödeme veya çift stok rezervasyonu doğurur; idempotency key'i ödeme sağlayıcısı gerçekten uygulamalı.
- Compensation orijinal işlemi geri almaz, kabul edilebilir duruma döndüren yeni bir iş adımıdır (örneğin rezervasyonu bırakmak).
- Job tablosunda status, RetryCount ve NextRetryAtUtc tutun; job tiplerini kayıtlı handler'lara eşleyin, çalıştırılabilir kod veya serbest tip adı saklamayın.
BackgroundService, ASP.NET Core host'unun yanında çalışan işler için hazır gelen temel sınıf: kuyruk yoklamak, geçici dosyaları temizlemek, veri senkronize etmek gibi. Size ExecuteAsync döngüsünü ve AddHostedService<T>() kaydını verir, o kadar; state, retry ve restart sonrası toparlanma size kalır. Üç instance'a ölçeklendiğinizde işi atomik olarak claim etmiyor veya dağıtık kuyruk kullanmıyorsanız her instance aynı bekleyen job'ı alabilir.
Durable workflow ise ilerlemeyi bellekte tutmak yerine her adımı kalıcı hale getirir; saatler ya da günler süren sipariş, kredi veya onay süreci kaldığı yerden devam eder, tek bir adım yeniden denenir ve ödeme kalıcı olarak başarısız olduğunda rezerve stoğu bırakan bir compensation çalıştırılabilir. Yazar iki yaklaşımı yan yana koyup önce veritabanı destekli bir job tablosuyla başlamayı, Temporal, Azure Durable Functions veya Dapr Workflow gibi bir engine'i ancak karmaşıklık gerçekten gerektiriyorsa devreye almayı öneriyor.
Gerçek dünyada kullanımı
- Saatte bir geçici dosyaları silen veya küçük bir cache'i tazeleyen API; bir turun kaçması iş açısından zararsız.
- Ödeme, fatura ve teslimat adımları olan ve manuel onay için günlerce bekleyebilen bir SaaS sipariş akışı.
- Kredi başvurusunda uzman onayı saatler sonra geldiğinde tam o noktadan devam etmesi gereken süreç.
- Birden fazla instance ile çalışan ve aynı job'ın iki kez işlenmemesi gereken ASP.NET Core dağıtımı.
Neden önemli
Yanlış tercih, basit bir iş için gereksiz altyapı ya da money-flow süreçlerinde restart sonrası yarım kalan işlemler demek. İşin uzunluğu, adım sayısı ve yarıda kalırsa ne olacağı kararı belirliyor.