Arka Plan İşlemlerinin Sessiz Katili
B2B SaaS platformunu deploy ederken, Laravel kuyrukları en ağır yükü taşır—CSV içe aktarımları, PDF raporları oluşturma ve binlerce e-posta gönderme. Bunları etkili bir şekilde işlemek için php artisan queue:work komutunu kullanıyoruz. Bu, işçi sürecini bir daemon olarak çalıştırır; yani PHP scripti bir kez başlatılır ve bellek içinde kalır, işlerden işe geçiş yaparken framework’ü yeniden başlatma yükü olmadan çalışır.
Ancak bu hız, tehlikeli bir mimari değiş tokuş ile gelir: Hafıza Sızıntıları. PHP süreci asla ölmediği için, statik değişkenler, singleton örnekleri ve Eloquent model önbellekleri yavaş yavaş RAM’de birikir. Birkaç saat (ya da gün) içinde, işçi PHP bellek limitine (genellikle 128MB veya 256MB) ulaşır ve Allowed memory size exhausted fatal hatası ile şiddetle çöker.
Kurumsal Çözüm: Nazik Yeniden Başlatmalar
Kodunuzu profil çıkarmak, ciddi sızıntıları düzeltmek için kesinlikle önemlidir, ancak uzun süreli bir PHP daemon’daki küçük hafıza birikimi neredeyse kaçınılmazdır. Standart DevOps çözümü ise, sunucunuzun RAM’ini sonsuzca artırmak yerine Nazik Yeniden Başlatmalar mimarisi kurmaktır.
İşçinin patlamasına izin vermek yerine, Laravel’e güvenli bir şekilde bir eşiğe ulaştığında işçi sürecini otomatik olarak öldürmesini talep ediyoruz. Ubuntu VPS’mizde Supervisor gibi bir süreç izleyici kullanıyoruz; işçi öldüğü anda, Supervisor hemen yeni, temiz bir süreci başlatır ve bellek bloat’u olmadan çalışır.
Supervisor’ı Ölçeklenebilirlik İçin Yapılandırmak
Laravel’de, bu eşikleri iki güçlü bayrakla kontrol ediyoruz: --max-jobs ve --max-time.
# /etc/supervisor/conf.d/laravel-worker.conf
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
# 1.000 işten sonra veya 1 saat (3600 saniye) içinde işçinin ölmesini sağlıyoruz
command=php /var/www/smarttechdevs.com/artisan queue:work --max-jobs=1000 --max-time=3600 --tries=3 --timeout=90
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=forge
numprocs=8 # 8 paralel işçi çalıştır
redirect_stderr=true
stdout_logfile=/var/www/smarttechdevs.com/storage/logs/worker.log
stopwaitsecs=3600
Neden Bu Mimari Kazanıyor?
Bu belirli komutun (--max-jobs=1000 --max-time=3600) arka uç kararlılığı için altın standart olduğunu açıklayalım:
- Öngörülebilir Hafıza: PHP sürecini 1.000 işten sonra yeniden başlatmaya zorlayarak, çöp toplayıcının RAM’i tamamen temizlemesini sağlarsınız. İşçi, fatal bellek limitine ulaşacak kadar uzun süre yaşamaz.
- Güvenlik Öncelikli: Sert bir çöküşün aksine, Laravel mevcut işin başarılı bir şekilde tamamlanmasını bekler. Veri kaybı veya bozulması olmadan işlem sonlandırılır.
- Sıfır Kesinti: Supervisor çıkış kodunu tespit eder ve değiştirme işçisini milisaniyeler içinde yeniden başlatır. Kuyruk verimliliğiniz büyük kalır, ancak altyapınız tamamen sağlıklı kalır.
Sonuç
Güvenilir bir SaaS arka ucu, geliştiricilerin saat 3’te kalkıp başarısız kuyruk işçilerini yeniden başlatmalarını gerektirmemelidir. PHP hafıza yönetiminin gerçekliğini kabul ederek ve Supervisor aracılığıyla nazik yeniden başlatmalar mimarisi kurarak, milyonlarca arka plan işini zahmetsiz bir şekilde işleyebilen kendini iyileştiren bir altyapı inşa edersiniz.
Kaynak: Orijinal Makale


