Örtüşen Cron Felaketi
B2B SaaS uygulamalarında arka plan görevleri sisteminizin kalbidir. Dış API’leri senkronize etmek, günlük fatura raporları oluşturmak ve eski veritabanı kayıtlarını temizlemek için cron job’lara güvenirsiniz. Başlangıçta, her 5 dakikada bir çalışması planlanan bir komut (everyFiveMinutes()) sorunsuz çalışır.
Ancak ölçeklenme, korkutucu bir değişkeni beraberinde getirir: yürütme süresi. “5 dakikalık API senkronizasyonu” o kadar fazla veriyi işlemeye başlarsa ki tamamlama süresi 7 dakikaya çıkarsa ne olur? Sunucunuz 5 dakikalık işareti geçtiğinde cron job’ı tekrar çalıştırır. Artık, aynı veritabanı satırlarını kilitleyen ve CPU kullanımını iki katına çıkaran iki benzer ağır işlem aynı anda çalışıyor. En sonunda üçüncü bir işlem tetiklenir. Bu “Cron Çarpışması”, iç içe bir başarısızlık yaratır ve sonuç olarak sunucunuzu çöküşe sürükler.
Defans: Mutex Kilitleri ve Sunucu Farkındalığı
Smart Tech Devs’te dayanıklı sistemler tasarlamak için umuda güvenmiyoruz. Redis destekli Mutex (Karşılıklı Dışlama) kilitlerine güveniyoruz. Laravel, bu işlemi withoutOverlapping() yöntemi ile son derece zarif hale getiriyor.
Ayrıca, SaaS’ınız büyüdükçe muhtemelen yatay ölçekleme yapacaksınız (yük dengeleyici arkasında daha fazla web sunucusu eklemek). Üç sunucunuz olduğunda, standart cron job’lar üç kez çalışır – müşterilerinizi üç kez faturalandırırsınız. Bunu onOneServer() yöntemi ile çözüyoruz.
Kesin Programların Mimarisi
Modern Laravel uygulamalarında (Laravel 11+) bu kesin programları routes/console.php dosyasında Schedule facade’ını kullanarak tanımlıyoruz.
use Illuminate\Support\Facades\Schedule;
// ❌ ANTI-PATTERN: Ölçek için tehlikeli
// Eğer bu işlem > 5 dakika alıyorsa veya 3 sunucuda çalışıyorsa, büyük bir sorununuz var demektir.
Schedule::command('tenant:sync-massive-api')->everyFiveMinutes();
// ✅ ENTERPRISE PATTERN: Kesin Programlama
Schedule::command('tenant:sync-massive-api')
->everyFiveMinutes()
// 1. Çarpışmaları önleyin: Önceki iş hâlâ çalışıyorsa, bu çalışmayı tamamen atlayın.
->withoutOverlapping()
// 2. Çoğalımı önleyin: Redis kullanarak yalnızca bir sunucunun bu komutu çalıştırmasını sağlayın.
->onOneServer()
// 3. Sessiz başarısızlıkları önleyin: Tamamlandığında bir sağlık kontrolü URL'sini (Sentry veya Flare gibi) kontrol edin.
->thenPing('https://run.envoyer.io/your-health-check-uuid');
Mühendislik ROI
Bu iki basit yöntemi uygulamak, arka uç mimarinizi narin olmaktan dayanıklı hale getirmek için temel bir değişim sağlar. withoutOverlapping() CPU zirvelerinin kontrol altına alınmasını ve veritabanı kilitlerinin saygı görmesini garanti eder. onOneServer() bir trafik artışı sırasında 50 yeni web sunucusu açmanızı sağlar. Bu, ölçeklenme amacıyla inşa etmenin tanımıdır.
Sonuç
Bir arka plan işinin belirlenen zaman diliminde tamamlanacağına asla güvenmeyin. Laravel görev zamanlayıcınıza sıkı Redis kilitleri uygulayarak, iç içe geçen cron çarpışmaları tehditini ortadan kaldırır ve büyük veri yükleri altında rahat bir altyapı oluşturursunuz.
Kaynak: Orijinal Makale


