Laravel queue jobs do baar run ho rahi hain (jobs running twice), retry_after ka kya chakkar hai?
Aadab sab ko. School management software mein ek job hai jo ek school ke saare students ki fee receipt PDF banake parents ko email karti hai. Masla ye hai ki kabhi kabhi job do baar chal jaati hai, parents ko do emails jaate hain, aur principal sahab naraz hain. Setup: Laravel 11, PHP 8.3, QUEUE_CONNECTION=redis , worker: php artisan queue:work --tries=3 class SendFeeReceipts implements ShouldQueue { use Queueable;β¦
Accepted answer
Haan Faizan, bilkul wahi masla hai, and it is not basic, half the Laravel devs in Pakistan have sent double emails because of this. Redis queue mein jab worker job uthata hai, Laravel use retry_after seconds ke liye reserve karta hai (default 90, config/queue.php mein redis connection). Agar job 90 second mein khatam nahi hui, Laravel samajhta hai worker mar gaya aur job wapas queue mein daal deta hai. Doosra worker utha leta hai. Ab dono chal rahe hain. Exception koi nahi, isliye tumhe kuch dikhta nahi. Fix, isi order mein: 1. config/queue.php mein redis ka 'retry_after' => 600, aur worker ko --timeout=540. Rule: timeout hamesha retry_after se kam. Job class mein bhi public $timeout = 540; rakh do. 2. Asli fix: ek job mein 500 emails mat bhejo. Ek job per student dispatch karo, Bus::batch se, taaki progress aur failures dikhein. Har job 2 second ki hogi, retry_after ka sawaal hi khatam. 3. Idempotency: fee_receipts table mein (student_id, term) unique rakho aur sent_at save karo. Job shuru mein check kare, already sent hai to return. Phir job teen baar bhi chale, parent ko ek hi email jayega. Maine ye May mein Horizon wali post mein likha tha, wahan supervisor config bhi hai. Principal sahab ko mera salaam π