Teknoloji

VPS Üzerinde Arka Plan İşleri ve Kuyruk Yönetimi: Laravel Queue, Supervisor, systemd ve PM2

Laravel ile çalışan bir projede, arka planda yürüyen işler doğru yönetilmediğinde ilk darbe genellikle kullanıcı deneyimine vurur: sipariş sonrası e-posta geç gider, raporlar saatlerce sürer, yoğun trafikte sayfalar beklenenden daha yavaş yanıt verir. Tüm bu problemler çoğu zaman veritabanından ya da PHP kodundan değil, arka plan işlerinin ve kuyruk tüketicilerinin yanlış yönetilmesinden kaynaklanır. Özellikle VPS üzerinde kendi altyapınızı yönettiğinizde, Laravel queue, Supervisor, systemd ve PM2 gibi araçların nasıl konumlanacağını bilmek kritik hale gelir.

Bu yazıda, DCHost altyapısında sıkça karşılaştığımız gerçek senaryolardan yola çıkarak, VPS üzerinde arka plan işleri ve kuyruk yönetimini uçtan uca ele alacağız. Laravel Queue mimarisini sade bir dille özetleyecek, Supervisor ve systemd ile PHP queue worker süreçlerini nasıl yönetebileceğinizi gösterecek, Node.js tarafında PM2 ile çalışan tüketici süreçlerini bu mimariye nasıl entegre edeceğinizi konuşacağız. Ayrıca loglama, izleme, yeniden başlatma stratejileri ve ölçeklendirme gibi operasyonel detaylara da gireceğiz. Okuduğunuzda, Laravel tabanlı bir uygulamayı DCHost VPS üzerinde üretim ortamına taşırken arka plan işleri konusunda net bir yol haritanız olacak.

Arka Plan İşleri ve Kuyruklar Neden Bu Kadar Önemli?

Modern web uygulamalarında kullanıcı isteğine anında cevap vermek ile ağır işleri arka plana atmak arasındaki denge, performansın kalbinde yer alır. Özellikle PHP-FPM veya klasik PHP çalıştırma modellerinde, her HTTP isteği belirli bir maksimum süre içinde tamamlanmak zorundadır. Ağır işleri senkron çalıştırırsanız sadece kullanıcıyı bekletmekle kalmaz, aynı zamanda sunucu kaynaklarını da gereksiz yere tüketirsiniz.

Tipik olarak arka planda çalışması gereken işler şunlardır:

  • E-posta, SMS, push bildirim gönderimi
  • Fatura PDF üretimi, rapor oluşturma, Excel dışa aktarma
  • Görsel işlemeleri, thumbnail üretimi, video transkodlama
  • Dış API’lere (ödeme, kargo, entegrasyonlar) toplu istekler
  • Önbellek ısıtma, arama indekslerini güncelleme, veri migrasyonları

Bu tür işler için düzgün bir kuyruk ve worker mimarisi kurmazsanız, uygulamanızın ön yüzü ile arka plandaki ağır işler birbirine karışır; hem tepki süreleri artar hem de hata yönetimi zorlaşır. DCHost olarak yüksek trafikli WooCommerce, Laravel ve SaaS projelerinde gördüğümüz en yaygın performans sorunlarından bazıları, aslında yanlış konumlandırılmış cron job’lar ve dağınık queue worker süreçlerinden kaynaklanıyor. Bu yüzden önce mimariyi netleştirmek gerekiyor.

VPS Üzerinde Kuyruk Mimarisi: Temel Bileşenler

VPS üzerinde kendi Laravel altyapınızı yönettiğinizde, kuyruk mimariniz genellikle şu bileşenlerden oluşur:

  • Uygulama (Laravel): Job sınıfları, dispatch edilen işler, queue sürücüleri.
  • Kuyruk Arka Ucu: Veritabanı, Redis veya başka bir mesaj kuyruğu sistemi.
  • Worker Süreçleri: Kuyruktan işi çekip çalıştıran PHP (veya Node.js) süreçleri.
  • Süreç Yöneticisi: Supervisor, systemd veya PM2 gibi worker’ları ayakta tutan araçlar.
  • İzleme ve Loglama: Log dosyaları, metrikler, alarmlar.

