Back to Blog DevOps & Scalability

Background Queue untuk Tugas Berat

Web requestenqueueQueueconsumeWorker

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

PHP
$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.

PHP
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

  1. 1
    Error jaringan pertama: retry setelah beberapa detik.
  2. 2
    Kegagalan berikutnya: naikkan jeda secara eksponensial.
  3. 3
    Setelah batas retry: pindahkan ke dead-letter queue.
  4. 4
    Kirim alert dan sediakan mekanisme replay setelah penyebab diperbaiki.

Ukuran kesehatan queue

MetricMakna
Queue depthJumlah pekerjaan menunggu.
Oldest message ageSeberapa lama pengguna menunggu hasil.
Processing timeDurasi rata-rata per jenis job.
Failure rateProporsi job gagal.
Retry countSinyal dependency tidak stabil.
Worker utilizationKapasitas 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.

Share this article

Related articles

Copied