Takılı Kalan İşçi Kâbusu
Büyüyen bir B2B SaaS arka plan mimarisi geliştirirken, arka plan kuyrukları web yanıt gecikmelerine karşı birincil savunmanızdır. Ancak, görevleri HTTP yaşam döngüsünün dışına taşımak onları tamamen savunmasız hale getirmez. Asenkron bir arka plan görevi yürütme sırasında takıldığında, sonsuz beklemelere neden olabilen tehlikeli bir operasyonel tuzak meydana gelir.
Bir görevin, dış bir sunucuya FTP veya cURL el sıkışması ile bağlanacak şekilde yapılandırıldığını hayal edin. Eğer hedef sunucu bağlantıyı kesmeden takılırsa ve kodunuzda açık bir bağlantı zaman aşımı tanımlanmamışsa, arka plan işlemi sonsuza dek duraklayacaktır. O kuyruk işçi ipliği artık kalıcı olarak donmuş durumdadır. Daha fazla aynı görev tetiklendiğinde, tüm işçi havuzunuz kilitlenir ve SaaS arka plan işleme hatlarınız felç olur. Sistemlerinizi güvence altına almak için kesinlikle Process Timeouts yapılandırmalısınız.
Çift Güvenlik Şeridi: Görev vs. İşçi Zaman Aşımı
Kesin bir arka plan altyapısı oluşturmak için Laravel, yerel PHP PCNTL uzantısını kullanarak takılı işçi döngülerini zorla sonlandıracak iki katmanlı bir zaman aşımı güvenlik sistemi sunar.
Adım 1: Bileşen Seviye Görev Zaman Aşımını Uygulama
İlk savunma hattı, belirli Görev sınıfı içerisinde sıkı bir zaman sınırı tanımlamaktır. Eğer görev belirlenen bu saniye sayısından daha uzun sürerse, Laravel’in işçi döngüsü bunu bir hata olarak işaretler ve işlem ipliğini güvenli bir şekilde sonlandırır.
namespace App\Jobs;use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels;
class ProcessVendorSync implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/ * 1. Görevin zaman aşımına uğramadan çalışabileceği saniye sayısı. * Bu yoğun entegrasyon işini kesinlikle 2 dakika (120 saniye) ile sınırlandırıyoruz. */ public int $timeout = 120; / * 2. Görevin hata vermeden önce kaç kez denenebileceği. */ public int $tries = 3; public function handle(): void { // ❌ TEHLİKELİ KOD: Eğer bu harici akış sonsuza kadar takılırsa, // Laravel'in iç $timeout parametresi 120 saniye sonra bunu zorla öldürecektir. $data = file_get_contents('https://brittle-vendor-api.com/stream/dump'); // Veriyi işleyin... }}
Adım 2: Global İşçi Ömürlerini Supervisor Üzerinden Zorlamak
Görev sınıflarınızda
$timeoutözelliğini atamak oldukça etkili olsa da, geliştiricilerin her seferinde bunu unutmadan yazması gerekir. Sunucunuzu global olarak korumak için, Supervisor yapılandırma dosyanızda zor bir işlem ömrü yapılandırmalısınız.# /etc/supervisor/conf.d/laravel-worker.conf[program:laravel-worker] command=php /var/www/smarttechdevs.com/artisan queue:work --timeout=150
KRİTİK KURAL: stopwaitsecs her zaman işçinin --timeout değerinden daha uzun olmalıdır!
Bu, Supervisor'ın takılı görevi güvenli bir şekilde öldürmesi için Laravel'e yeterli zaman tanır
ve hatalı günlüğü yazmadan önce Supervisor'ın tüm ipliği zorla yeniden başlatmasını sağlar.
stopwaitsecs=160 autostart=true autorestart=true
İnovasyon Getirisi
Açık model sınıf zaman aşımınızı kök sistem Supervisor yapılandırmalarınızla koordine ederek, kuyruk işleme ağınız kendini onarıcı bir hale gelir. Takılı bir üçüncü taraf entegrasyon döngüsü veya işlenmemiş sonsuz döngü artık arka plan kuyruklarınızı çökertemez. Takılı görevler sistematik bir şekilde kesilir, geliştirici incelemesi için hata günlüğü tablolarında izlenir ve yeni işçiler hemen devralır.
Kaynak: Orijinal Makale


