Laravel Queues, Redis Horizon & Job Idempotency
E-posta, SMS, PDF üretimi gibi ağır işleri arka plandaki işçilere (workers) devretmektir.
Bankada sıra numarası alıp bekleme salonuna geçmektir. Gişe memuru (Worker) sıranız geldiğinde işlemi tamamlar; siz kapıda bekletilmezsiniz.
Laravel Queue sistemi, HTTP request-response döngüsünü geciktirmemek için ağır işleri Redis / SQS / Database kuyruğuna yazar. "At-least-once delivery" garantisi vardır. Ağ kesintisinde bir Job iki kez çalışabileceğinden Job'ların Idempotent (tekrar çalıştığında aynı sonucu veren) tasarlanması şarttır.
“Kuyruklar kullanıcıyı bekletmemek ve asenkron işlem yapmak içindir. Redis en popüler driver'dır. Idempotency çok kritiktir: Eğer bir ödeme job'ı retry olursa karttan iki kez para çekmemek için benzersiz bir idempotent key (transactionId) ile kontrol yapılmalıdır.”
class SendInvoiceJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $tries = 3;
public $backoff = 60;
public function handle(): void {
// Idempotent kontrol
if ($this->invoice->is_processed) return;
$this->invoice->markAsProcessed();
}
}
Job içine devasa nesneler koymak yerine ID geçip handle() içinde taze modeli veritabanından çekmemek.