Bu bileşenlerin hepsini doğru konumlandırmadan performans optimizasyonu yapmak çoğu zaman boşa efor oluyor. Örneğin sadece PHP-FPM ayarları ile oynamak genellikle yeterli olmaz; Laravel prod ortamındaki bütün bileşenleri birlikte ele almak gerekir. Bu konuda daha geniş bir resim görmek isterseniz, Laravel prod ortam optimizasyonu rehberimizde PHP-FPM, OPcache, Octane ve queue yapılarını birlikte ele aldığımız yazıya göz atabilirsiniz.

Laravel Queue Temelleri: Job Tasarımı ve Sürücüler

Laravel Queue, senkron iş yükünü arka plana taşımanızı sağlar. Basitçe:

  • Yapılacak işi bir Job sınıfında tanımlarsınız.
  • Bu job’ı dispatch() ile kuyruğa atarsınız.
  • Arka planda çalışan worker süreçleri bu job’ı kuyruqdan çekip çalıştırır.

Job Sınıflarını Doğru Tasarlamak

Job sınıfları, kuyruk mimarisinin çekirdeğidir. Temel pratikler:

  • Job içine fazla mantık koymayın; asıl işi servis katmanına devredin.
  • Job içinde sadece taşınabilir veri tutun (ID, küçük array’ler). Büyük model nesnelerini serileştirmekten kaçının.
  • Idempotent (tekrar çalıştırılınca zarar vermeyen) olacak şekilde tasarlamaya çalışın. Çünkü başarısız olan job’lar yeniden denenebilir.

Basit bir örnek job sınıfı:

php artisan make:job SendOrderEmail
class SendOrderEmail implements ShouldQueue {<br>    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;<br><br>    public function __construct(public int $orderId) {}<br><br>    public function handle(): void {<br>        $order = Order::find($this->orderId);<br>        if (! $order) {<br>            return;<br>        }<br>        Mail::to($order->customer_email)->send(new OrderCreatedMail($order));<br>    }<br>}

Sürücü Seçimi: Database mi, Redis mi?

Laravel Queue için birkaç sürücü seçeneği var. VPS ortamında en sık gördüklerimiz:

  • sync: Geliştirme ortamı için, işi anında çalıştırır (kuyruk yokmuş gibi). Üretim için uygun değildir.
  • database: Job’ları veritabanındaki bir tabloda saklar. Kurulumu basit ama yoğun trafikte veritabanını yorar.
  • redis: Yüksek performanslı, bellek tabanlı kuyruk. Gerçek zamanlı işler ve yüksek trafik için ideal.

Küçük ölçekli bir SaaS veya kurumsal panel için database sürücüsü başlangıçta gayet yeterli olabilir. Ancak arka plan işlerinin hacmi arttıkça, veritabanını iş kuyruğu ile doldurmak, hem sorgu performansını hem de yedekleme/restore operasyonlarını zorlaştırır. Bu noktada Redis’e geçmek genellikle mantıklı olur.

Queue sürücü seçimi yaparken, veritabanı tarafındaki yükün sitenizi ne kadar etkileyebileceğini anlamak için veritabanı indeksleme ve sorgu optimizasyonu rehberimizde anlattığımız sorgu yükü analiz yöntemlerini kuyruk tablolarınız için de uygulayabilirsiniz.

Retry, Timeout ve Failed Jobs

Üretim ortamında en çok ihmal edilen konulardan biri de job hata yönetimidir. Laravel tarafında şu ayarları mutlaka düşünmelisiniz:

  • timeout: Bir job’ın en fazla kaç saniye çalışabileceği.
  • tries veya maxAttempts: Job’ın başarısız olduğunda kaç kez yeniden deneneceği.
  • failed_jobs tablosu: Kalıcı olarak başarısız olan işlerin kayıtları.

