Laravel uygulamalarında düzenli olarak çalışan görevlerin yönetimi, projelerin sağlıklı ve verimli bir şekilde çalışmasını sağlar. Özellikle yüksek trafikli ve büyük ölçekli uygulamalarda, tek bir sunucu üzerinde çalışan görevler yetersiz kalabilir. Bu tür durumlarda Distributed Task Scheduling (Dağıtık Görev Zamanlayıcı) ve Supervisor kullanarak işlemleri birden fazla sunucuya dağıtmak, sistem performansını iyileştirebilir. Bu makalede Laravel üzerinde dağıtık görev zamanlamayı Supervisor yönetimi ile nasıl entegre edeceğimizi örneklerle ele alacağız.
1. Laravel Görev Zamanlayıcı Nedir?
Laravel'in kendi içinde bir task scheduler (görev zamanlayıcı) bulunur ve bu özellik, zamanlanmış görevleri yönetmek için oldukça kullanışlıdır. Laravel, görevlerin app/Console/Kernel.php
dosyasında tanımlanmasını sağlar ve schedule:run
komutu ile belirlenen zaman aralıklarında bu görevleri çalıştırır.
Basit Bir Görev Zamanlayıcı Örneği:
// app/Console/Kernel.php
protected function schedule(Schedule $schedule)
{
// Günlük olarak belirli bir işi çalıştır
$schedule->command('daily:report')
->daily();
// Her saat çalışan başka bir iş
$schedule->command('hourly:clean-up')
->hourly();
}
Burada iki basit görev tanımladık. daily:report
komutu her gün çalışırken, hourly:clean-up
her saat çalışacaktır.
2. Supervisor Nedir ve Neden Kullanılır?
Supervisor, özellikle Unix tabanlı sistemlerde arka plan işlemlerini izlemek ve yönetmek için kullanılan bir araçtır. Görevlerin yönetimini kolaylaştırır ve işlem çökmesi durumunda otomatik olarak yeniden başlatma gibi işlemleri gerçekleştirebilir.
Supervisor, Laravel’de queue:work
ve schedule:run
gibi uzun süreli çalışan komutların kontrol edilmesini sağlar. Görevler birden fazla sunucuya dağıtılabilir, bu da yüksek performanslı ve güvenilir bir yapı sunar.
3. Supervisor Kurulumu
Öncelikle, Supervisor’u sunucunuzda kurmanız gerekiyor. Aşağıdaki komutları kullanarak Supervisor’u kurabilirsiniz:
sudo apt update
sudo apt install supervisor
Kurulumun ardından Supervisor yapılandırma dosyalarına göre çalışır. Şimdi Laravel için bir Supervisor konfigürasyon dosyası oluşturalım.
4. Laravel Queue İşçileri için Supervisor Konfigürasyonu
Örnek olarak, Laravel kuyruk işlemlerini yöneten bir Supervisor yapılandırması yapalım. Supervisor konfigürasyon dosyasını şu komutla oluşturabilirsiniz:
sudo nano /etc/supervisor/conf.d/laravel-worker.conf
laravel-worker.conf
Dosyasının İçeriği:
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /path/to/laravel/artisan queue:work --sleep=3 --tries=3
autostart=true
autorestart=true
user=www-data
numprocs=3
redirect_stderr=true
stdout_logfile=/path/to/laravel/storage/logs/worker.log
command
: Kuyruk işleyiciyi çalıştırır.numprocs
: Kaç tane işleyici çalıştırılacağını belirtir.autostart
veautorestart
: Supervisor, işlemi otomatik olarak başlatır ve gerektiğinde yeniden başlatır.
Bu yapılandırma ile Supervisor, her biri kuyruktan gelen işleri işleyen 3 adet Laravel işleyici (worker) çalıştıracaktır.
Yapılandırmayı kaydedip Supervisor’u yeniden başlatmak için şu komutları kullanın:
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*
5. Dağıtık Görev Zamanlayıcı Yapılandırması
Şimdi Laravel uygulamanızda birden fazla sunucuda dağıtık görev zamanlayıcı (distributed task scheduler) yapısını kuralım.
Laravel, dağıtık görev zamanlayıcıları için onOneServer
metodunu kullanır. Bu metod ile, zamanlanmış görevler yalnızca bir sunucuda çalışır, böylece aynı işlemin birden fazla sunucuda tekrarlanması önlenir.
Dağıtık Zamanlanmış Görev Örneği:
// app/Console/Kernel.php
protected function schedule(Schedule $schedule)
{
$schedule->command('daily:report')
->daily()
->onOneServer();
$schedule->command('hourly:clean-up')
->hourly()
->onOneServer();
}
Bu örnekte onOneServer
ile yalnızca bir sunucuda çalışmasını istediğimiz görevleri belirttik. Bu, özellikle Redis veya Memcached gibi bir cache sistemi ile kullanıldığında daha güvenilir olur.
6. Supervisor ile Zamanlanmış Görevleri Çalıştırma
Supervisor ile schedule:run
komutunu arka planda sürekli olarak çalıştırabiliriz. Böylece Laravel’in kendi zamanlayıcısı belirlenen görevlere erişim sağlar.
Supervisor yapılandırma dosyasına schedule-runner
adlı yeni bir program ekleyelim.
sudo nano /etc/supervisor/conf.d/laravel-scheduler.conf
laravel-scheduler.conf
Dosyasının İçeriği:
[program:laravel-scheduler]
command=php /path/to/laravel/artisan schedule:run
autostart=true
autorestart=true
user=www-data
numprocs=1
redirect_stderr=true
stdout_logfile=/path/to/laravel/storage/logs/scheduler.log
Supervisor’u yeniden başlatarak zamanlayıcı komutunu devreye alın:
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-scheduler
Dağıtık Yapının Avantajları
Supervisor ile Laravel’de dağıtık görev zamanlayıcı ve işleyici yönetimi sayesinde:
Yüksek erişilebilirlik elde edilir.
Görevlerin tek bir sunucuya bağlı kalmadan işlenmesi sağlanır.
Supervisor, görevlerde herhangi bir sorun olması durumunda otomatik yeniden başlatma gibi kolaylıklar sağlar.
Özellikle büyük ölçekli projelerde performans ve iş sürekliliği açısından oldukça faydalı olan bu yapı, sistemin güvenilirliğini de artırır. Bu tür bir yapılandırma ile Laravel uygulamanız hem yüksek trafikte performans kaybı yaşamadan çalışır hem de görevlerin dağıtık olarak işlenmesiyle daha güvenilir hale gelir.