Untuk mengelola queue Laravel secara operasional, Anda perlu memastikan job tidak hanya diproses tetapi juga terpantau, hasil yang bisa di-cache, serta sistem worker yang responsif terhadap lonjakan. Artikel ini menjelaskan bagaimana memanfaatkan cache, worker pool, dan mekanisme locking Redis agar antrean tetap stabil, serta langkah tanggap saat gagal atau menumpuk.
Konfigurasi Queue dan Cache untuk Produksi
Gunakan redis sebagai backend queue untuk throughput tinggi dan dukungan fitur locking yang lebih mudah.
Pastikan file config/queue.php mengarah ke connection redis yang sama dengan cache agar job dan cache berada di namespace yang konsisten.
// config/queue.php
'connections' => [
'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => 'default',
'retry_after' => 90,
'block_for' => null,
],
],
// config/cache.php
'default' => env('CACHE_DRIVER', 'redis'),
'stores' => [
'redis' => [
'driver' => 'redis',
'connection' => 'cache',
],
],
Atur retry_after sesuai estimasi durasi job, dan padukan dengan supervisor agar worker restar saat job terlalu lama. Karena timeout mendekati lama eksekusi job, pertimbangkan untuk menempatkannya sedikit lebih tinggi dari estimasi tertinggi.
Mengelola Cache Hasil Job Pendukung
Cache hasil job membantu mencegah perhitungan ulang saat job berulang atau memerlukan data historis. Gunakan Cache::remember dengan key yang menyertakan ID job atau parameter unik.
public function handle()
{
$cacheKey = 'report:'.$this->reportId.':'.md5($this->filters);
return Cache::remember($cacheKey, now()->addMinutes(60), function () {
// Hitung laporan yang berat
return $this->generateReport();
});
}
Jangan lupa invalidasi cache kalau data sumber berubah. Konsistensi data dapat dijaga dengan event yang memicu Cache::forget($cacheKey) begitu entitas inti berubah, atau gunakan cache tagging jika mendukung agar job hanya menghapus subset data yang relevan.
Strategi Worker Pool dan Scaling
Kelola worker pool menggunakan Supervisor atau sistem orchestrator seperti Kubernetes. Contoh konfigurasi Supervisor:
[program:laravel-queue]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/artisan queue:work redis --sleep=3 --tries=3 --timeout=90
numprocs=4
autostart=true
autorestart=true
user=www-data
redirect_stderr=true
stdout_logfile=/var/log/queue-worker.log
Kalibrasi jumlah numprocs berdasarkan CPU dan I/O. Monitor load average agar tidak melewati kapasitas. Tambahan worker bisa dilakukan otomatis saat antrean panjang; gunakan metrik antrean via php artisan queue:stats atau integrasi dengan monitoring stack seperti Prometheus.
Monitoring Operasional Queue
Pantau tiga indikator utama:
- Delay: waktu rata-rata job menunggu. Delay tinggi menunjukkan worker tidak cukup.
- Retry: job yang gagal dan masuk ulang. Cek log stack trace untuk menentukan penyebab.
- Queue Length: jumlah job di antrean. Antrean panjang bisa menjadi sinyal autoscaling atau throttling.
Untuk backlog, hal pertama adalah memeriksa apakah worker mati atau menunggu lock. Jika worker menumpuk, pertimbangkan:
- Tambahkan worker sementara.
- Periksa job yang gagal dan jalankan ulang secara manual
php artisan queue:retry all. - Kurangi volume dengan memotong input batch job jika memungkinkan.
Deteksi dan Recovery Deadlock Locking Redis
Ketika job mengakses resource bersama, gunakan lock Redis agar tidak ada duplikasi proses. Contoh:
$lock = Cache::store('redis')->lock('report:'.$this->reportId, 60);
if (! $lock->get()) {
return;
}
try {
$this->generateReport();
} finally {
$lock->release();
}
Lock perlu memiliki TTL agar tidak menggantung bila worker crash. Untuk mendeteksi deadlock:
- Pantau lock key yang masih ada lebih lama dari TTL.
- Gunakan skrip pemeriksa periodik yang memeriksa
PTTLdan memaksa release jika tidak ada owner. - Reset logika dengan email alert ketika locking tidak dilepaskan.
Redis::del($key) dan pastikan job yang terdampak dijalankan ulang setelah pengecekan konsistensi.
Menjaga Konsistensi Data Saat Job Gagal atau Menumpuk
Setiap job harus idempotent dan dapat dijalankan ulang tanpa perubahan data yang tidak diinginkan. Tambahkan flag status (misalnya processing dan done) di basis data agar job tidak memulai ulang dari nol jika sudah selesai.
Langkah tanggap saat kegagalan mencakup:
- Periksa reason stack trace di
storage/logs/laravel.log. - Jika job terus gagal karena data invalid, tangani dengan job fallback atau kirim notifikasi tim respons.
- Gunakan
FailedJobProvideruntuk menyimpan detail job gagal dan jalankan ulang setelah memperbaiki.
Data konsisten juga berarti job tidak memodifikasi state yang sedang diproses user. Pertimbangkan two-phase commit sederhana: tulis perubahan ke table staging lalu validate lalu pindahkan ke table utama.
Kesimpulan
Mengelola Queue Laravel di produksi menuntut perpaduan konfigurasi yang tepat, caching hasil job, worker pool yang responsif, serta sistem locking dan monitoring yang matang. Dengan langkah-langkah ini, Anda bisa menjaga antrean tetap stabil, mendeteksi deadlock lebih awal, dan menjamin konsistensi data meski terjadi kegagalan atau lonjakan traffic.
Komentar
0 komentar
Masuk ke akun kamu untuk ikut berkomentar.
Belum ada komentar
Jadilah yang pertama ikut berdiskusi!