Örneğin çalışan bir entegrasyon API’si zaman zaman geç cevap veriyorsa, timeout’u biraz yüksek tutabilir; ancak idempotent olmayan işlerde tries değerini sınırlı tutup, başarısız job’ları manuel incelemeye alabilirsiniz.

VPS Üzerinde Queue Worker Çalıştırma Stratejisi

Artık kod tarafı hazır; sıra VPS üzerinde worker süreçlerini nasıl yöneteceğinize geliyor. Bir DCHost VPS üzerinde Laravel uygulaması çalıştırdığınızda, genellikle şu yapı ile karşılaşıyoruz:

  • Nginx veya Apache + PHP-FPM ile HTTP trafiğini karşılayan web katmanı
  • Laravel artisan komutları ile çalışan queue worker süreçleri
  • Bu süreçleri yöneten Supervisor veya systemd unit dosyaları

En temel komut şu:

php artisan queue:work --queue=default --sleep=1 --max-time=3600 --tries=3

Bunu doğrudan SSH oturumundan çalıştırmak yerine, arka planda, çökünce yeniden başlayacak, log’ları merkezi bir yerde toplanacak şekilde yönetmek için bir süreç yöneticisine ihtiyaç var. Burada iki klasik oyuncu devreye giriyor: Supervisor ve systemd. Node.js tabanlı worker’larınız varsa, üçüncü oyuncu olarak PM2 de sahneye çıkıyor.

Supervisor ile Laravel Queue Worker Yönetimi

Supervisor, özellikle Laravel topluluğunda yıllardır kullanılan, basit ini tarzı yapılandırma dosyalarıyla çalışan bir süreç yöneticisidir. Debian/Ubuntu tabanlı bir DCHost VPS üzerinde kurulumu oldukça kolaydır.

Supervisor Kurulumu

sudo apt update<br>sudo apt install supervisor -y

Supervisor genellikle /etc/supervisor/conf.d/ altında konfigürasyon dosyaları bekler. Her uygulama için ayrı bir dosya oluşturabilirsiniz.

Laravel Queue İçin Örnek Supervisor Konfigürasyonu

[program:myapp-queue-default]<br>command=/usr/bin/php /var/www/myapp/artisan queue:work redis --queue=default --sleep=1 --max-time=3600 --tries=3<br>directory=/var/www/myapp<br>user=www-data<br>autostart=true<br>autorestart=true<br>numprocs=3<br>redirect_stderr=true<br>stdout_logfile=/var/log/supervisor/myapp-queue-default.log<br>stopwaitsecs=600

Burada kritik birkaç nokta var:

  • command: Mutlaka tam yolları kullanmaya çalışın. PHP’nin ve projenizin yolu net olsun.
  • user: Web sunucusunun çalıştığı kullanıcı ile uyumlu olmasına dikkat edin (genelde www-data veya nginx).
  • numprocs: Aynı konfigürasyondan kaç worker süreci açılacağını belirler. CPU çekirdek sayısına ve iş yüküne göre ayarlayın.
  • stopwaitsecs: Graceful shutdown için önemli. Uzun süren job’larınız varsa yüksek tutun ki ani kesilmelerde veri tutarsızlığı olmasın.

Konfigürasyonu kaydettikten sonra Supervisor’a tanıtalım:

sudo supervisorctl reread<br>sudo supervisorctl update<br>sudo supervisorctl status

status çıktısında worker’larınızı RUNNING olarak görüyorsanız, temel yapı hazır demektir.

Supervisor’ın Artıları ve Eksileri

Artıları:

  • Laravel dokümantasyonu ve ekosistemi ile çok uyumlu.
  • İni formatı sayesinde yapılandırması basit ve okunaklı.
  • Aynı dosya içinde birden çok kuyruk ve worker tanımlayabilirsiniz.

Eksi Yanları:

  • systemd kadar derin servis entegrasyonu yok (örneğin cgroups, resource limitler vb.).
  • Log yönetimi için ek ayarlara ve zaman zaman logrotate entegrasyonuna ihtiyaç duyar.
  • İşletim sisteminin varsayılan init sistemi olmadığı için ek bir katman olarak düşünülmeli.

