Overload queue di aplikasi Laravel menengah biasanya muncul ketika volume job naik mendadak sementara worker tidak siap atau sistem menyimpan data yang terus dibaca. Langkah pertama adalah mengidentifikasi backlog dan menilai apakah Redis atau database queue yang menjadi bottleneck, lalu menerapkan strategi cache, lock, dan konfigurasi worker yang stabil agar sistem kembali responsif.
Identifikasi Backlog Queue
Mulai dengan mengukur jumlah job tertunda dan waktu tunggu rata-rata. Perintah php artisan queue:listen tidak memberi metrik cukup, sehingga gunakan queue monitoring built-in seperti queue:work --tries=3 dan dashboard Redis untuk menghitung panjang list.
Analisis juga jenis job yang paling sering menumpuk: apakah job yang menulis ke database, memanggil API eksternal, atau kondisi read-heavy yang bisa dijadikan cache. Catat rasio kode yang melakukan dispatch berulang tanpa throttle.
Konfigurasi Worker untuk Concurrency Stabil
Pengaturan worker harus menyesuaikan jumlah CPU/IO dan tipe job. Jangan langsung menambah worker tanpa memperhitungkan resource server karena justru membuat contention.
Contoh konfigurasi di supervisor
[program:laravel_queue_worker]
process_name=%(program_name)s_%(process_num)02d
command=php /path/artisan queue:work redis --sleep=3 --tries=3 --timeout=120 --memory=512
numprocs=4
autostart=true
autorestart=true
user=www-data
environment=APP_ENV=production
Gunakan --sleep dan --timeout untuk menghindari busy loop, serta batasi memori agar worker restart sebelum kebocoran terjadi. Pastikan jumlah numprocs tidak melebihi jumlah CPU atau slot database.
Strategi Retry dan Backoff
Job yang gagal berulang harus diberi backoff progresif agar tidak menciptakan storm. Laravel 10+ mendukung backoff dalam job class:
class ProcessPayment implements ShouldQueue
{
use Queueable;
public function backoff(): array
{
return [30, 60, 120];
}
}
Perhatikan bahwa terlalu pendek backoff mendorong job kembali ke queue sebelum kondisi berhasil diatasi. Kunci lain adalah menetapkan tries yang wajar dan memindahkan job ke failed_jobs ketika mencapai batas.
Cache untuk Memitigasi Beban Read-Heavy
Sebelum worker memproses data, pertimbangkan cache berbasis Redis untuk menurunkan hit database. Misalnya, job yang memerlukan data user dapat mengecek cache terlebih dahulu.
$user = Cache::remember("user:{$id}", now()->addMinutes(5), fn () => User::find($id));
Setiap job harus memahami kapan cache perlu invalidasi. Gunakan event listener atau observer untuk menghapus cache ketika ada perubahan data:
protected static function booted()
{
static::saved(fn ($model) => Cache::forget("user:{$model->id}"));
static::deleted(fn ($model) => Cache::forget("user:{$model->id}"));
}
Cache mengurangi pressure read saat banyak job memanggil data yang sama dan memberi waktu worker mengolah job lain.
Lock Redis untuk Konsistensi
Job yang mengupdate resource kritis butuh lock agar tidak terjadi race. Laravel menyediakan Cache::lock untuk Redis:
$lock = Cache::lock('process-order:' . $order->id, 30);
if ($lock->get()) {
try {
// proses yang membutuhkan eksklusif akses
} finally {
$lock->release();
}
} else {
// jadwalkan ulang atau fail-safe
}
Gunakan lock untuk job idempotent agar tidak terjadi update ganda ketika retry dijalankan. Pastikan durasi lock cukup untuk menyelesaikan job tapi tidak menyebabkan deadlock.
Observability dan Pemantauan Queue Health
Langkah terakhir adalah memantau queue secara rutin. Integrasikan metrik berikut dalam sistem observability:
- Jumlah job tertunda per queue (Redis
LLENatau database count). - Jumlah worker aktif serta CPU/Memory tiap proses.
- Ratio job gagal dan waktu eksekusi rata-rata.
- Retry/Backoff yang menyebabkan antrian.
AWS CloudWatch, Grafana dengan Redis Exporter, atau Laravel Horizon dapat menampilkan metrik ini. Buat alert ketika backlog melewati threshold agar bisa menambah worker sementara atau menginvestigasi job bermasalah.
Penutup
Dengan mengenali backlog, menyetel worker secara hati-hati, memakai cache untuk read-heavy, mengunci resource sensitif dengan Redis lock, dan mengawasi queue health, overload queue Laravel bisa diredam tanpa menambah infrastruktur skala besar. Pendekatan ini cocok untuk aplikasi menengah yang ingin stabilitas tinggi tanpa kompleksitas berlebihan.
Komentar
0 komentar
Masuk ke akun kamu untuk ikut berkomentar.
Belum ada komentar
Jadilah yang pertama ikut berdiskusi!