Mengirim email massal, memproses video, membuat PDF, atau sinkronisasi pihak ketiga sebaiknya tidak menahan request pengguna. Queue memindahkan pekerjaan tersebut ke worker yang berjalan terpisah.
Respons cepat, pekerjaan menyusul
$job = new GenerateInvoicePdf(orderId: $order->id);
$queue->push('documents', json_encode($job));
return Response::json([
'status' => 'queued',
'order_id' => $order->id,
], 202);Worker harus aman terhadap pengulangan
Message dapat terkirim lebih dari sekali. Worker harus memeriksa apakah output sudah ada atau menggunakan idempotency key sebelum membuat efek samping.
if ($invoiceRepository->pdfExists($job->orderId)) {
$message->ack();
return;
}
$pdf = $generator->make($job->orderId);
$invoiceRepository->storePdf($job->orderId, $pdf);
$message->ack();Retry, backoff, dan dead-letter queue
- 1Error jaringan pertama: retry setelah beberapa detik.
- 2Kegagalan berikutnya: naikkan jeda secara eksponensial.
- 3Setelah batas retry: pindahkan ke dead-letter queue.
- 4Kirim alert dan sediakan mekanisme replay setelah penyebab diperbaiki.
Ukuran kesehatan queue
| Metric | Makna |
|---|---|
| Queue depth | Jumlah pekerjaan menunggu. |
| Oldest message age | Seberapa lama pengguna menunggu hasil. |
| Processing time | Durasi rata-rata per jenis job. |
| Failure rate | Proporsi job gagal. |
| Retry count | Sinyal dependency tidak stabil. |
| Worker utilization | Kapasitas worker yang terpakai. |
Scale worker berdasarkan keterlambatan dan jenis job, bukan hanya panjang antrean. Pisahkan queue cepat dan queue berat agar satu video besar tidak menahan email penting.