Yine de pek çok proje için Supervisor hâlâ son derece pratik ve güvenilir bir çözüm. Özellikle tek bir VPS üzerinde birkaç Laravel uygulaması koşturduğunuz senaryolarda, her proje için ayrı Supervisor programları tanımlamak temizlik ve yönetilebilirlik getirir.

systemd ile Laravel Queue Worker Çalıştırmak

Modern Linux dağıtımlarında systemd zaten varsayılan init sistemi olarak çalışıyor. Yani makineniz açıldığında hangi servislerin ayağa kalkacağı, nasıl izleneceği, log’ların nereye akacağı gibi konuların çoğu systemd üzerinden yönetiliyor. Bu yüzden pek çok ekip ek bir katmana ihtiyaç duymadan, doğrudan systemd unit dosyaları ile queue worker süreçlerini yönetmeyi tercih ediyor.

Basit Bir systemd Service Tanımı

Örnek bir Laravel queue worker service dosyasına bakalım. /etc/systemd/system/laravel-queue-default.service dosyasını oluşturalım:

[Unit]<br>Description=Laravel Queue Worker (default queue)<br>After=network.target<br><br>[Service]<br>Type=simple<br>User=www-data<br>WorkingDirectory=/var/www/myapp<br>ExecStart=/usr/bin/php artisan queue:work redis --queue=default --sleep=1 --max-time=3600 --tries=3<br>Restart=always<br>RestartSec=5<br>StandardOutput=append:/var/log/laravel-queue-default.log<br>StandardError=append:/var/log/laravel-queue-default-error.log<br><br>[Install]<br>WantedBy=multi-user.target

Servisi etkinleştirelim:

sudo systemctl daemon-reload<br>sudo systemctl enable laravel-queue-default<br>sudo systemctl start laravel-queue-default<br>sudo systemctl status laravel-queue-default

Bu yapı ile makine her açıldığında queue worker otomatik devreye girer, çöktüğünde yeniden başlar ve log’lar systemd tarafından yönetilir.

systemd Kullanırken Dikkat Edilecek Noktalar

  • PHP sürümü ve yol: Birden fazla PHP sürümü yüklü ise, doğru binary yolunu kullanmayı unutmayın.
  • Environment değişkenleri: .env içeriği genelde yeterlidir ama özel ortam değişkenlerine ihtiyaç varsa, Environment=KEY=value satırları ekleyebilir veya ayrı bir environment dosyası kullanabilirsiniz.
  • Kaynak limitleri: systemd ile MemoryMax, CPUQuota gibi ayarlarla queue worker süreçlerinin kaynak kullanımını sınırlandırabilirsiniz.

Cron işlerini de systemd timer ile yönetmek isterseniz, cron mu systemd timer mı rehberimizde detaylı anlattığımız gibi, schedule edilmiş görevleri de tek çatı altında toplamanız mümkün.

Supervisor mı systemd mi?

İki yaklaşımın da güçlü tarafları var. Özet bir karşılaştırma yapalım:

  • Supervisor daha uygun olabilir:
    • Birden çok proje için hızlıca worker tanımlamak istiyorsanız.
    • Laravel dökümantasyonundaki örneklerle birebir ilerlemek istiyorsanız.
    • Sunucu yönetimi ekibiniz Supervisor’a alışkınsa.
  • systemd daha uygun olabilir:
    • Ekstra bağımlılık istemiyor ve sadece Linux’un sunduklarıyla yetinmek istiyorsanız.
    • Kaynak limitlerini, restart politikalarını, log’ları tek merkezden yönetmek istiyorsanız.
    • DevOps tarafında zaten systemd ile standardize bir pratik benimsediyseniz.

DCHost tarafında yönetilen VPS ve dedicated sunucularda, müşterinin operasyon kültürüne göre iki yaklaşımı da görüyoruz. Küçük/orta Laravel projelerinde Supervisor, daha büyük ve karmaşık yapılarda ise systemd ağırlığını hissettiriyor.

