
Laravel Horizon ile Job Queue İzleme ve Redis Entegrasyonu
Laravel uygulamalarında e-posta gönderimi, resim işleme, API çağrıları ve rapor oluşturma gibi zaman alan işlemler queue (kuyruk) sistemine aktarılır. Laravel Horizon, Redis tabanlı queue'ları gerçek zamanlı izlemenizi, worker sayısını otomatik ölçeklemenizi ve başarısız job'ları yönetmenizi sağlaya
Ahmet Yılmaz
Kıdemli Altyapı Mühendisi
Laravel uygulamalarında e-posta gönderimi, resim işleme, API çağrıları ve rapor oluşturma gibi zaman alan işlemler queue (kuyruk) sistemine aktarılır. Laravel Horizon, Redis tabanlı queue'ları gerçek zamanlı izlemenizi, worker sayısını otomatik ölçeklemenizi ve başarısız job'ları yönetmenizi sağlayan bir dashboard ve yapılandırma aracıdır. Bu rehberde Horizon kurulumundan production deployment'a kadar tüm adımları ele alıyoruz.
Laravel Horizon Nedir?
Horizon, Laravel'in resmi queue yönetim paketidir. php artisan queue:work komutunun üzerine gerçek zamanlı dashboard, otomatik worker dengeleme (auto-balancing), metrikler ve bildirim sistemi ekler. Horizon yalnızca Redis queue driver'ı ile çalışır - database veya SQS driver'ları desteklenmez.
| Özellik | queue:work | Horizon |
|---|---|---|
| Dashboard | Yok | Gerçek zamanlı web UI |
| Worker Yönetimi | Manuel (Supervisor) | Otomatik dengeleme |
| Metrikler | Yok | Throughput, bekleme süresi, başarı oranı |
| Başarısız Job | failed_jobs tablosu | Dashboard'dan retry + bildirim |
Kurulum ve Redis Yapılandırması
Horizon kurulumu için önce Redis'in sunucunuzda çalışıyor olması gerekir. Laravel'in .env dosyasında queue driver'ını Redis olarak ayarlayın, ardından Horizon'u kurun:
# Redis kurulumu (Ubuntu/Debian)
sudo apt install redis-server
sudo systemctl enable redis-server
# Horizon kurulumu
composer require laravel/horizon
php artisan horizon:install
# .env ayarlari
QUEUE_CONNECTION=redis
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
horizon:install komutu config/horizon.php yapılandırma dosyasını ve Horizon dashboard asset'lerini oluşturur. Dashboard'a /horizon URL'inden erişebilirsiniz.
Queue ve Worker Yapılandırması
Horizon'un gücü, farklı queue'lar için farklı worker sayıları tanımlayabilmenizdir. Örneğin e-posta gönderimi yüksek öncelikli, rapor oluşturma düşük öncelikli olabilir:
'environments' => [
'production' => [
'supervisor-1' => [
'maxProcesses' => 10,
'balanceMaxShift' => 1,
'balanceCooldown' => 3,
'balance' => 'auto',
'queue' => [
'high',
'default',
'low',
],
'tries' => 3,
'timeout' => 300,
'memory' => 128,
],
],
],
💡 İpucu: balance: 'auto' ayarı, Horizon'un yoğun queue'lara otomatik olarak daha fazla worker atamasını sağlar. maxProcesses: 10 toplam worker sayısını sınırlar. Sunucu RAM'inize göre bu değeri ayarlayın - her worker yaklaşık 50-100 MB bellek tüketir.
Job Oluşturma ve Queue'ya Gönderme
Laravel'de job'lar ShouldQueue interface'ini implement eden sınıflardır. Horizon, bu job'ları Redis üzerinden yönetir. Farklı queue'lara farklı önceliklerle job gönderebilirsiniz:
class ProcessOrder implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public int $tries = 3;
public int $timeout = 120;
public int $maxExceptions = 2;
public function handle(): void
{
// Siparis isleme mantigi
}
public function failed(Throwable $e): void
{
// Basarisiz olursa bildirim gonder
Notification::route('slack', config('services.slack.webhook'))
->notify(new JobFailedNotification($e));
}
}
// Job'u yuksek oncelikli queue'ya gonder
ProcessOrder::dispatch($order)->onQueue('high');
// Gecikmeli job (5 dakika sonra calistir)
ProcessOrder::dispatch($order)->delay(now()->addMinutes(5));
Production Deployment
Horizon'u production ortamında çalıştırmak için Supervisor process manager kullanılır. Supervisor, Horizon process'ini izler ve çökerse otomatik yeniden başlatır. Laravel Hosting rehberimizde Supervisor kurulumunu detaylı anlattık.
[program:horizon]
process_name=%(program_name)s
command=php /var/www/app/artisan horizon
autostart=true
autorestart=true
user=www-data
redirect_stderr=true
stdout_logfile=/var/log/horizon.log
stopwaitsecs=3600
⚠️ Dikkat: stopwaitsecs=3600 ayarı kritiktir. Horizon kapatılırken çalışan job'ların tamamlanmasını bekler. Bu değer en uzun süren job'unuzun timeout değerinden büyük olmalıdır. Aksi halde job'lar yarıda kesilir.
Deployment Sırasında Horizon Yeniden Başlatma
Kod güncellemesi sonrası Horizon'un yeni kodu yüklemesi için yeniden başlatılması gerekir. horizon:terminate komutu mevcut job'ların tamamlanmasını bekler, ardından Supervisor Horizon'u yeni kodla başlatır:
#!/bin/bash
php artisan down
git pull origin main
composer install --no-dev --optimize-autoloader
php artisan migrate --force
php artisan config:cache
php artisan route:cache
php artisan horizon:terminate # Graceful restart
php artisan up
Horizon dashboard güvenliği için HorizonServiceProvider içinde yetkilendirme gate'i tanımlayın. Production ortamında dashboard'a yalnızca admin kullanıcıların erişmesi gerekir. Hosted Cloud bulut sunucuları ile Redis ve Horizon'u yüksek performansla çalıştırabilirsiniz. Queue izleme hakkında daha fazla bilgi için Laravel Horizon resmi dokümantasyonunu inceleyebilirsiniz.
Sıkça Sorulan Sorular
Horizon Redis dışında bir queue driver ile çalışır mı?
Hayır, Horizon yalnızca Redis queue driver'ı ile çalışır. Database, SQS veya Beanstalkd kullanıyorsanız Horizon'u kullanamazsınız. Redis'e geçiş genellikle basittir - .env'de QUEUE_CONNECTION=redis ayarlayın ve Redis'i kurun.
Horizon ne kadar RAM tüketir?
Horizon'un kendisi yaklaşık 50 MB tüketir. Her worker ek 50-100 MB kullanır. 10 worker ile toplam 550 MB - 1 GB arası bellek ihtiyacı olur. config/horizon.php'deki memory ayarı ile worker başına limiti belirleyebilirsiniz.
Başarısız job'ları nasıl yeniden çalıştırırım?
Horizon dashboard'unda Failed Jobs sekmesinden tek tek veya toplu retry yapabilirsiniz. Komut satırından php artisan horizon:forget {id} ile silme, php artisan queue:retry {id} ile yeniden deneme mümkündür.
Horizon dashboard'u production'da güvenli mi?
Varsayılan olarak yalnızca local ortamda erişilebilir. Production'da HorizonServiceProvider'daki gate() metodunda yetkilendirme tanımlayın. IP kısıtlaması veya admin rolü kontrolü ekleyerek güvenliği sağlayın.
Horizon ile Supervisor arasındaki fark nedir?
Supervisor bir process manager'dır - herhangi bir process'i izler ve çökerse yeniden başlatır. Horizon ise Laravel'e özel queue yönetim aracıdır. Production'da ikisi birlikte kullanılır: Supervisor, Horizon process'ini izler.
Sonuç
Laravel Horizon, Redis tabanlı queue yönetimini gerçek zamanlı dashboard, otomatik worker dengeleme ve detaylı metriklerle güçlendirir. Supervisor ile birlikte kullanıldığında production ortamında güvenilir ve ölçeklenebilir bir job işleme altyapısı elde edersiniz. Deployment sırasında horizon:terminate ile graceful restart yaparak job kaybını önleyin.
Laravel Uygulamanız İçin Güçlü Altyapı
Hosted Cloud'un NVMe SSD bulut sunucuları ile Laravel Horizon ve Redis'i yüksek performansla çalıştırın.
Bulut Sunucu Planlarını İncele →Ahmet Yılmaz
Kıdemli Altyapı Mühendisi
10 yılı aşkın bulut altyapısı ve DevOps deneyimiyle Hosted Cloud'un teknik ekibinde yer almaktadır. Kubernetes, Terraform ve yüksek erişilebilirlik mimarileri üzerine uzmanlaşmıştır.
Yorumlar yakında