Gereksinimler ve Ön Hazırlık
Bu rehberi uygulamak için sisteminizde PHP 8.2+ ve Laravel 11 yüklü olmalıdır. Ayrıca, kuyruk işlemlerini yönetmek için bir sürücüye (driver) ihtiyacınız olacak. Geliştirme ortamında database sürücüsünü, üretim ortamında ise Redis kullanmanızı öneririz.
- PHP 8.2 veya üzeri
- Composer paket yöneticisi
- Redis (Üretim ortamı için önerilir)
- Laravel Mail yapılandırması (SMTP veya API tabanlı)
Öncelikle, kuyruk tablolarını veritabanınızda oluşturmak için aşağıdaki terminal komutunu çalıştırarak gerekli migration dosyalarını hazırlayın:
php artisan queue:table
php artisan migrate
Bu komutlar, kuyruğa alınan işlerin (job) tutulacağı jobs ve başarısız işlerin saklanacağı failed_jobs tablolarını oluşturur.
Laravel Kuyruk Sürücülerinin Karşılaştırılması
Kuyruk sisteminizi tasarlarken doğru sürücüyü seçmek, sistemin darboğaz yaşamaması için kritiktir. Aşağıdaki tablo, yaygın kullanılan sürücülerin avantaj ve dezavantajlarını özetlemektedir.
| Sürücü | Avantajı | Dezavantajı |
|---|---|---|
| Database | Kolay kurulum, ek altyapı gerektirmez. | Yüksek trafikli sistemlerde veritabanını yorar. |
| Redis | Çok hızlı, atomik işlemler için ideal. | Ek bir servis (Redis) kurulumu gerektirir. |
| Sync | Hata ayıklama (debug) için kolaydır. | Asenkron çalışmaz, e-postayı bekletir. |
Özelleştirilmiş E-Posta Kuyruğu İçin Mailable Sınıfı Oluşturma
Laravel'de e-posta gönderimi için Mailable sınıfları kullanılır. Kuyruk özelliğini aktif etmek için bu sınıfa ShouldQueue arayüzünü (interface) eklememiz gerekir. Bu işlem, Laravel'in e-postayı doğrudan göndermek yerine kuyruğa almasını sağlar.
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class WelcomeEmail extends Mailable implements ShouldQueue
{
use Queueable, SerializesModels;
public $user;
public function __construct($user)
{
$this->user = $user;
}
public function build()
{
return $this->view('emails.welcome')
->subject('Aramıza Hoş Geldiniz!');
}
}
Burada ShouldQueue arayüzünü implement ederek sınıfın arka planda işlenmesi gerektiğini belirttik. Queueable trait'i ise kuyruk mekanizması için gerekli olan işlevleri sınıfa ekler.
Kuyruk İşlemlerini Özelleştirme ve Hata Yönetimi
E-posta gönderimi sırasında SMTP sunucusu yanıt vermeyebilir veya geçici bağlantı sorunları yaşanabilir. Laravel, bu gibi durumlar için tries (deneme sayısı) ve backoff (bekleme süresi) gibi özellikler sunar. Bu özelleştirmeleri Mailable sınıfınızın içinde tanımlayabilirsiniz.
// Mailable sınıfı içinde
public $tries = 3;
public $backoff = [10, 30, 60]; // 10, 30 ve 60 saniye aralıklarla tekrar dene
public function failed(\Throwable $exception)
{
// E-posta gönderimi 3 denemede de başarısız olursa burası çalışır
\Log::error('E-posta gönderilemedi: ' . $exception->getMessage());
}
Bu yapı, sistemin kararlılığını artırır. failed metodu, başarısız olan görevlerin loglanmasını veya yöneticiye bildirilmesini sağlar.
Kritik Güvenlik Uyarısı: E-posta kuyruğuna veri gönderirken hassas bilgileri (şifre, API anahtarı vb.) doğrudan Mailable sınıfına aktarmayın. Sadece gerekli olan ID veya temel kullanıcı bilgilerini gönderin; veriyi kuyruk işlendiği sırada veritabanından tekrar çekmek daha güvenlidir.
Kuyruk Çalıştırıcısını (Queue Worker) Yapılandırma
Kuyruğa alınan işlerin işlenmesi için arka planda sürekli çalışan bir "Worker" sürecine ihtiyacınız vardır. Geliştirme ortamında aşağıdaki komutu kullanarak kuyruğu başlatabilirsiniz:
php artisan queue:work --queue=emails --tries=3
Burada --queue=emails parametresi ile sadece e-posta kuyruğuna odaklanmasını sağladık. Üretim ortamında ise bu süreci Supervisor gibi bir süreç yöneticisi ile yönetmeniz gerekir. Supervisor, sunucu yeniden başladığında veya süreç çöktüğünde kuyruk worker'ını otomatik olarak yeniden başlatır.
Sıkça Sorulan Sorular
Kuyruğa alınan e-postalar neden hemen gönderilmiyor?
Kuyruk sistemi asenkron çalışır. php artisan queue:work komutu çalışmıyorsa veya durduysa, işler veritabanında bekler ancak işlenmez. Worker'ın aktif olduğundan emin olun.
E-posta gönderiminde 'Connection refused' hatası alıyorum, ne yapmalıyım?
Bu genellikle SMTP yapılandırmasının yanlış olmasından veya sunucunun dışarıya e-posta gönderimini engellemesinden kaynaklanır. .env dosyanızdaki MAIL_PORT ve MAIL_ENCRYPTION ayarlarını kontrol edin.
Kuyruktaki işleri nasıl izleyebilirim?
Laravel Horizon (Redis kullanıyorsanız) veya php artisan queue:failed komutu ile başarısız olan işleri inceleyebilir ve php artisan queue:retry all ile tekrar deneyebilirsiniz.
Tüm e-postaları kuyruğa almak zorunda mıyım?
Zorunlu değilsiniz ancak kullanıcı deneyimi için kritik olan (şifre sıfırlama, doğrulama) e-postaları kuyruğa almak, uygulamanızın hızını artırır. Sadece çok kritik ve anlık olması gereken sistem bildirimlerini senkron gönderebilirsiniz.
Kuyruk tablosu çok büyürse ne yapmalıyım?
php artisan queue:prune-failed komutunu bir zamanlanmış görev (scheduler) olarak ekleyerek, eski ve başarısız kayıtların periyodik olarak temizlenmesini sağlayabilirsiniz.
Sorumluluk Reddi: Bu rehberdeki kod örnekleri genel yazılım geliştirme pratiklerini yansıtır. Uygulamanızın canlı ortamdaki güvenlik, performans ve veri yedekleme sorumluluğu tamamen geliştiriciye aittir. Kritik sistemlerde her zaman kapsamlı testler yapınız.
Kuyruk Performansını İzlemek İçin Laravel Horizon Entegrasyonu
Laravel kuyruk sistemini ölçeklendirdiğinizde, hangi işin ne kadar sürede tamamlandığını, hata oranlarını ve kuyruk yoğunluğunu takip etmek kritik bir hale gelir. Laravel Horizon, Redis tabanlı kuyruklarınız için şık bir kontrol paneli ve kod tabanlı yapılandırma sunar.
Horizon'u projenize dahil ederek, kuyruk süreçlerinizi görselleştirebilir ve her bir e-posta kuyruğu için özel "kuyruk grupları" (queue groups) tanımlayabilirsiniz.
// composer.json üzerinden kurulum
composer require laravel/horizon
// Kurulum sonrası yapılandırma dosyasını yayınlayın
php artisan horizon:install
// config/horizon.php içerisinde e-posta kuyruğunuzu özelleştirin
'environments' => [
'production' => [
'supervisor-1' => [
'connection' => 'redis',
'queue' => ['default', 'emails'],
'balance' => 'auto',
'maxProcesses' => 10,
],
],
],
Horizon kullanmanın en büyük avantajı, failed_jobs tablosuna düşen e-postaları tek bir tıkla yeniden deneme (retry) veya silme imkanı sunmasıdır. Ayrıca, belirli bir süre içerisinde gönderilen e-posta sayısını canlı grafiklerle takip edebilirsiniz.
E-Posta Kuyruklarında İleri Düzey Hata Ayıklama Stratejileri
Kuyruk sistemlerinde yaşanan hatalar genellikle "sessiz" gerçekleşir. E-postanızın neden gönderilmediğini anlamak için Laravel'in sunduğu olay (event) dinleyicilerini kullanmak en etkili yöntemdir. AppServiceProvider içerisinde kuyruk hatalarını loglamak, sistemin neden tıkandığını anlamanızı sağlar.
use Illuminate\Support\Facades\Queue;
use Illuminate\Queue\Events\JobFailed;
use Illuminate\Support\Facades\Log;
public function boot()
{
Queue::failing(function (JobFailed $event) {
// Hata detaylarını log dosyasına kaydedin
Log::error('E-posta kuyruğu başarısız oldu: ' . $event->job->resolveName(), [
'exception' => $event->exception->getMessage(),
'connection' => $event->connectionName,
]);
});
}
Buna ek olarak, e-posta gönderim sürecinde "Rate Limiting" (hız sınırlaması) uygulamanız gerekebilir. Özellikle SMTP sağlayıcıları (Mailgun, SendGrid vb.) belirli bir saniyede gönderilen e-posta sayısına limit koyar. Laravel'in RateLimiter sınıfını kullanarak e-posta gönderim hızınızı kontrol altında tutabilirsiniz:
use Illuminate\Support\Facades\RateLimiter;
// E-posta gönderimini saniyede 5 ile sınırla
RateLimiter::attempt(
'send-email-key',
$perSecond = 5,
function() {
// E-posta gönderim mantığı buraya gelir
}
);
Bu yöntemle, e-posta sağlayıcınızın kara listesine girmekten kurtulabilir ve gönderim başarısını maksimum seviyeye çıkarabilirsiniz. Unutmayın ki, kuyruk sistemlerinde "hata yönetimi" sadece hatayı yakalamak değil, aynı zamanda hatanın oluşmasını engelleyecek koruyucu mekanizmalar kurmaktır.
Sonuç
Laravel ile özelleştirilmiş bir e-posta kuyruk sistemi kurmak, uygulamanızın performansını ve hata toleransını bir üst seviyeye taşır. ShouldQueue arayüzü, backoff yapılandırması ve doğru queue:work yönetimi ile e-posta trafiğinizi profesyonelce yönetebilirsiniz. Bir sonraki adım olarak, e-posta gönderim süreçlerinizi izlemek için Laravel Horizon kurulumunu araştırmanızı ve kuyruk işlemlerini Redis üzerinde yapılandırmanızı öneririm.


Yorumlar (0)
Yorum Yaz