Node.js Tüketiciler İçin PM2: Laravel ile Yan Yana

Pek çok ekip Laravel’i ana API ve panel katmanı olarak kullanırken, arka plandaki bazı işlerde Node.js tabanlı tüketicilere de yer veriyor. Örneğin Redis tabanlı bir kuyruğu hem Laravel hem de Node.js worker’ların tükettiği hibrit bir mimari düşünebilirsiniz. Bu noktada Node.js süreçlerini yönetmek için PM2 devreye giriyor.

PM2 ile Basit Worker Süreci

Örneğin Redis tabanlı bir kuyruğu dinleyen Node.js script’iniz olsun: worker.js.

npm install -g pm2<br>pm2 start worker.js --name myapp-node-worker<br>pm2 save<br>pm2 startup

Bu komutlar ile:

  • worker.js arka planda bir servis gibi çalışır,
  • PM2 çökünce yeniden başlatır,
  • Sunucu yeniden açıldığında process otomatik ayağa kalkar.

Node.js uygulamalarını üretim ortamına taşırken PM2 ve systemd entegrasyonunu adım adım görmek isterseniz, Node.js’i canlıya alırken PM2 ve systemd kullanımı rehberimiz iyi bir referans olacaktır.

Laravel ve PM2’yi Aynı Kuyruğa Bağlamak

Redis tabanlı bir kuyruk kullanıyorsanız, Laravel tarafında Redis queue sürücüsünü, Node.js tarafında ise örneğin Bull, BullMQ gibi kütüphaneleri aynı Redis instance’ına bağlayarak hibrit tüketiciler oluşturabilirsiniz. Burada önemli olan:

  • Her iş tipine ayrı queue (örneğin mail, sms, report) tahsis etmek,
  • İşlerin hangi dilde (PHP/Node) çalışacağını net belirlemek,
  • Retry politikasını ve idempotent davranışı her iki tarafta da tutarlı kılmak.

Bu sayede CPU ve IO yoğunluğu yüksek işleri Node.js tabanlı süreçlere kaydırırken, Laravel’in güçlü olduğu alanlarda PHP worker’ları kullanmaya devam edebilirsiniz.

Hangi Aracı Ne Zaman Seçmeli? Supervisor, systemd ve PM2 Karşılaştırması

Kısa bir karar matrisi üzerinden gidelim:

  • Sadece Laravel, sadece PHP worker’lar:
    • Küçük/orta ölçek: Supervisor çok pratik.
    • Orta/büyük ölçek, kurumsal operasyon: systemd daha bütüncül.
  • Laravel + Node.js karışık mimari:
    • PHP worker’lar için Supervisor veya systemd,
    • Node.js worker’lar için PM2,
    • Hepsinin üzerinde iyi kurgulanmış log ve izleme katmanı.
  • CI/CD ile entegre gelişmiş dağıtımlar:
    • systemd servisleriyle ExecReload, Deploy script’leri tanımlamak,
    • PM2 ile zero-downtime deploy senaryoları.

VPS tarafında sıfır kesinti dağıtım, rollback ve benzeri konulara girmek istiyorsanız, VPS’e sıfır kesinti CI/CD nasıl kurulur rehberimizde anlattığımız systemd tabanlı dağıtım teknikleri bu mimariyle çok iyi örtüşüyor.

Loglama, İzleme ve Alarm: Kuyrukların Sağlığını Ölçmek

Arka plan işleri ile ilgili en büyük tehlike, sessizce bozulmalarıdır. HTTP istekleri genelde log’lara ve error monitoring araçlarına daha hızlı yansır; ancak queue worker’lar arka planda sessizce durabilir, takılabilir ya da hata verip kapatılabilir. DCHost tarafında sık gördüğümüz sorunlardan biri, kimsenin fark etmediği bir worker çökmesi sonrası biriken on binlerce job ve ani gecikmelerdir.

Log Yönetimi

