Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
Background Job'larda Sürüm Geçişleri: .NET 6→10 BackgroundService Değişiklikleri, .NET 11 ve Quartz 3→4
.NET 6 BackgroundService hatasında host'u durdurmaya başladı, ShutdownTimeout .NET 7'de 5'ten 30 saniyeye çıktı, .NET 8 lifecycle hook'larını getirdi, .NET 10 ExecuteAsync'in tamamını arka plana aldı: ilk await'ten önce fırlayan hata .NET 8'de process'i 134 koduyla düşürürken .NET 10'da loglanıp 0 koduyla çıkıyor. Quartz 3→4'te basit bir job tek bir CS0535 hatası verdi; asıl iş paketler, şema migration'ı ve değişen varsayılanlar.
Quartz.NET 4 ile Scheduling: Job, Trigger, Persistent JobStore ve Clustering
Quartz.NET 4'te job ve trigger ayrı nesnelerdir, IJob ValueTask döner ve CancellationToken alır; DI ve hosting çekirdek Quartz paketinde. Aynı PostgreSQL veritabanını paylaşan iki node bir cluster olur: çalışan node kill -9 ile ölünce diğeri yaklaşık 15 saniye sonra durumu fark eder ve RequestRecovery işaretli job'u recovering=true ile yeniden çalıştırır. Açılışta kod tanımı veritabanındaki JobDataMap'in üzerine yazar; IgnoreDuplicates bunu önler.
Cron İfadeleri: Unix 5 Alan, Saniyeli 6 Alan, Quartz Formatı ve Time Zone/DST Tuzakları
Unix cron 5 alanlıdır, Quartz saniyeyle başlayan 6–7 alan ister ve haftanın günlerini 1=pazar diye sayar; Quartz 4 "0 0 * * *"i varsayılan parser'la reddeder, CronFormat.Unix ile kabul eder. DST geçişinde 02:30'a kurulu günlük iş ilkbaharda 03:00'te bir kez, sonbaharda yalnız bir kez çalışır; aralıklı işler tekrarlanan saatte iki kez çalışır. Kendi cron scheduler'ını TimeProvider ile yazıp FakeTimeProvider ile test edebilirsin.
Request Dışında İş Yapmak: Fire-and-Forget, BackgroundService, Hangfire ve Quartz.NET Arasında Seçim
Controller içinde Task.Run ile başlatılan iş, request scope'u kapanınca DbContext'i kaybeder, exception'ı sessizce yutar ve deploy'da yarıda kalır; işi host'un yönettiği bir yere devretmek gerekir. Seçimi beş soru belirler: iş restart'ta kaybolabilir mi, zamanlı mı, retry ve dashboard gerekir mi, kaç instance var; cevaplara göre BackgroundService, Hangfire, Quartz.NET ya da platform scheduler.