Supervisor veya systemd kullanıyor olsanız da, şu prensiplere dikkat edin:

  • Her queue grubuna ayrı log dosyası verin (örneğin queue-mail.log, queue-report.log).
  • Log’ları logrotate ile düzenli döndürün; disk dolma problemlerini önlemek için VPS disk kullanımı ve logrotate rehberimizde anlattığımız pratikleri uygulayın.
  • Laravel iç logları ile sistem loglarını korele edebilmek için zaman damgalarını ve korelasyon ID’lerini tutarlı kullanın.

Metrik ve Alarm

Kuyruk sağlığını izlemek için şunlara bakmak iyi bir başlangıçtır:

  • Her queue için bekleyen job sayısı
  • Job’ların ortalama ve maksimum bekleme süresi
  • Failed jobs metrikleri (saatlik/günlük artış)
  • Worker sayısı ve CPU/RAM kullanımı

Basitten başlayıp zaman içinde olgunlaştırmak için, önce Prometheus ve Grafana ile VPS izleme rehberimizde anlattığımız temel node exporter metriklerini kurabilir; ardından Laravel tarafında job metriklerini Prometheus’a işleyerek daha ayrıntılı grafikler elde edebilirsiniz.

Güvenlik ve Kaynak Yönetimi Perspektifinden Kuyruklar

Arka plan işleriniz de sonuçta sunucuda çalışan süreçlerdir; dolayısıyla güvenlik ve kaynak yönetimi açısından web katmanı kadar önemlidir.

Kullanıcı, İzinler ve İzolasyon

  • Queue worker süreçlerini root kullanıcı ile kesinlikle çalıştırmayın.
  • Web sunucusunun kullandığı kullanıcı (www-data, nginx vs.) veya projeye özel açtığınız kısıtlı bir kullanıcı ile çalıştırın.
  • Dosya izinlerini ve sahiplikleri doğru kurgulamak için Linux dosya izinleri rehberimizde anlattığımız prensipleri uygulayın.

CPU, RAM ve IO Kullanımı

Özellikle görsel işleme, PDF üretimi, rapor oluşturma gibi CPU ve disk ağırlıklı işler, yanlış yapılandırılmış worker sayılarıyla birleştiğinde tüm VPS’inizi kilitleyebilir. Şu pratikleri öneriyoruz:

  • CPU çekirdek sayınız kadar veya biraz altında worker sayısı belirleyin.
  • Ağır işler için ayrı kuyruk tanımlayın (örneğin heavy) ve bu kuyruğu sınırlı sayıda worker ile tüketin.
  • systemd kullanıyorsanız, CPUQuota ile worker servisinin maksimum CPU yüzdesini sınırlamayı düşünün.
  • Disk IO kullanımını izlemek için VPS kaynak kullanımı izleme rehberimizde anlattığımız iotop ve benzeri araçlarla periyodik kontroller yapın.

DCHost VPS Üzerinde Örnek Bir Kuyruk Mimarisi

Tüm bu anlattıklarımızı, orta ölçekli bir Laravel e-ticaret projesi için örnek bir DCHost VPS mimarisi üzerinden toparlayalım:

  • Sunucu: 4 vCPU, 8 GB RAM, NVMe diskli bir DCHost VPS
  • Uygulama: Laravel 10, Nginx + PHP-FPM
  • Kuyruk Arka Ucu: Redis
  • Worker Yönetimi: systemd (PHP) + PM2 (Node.js varsa)

Önerilen Queue Yapıları

  • queue=mail: Sipariş e-postaları, bildirimler. 2 worker.
  • queue=report: Raporlama ve PDF işleri. 1 ağır worker.
  • queue=realtime: Anlık stok güncelleme, entegrasyon callback’leri. 2 hızlı worker.

Her biri için ayrı systemd service dosyası oluşturup, her servise özel log dosyası, restart politikası ve gerekiyorsa CPU/RAM limitleri tanımlanabilir. Böylece mail kuyruğunda sorun yaşansa bile realtime işleri etkileyen worker’lar ayrı kalır.

Laravel uygulamanızı bu yapıyla birlikte DCHost VPS üzerinde ayağa kaldırma sürecinde, Laravel uygulamalarını VPS’te yayınlama rehberimizde anlattığımız Nginx, PHP-FPM ve dağıtım adımlarını takip edebilir, oradaki Horizon ve queue yapılarını bu yazıdaki süreç yönetimi pratikleri ile birleştirebilirsiniz.

Özet ve Yol Haritası: Arka Plan İşlerini Rayına Oturtmak

VPS üzerinde çalışan bir Laravel uygulamasında, arka plan işleri ve kuyruk yönetimi çoğu zaman ertelenen, ama sorun çıktığında en çok can yakan başlıklardan biri oluyor. Job’ları doğru tasarlamak, uygun kuyruk sürücüsünü seçmek, Supervisor veya systemd ile worker süreçlerini sağlam şekilde koşturmak, Node.js tarafında PM2 ile hibrit bir yapı kurmak ve tüm bunları loglama ile izleme katmanına bağlamak; projenizin olgunluk seviyesini doğrudan etkiliyor.

Pratik bir yol haritası çizelim:

  1. Önce uygulamanızdaki ağır işleri tespit edin, hepsini Laravel Queue job’larına taşıyın.
  2. Küçük ölçekli projelerde database, büyüyen projelerde Redis tabanlı queue yapısına geçmeyi planlayın.
  3. VPS üzerinde Supervisor veya systemd tercihine karar verin; tek bir yaklaşımda standardize olun.
  4. Her queue türü için ayrı worker grupları ve log dosyaları tanımlayın, logrotate ile disk kullanımını kontrol altına alın.
  5. Prometheus/Grafana veya benzeri bir sistemle kuyruk metriklerini izlemeye başlayın; basit ama anlamlı alarmlar kurun.

DCHost olarak sağladığımız VPS, dedicated ve colocation altyapılarında, benzer kuyruk mimarilerini her ölçekte projede uyguluyoruz. Uygulamanız Laravel veya Node.js tabanlı olsun, arka plan işlerini güvenilir ve ölçeklenebilir şekilde yönetmek için bu yazıdaki adımları temel çerçeve olarak alabilirsiniz. İhtiyacınız olduğunda, doğru kaynak planlaması (CPU, RAM, NVMe disk ve ağ) için VPS kaynak planlama rehberimizde paylaştığımız hesaplama yöntemlerini de bu kuyruk mimarisiyle birlikte düşünmenizi öneririz. Böylece hem ön yüz, hem arka plan işler, hem de altyapı tarafı aynı anda dengede kalır.

Sıkça Sorulan Sorular

Supervisor ve systemd arasında seçim yaparken önce operasyon kültürünüze ve projenizin ölçeğine bakmalısınız. Küçük ve orta ölçekli Laravel projelerinde, özellikle birden çok uygulamayı tek VPS üzerinde çalıştırıyorsanız Supervisor genellikle daha hızlı ve pratik bir çözümdür; ini tarzı dosyalarla her proje için ayrı program tanımlayabilir, basit komutlarla yönetebilirsiniz. Daha kurumsal yapıda, CI/CD entegrasyonu, kaynak limitleri, tek merkezden log ve restart politikası gibi ihtiyaçlar ön plandaysa systemd daha doğru tercih olur. systemd ile her queue için ayrı service tanımlayıp CPU ve bellek sınırları, restart davranışı ve log hedeflerini çok daha ince ayarlı yönetebilirsiniz. Her iki yaklaşım da üretim için uygundur; önemli olan ekibinizin birini standart hale getirip tüm sunucularda aynı şekilde kullanmasıdır.

Başlangıç aşamasındaki projelerde, özellikle düşük hacimli iş yüklerinde database sürücüsü gayet yeterli ve kurulumu kolaydır. Ancak kuyrukta bekleyen job sayıları binleri bulmaya, job üretim ve tüketim hızları artmaya başladığında veritabanı sürücüsü ciddi dezavantaj oluşturmaya başlar. İşlem yoğun kuyruk tabloları hem indeksleri şişirir hem de diğer sorgularınızla aynı veritabanı kaynaklarını tüketerek genel performansı düşürür. Job’larınız gecikiyor, veritabanı CPU ve IO kullanımı yükseliyorsa, Redis’e geçiş zamanı gelmiş demektir. Redis, bellek tabanlı ve çok daha hızlı olduğu için yüksek hacimli mail, bildirim, rapor ve entegrasyon işlerinde belirgin fark yaratır. Geçiş yaparken önce yeni job türlerini Redis’te çalıştırıp, zamanla eski job’ları da Redis’e taşıyarak kademeli bir strateji izleyebilirsiniz.

Bu durum arka plan işlerinde en sık gördüğümüz problemlerden biri. Öncelikle worker süreçlerinizi mutlaka Supervisor, systemd veya PM2 gibi bir süreç yöneticisiyle koşturmalı, Restart=always gibi politikalarla süreç çökünce otomatik ayağa kalkmasını sağlamalısınız. İkinci adımda, kuyruk metriklerini izlemeniz gerekiyor: her kuyruğun bekleyen job sayısı, ortalama bekleme süresi ve failed job sayısı düzenli olarak takip edilmeli. Prometheus + Grafana gibi araçlarla bu metrikleri grafikleştirebilir ve eşik değer aşıldığında uyarı ürettirebilirsiniz. Ayrıca log yönetimini ciddiye almak önemli; her worker grubuna ayrı log dosyası verip logrotate ile döndürmeli, hatalı job’ları failed_jobs tablosundan periyodik olarak raporlamalısınız. Böylece bir worker sessizce ölse bile, hem süreç yöneticisi hem de izleme sistemi sizi hızla haberdar eder.

Worker sayısını belirlerken VPS’inizdeki CPU çekirdek sayısı, RAM miktarı ve job’ların türü (CPU yoğun, IO yoğun, dış API beklemeli vb.) birlikte değerlendirilmeli. Genel olarak, CPU yoğun işlerde toplam worker sayısını çekirdek sayınızla aynı veya biraz altında tutmak mantıklıdır; aksi halde context switching ve kuyrukta birbirini bekleyen süreçler yüzünden toplam throughput düşebilir. IO veya dış API beklemeli işlerde ise, CPU’yu tam doldurmayacak şekilde biraz daha fazla worker açabilirsiniz. Ayrıca farklı kuyruklara farklı worker sayıları vermek çok önemli: mail gibi hafif işler için daha çok worker, rapor gibi ağır işler için daha az ama güçlü worker’lar kullanmak gerekir. Geliştirme ortamında küçük sayılarla başlayıp, üretim ortamında Prometheus ve benzeri izleme araçlarıyla CPU, RAM ve job bekleme sürelerini izleyerek kademeli ayar yapmak en sağlıklı yaklaşımdır.

Evet, doğru kurgulandığında oldukça mantıklı ve esnek bir mimari ortaya çıkar. Laravel’i API, panel ve klasik web işlerinde kullanırken, CPU veya IO açısından Node.js’in güçlü olduğu bazı arka plan işleri (örneğin gerçek zamanlı bildirimler, WebSocket bağlantıları, akış bazlı veri işleme) için PM2 ile çalışan Node.js worker’lar ekleyebilirsiniz. Burada kritik olan, iş türlerine göre net sınırlar çizmek ve her işin hangi dilde koşturulacağını önceden belirlemek. Redis gibi ortak bir kuyruğu Laravel ve Node.js arasında paylaştırabilirsiniz; ancak her iş tipi için ayrı queue anahtarları kullanmanız, retry politikalarını diller arasında uyumlu tutmanız ve log/izleme tarafında her iki dünyadan gelen sinyalleri aynı panelde görebilmeniz önemli. Böylece tek bir DCHost VPS veya çoklu VPS mimarisinde, hem PHP hem Node.js ekibinin güçlü yönlerinden faydalanan hibrit bir arka plan iş altyapısı kurabilirsiniz.