DLQ

DLQ #

Dead Letter Queue (DLQ): Konsep, Masalah Nyata, dan Implementasi di Amazon SQS

Dalam sistem terdistribusi modern, kegagalan bukanlah sesuatu yang bisa dihindari. Network glitch, bug logic, dependency eksternal yang lambat atau down, hingga data anomali adalah hal yang pasti terjadi. Yang membedakan sistem yang matang dan rapuh bukanlah apakah ia gagal, tetapi bagaimana ia gagal.

Salah satu mekanisme paling penting untuk menangani kegagalan dalam sistem berbasis message queue adalah Dead Letter Queue (DLQ).

Artikel ini akan membahas secara mendetail:

  • Apa itu DLQ dan masalah apa yang diselesaikannya
  • Kenapa retry saja tidak cukup
  • Konsep DLQ secara umum
  • Studi kasus nyata menggunakan Amazon SQS + DLQ
  • Alur pesan dari awal sampai masuk DLQ
  • Best practice desain DLQ di production

Artikel ini ditujukan untuk engineer backend, platform engineer, maupun architect yang membangun sistem event-driven atau async processing.

Apa Itu Dead Letter Queue (DLQ)? #

Dead Letter Queue (DLQ) adalah queue khusus yang digunakan untuk menyimpan pesan-pesan yang gagal diproses setelah melewati sejumlah percobaan (retry) yang telah ditentukan.

Alih-alih:

  • terus di-retry tanpa henti
  • dibuang tanpa jejak
  • atau membuat sistem macet

pesan tersebut dipindahkan ke DLQ untuk:

  • dianalisis
  • di-debug
  • diperbaiki
  • atau diproses ulang secara manual / otomatis

Secara sederhana:

DLQ adalah tempat karantina untuk pesan bermasalah.


Masalah Nyata Tanpa DLQ #

Mari kita lihat masalah klasik jika tidak menggunakan DLQ.

Contoh Kasus #

Sebuah sistem memiliki:

  • SQS Queue: order-created
  • Consumer: service order-processor

Tugas consumer:

  1. Validasi order
  2. Simpan ke database
  3. Panggil payment service

Masalah Terjadi #

Tiba-tiba ada pesan dengan kondisi:

  • field amount = null
  • atau format JSON tidak sesuai
  • atau logic bug di consumer

Akibatnya:

  • Consumer selalu gagal memproses pesan ini

  • Message akan:

    • muncul kembali setelah visibility timeout
    • diproses ulang
    • gagal lagi

Dampak #

Tanpa DLQ:

  • Pesan ini akan diproses berulang tanpa akhir
  • Menghabiskan resource
  • Mengganggu pesan lain (queue blocking)
  • Menyulitkan debugging

Inilah yang disebut poison message.


Kenapa Retry Saja Tidak Cukup? #

Retry memang penting, tapi tidak semua error bisa diselesaikan dengan retry.

Retry Cocok Untuk #

  • Network timeout
  • Dependency sementara down
  • Race condition

Retry Tidak Cocok Untuk #

  • Data invalid
  • Bug logic
  • Constraint database
  • Schema mismatch

Tanpa DLQ:

  • Retry → gagal → retry → gagal → loop selamanya

Dengan DLQ:

  • Retry dibatasi
  • Setelah limit tercapai → pesan dipindahkan ke DLQ

Konsep Dasar DLQ #

Secara umum, DLQ memiliki karakteristik:

  1. Queue terpisah dari main queue

  2. Tidak diproses oleh consumer utama

  3. Menyimpan:

    • payload pesan
    • metadata kegagalan
  4. Digunakan untuk:

    • debugging
    • reprocessing
    • audit

Dead Letter Queue di Amazon SQS #

Amazon SQS memiliki dukungan native DLQ melalui fitur:

Redrive Policy #

Redrive policy memungkinkan:

  • Main queue mengirim pesan ke DLQ
  • Setelah pesan gagal diproses sebanyak maxReceiveCount

Komponen #

  • Main Queue: order-created
  • Dead Letter Queue: order-created-dlq

Studi Kasus: DLQ di SQS #

Arsitektur #

Producer
   |
   v
[SQS order-created]
   |
   v
Order Processor (Consumer)
   |
   |-- success --> done
   |
   |-- failure (retry)
   |
   |-- max retry reached
   v
[SQS order-created-dlq]

Alur Lengkap Pesan #

Pesan Dikirim #

Producer mengirim pesan:

{
  "order_id": "123",
  "amount": null
}

Consumer Gagal Memproses #

Consumer error saat validasi:

  • amount = null

Consumer tidak menghapus pesan dari queue.

Visibility Timeout #

  • Pesan menjadi invisible selama visibility timeout
  • Setelah timeout → pesan muncul kembali

Retry Berulang #

SQS menaikkan:

  • ApproximateReceiveCount

Contoh:

  • receive #1 → gagal
  • receive #2 → gagal
  • receive #3 → gagal

Masuk DLQ #

Jika maxReceiveCount = 3, maka:

  • Pada kegagalan ke-3
  • Pesan otomatis dipindahkan ke DLQ

Konfigurasi DLQ di SQS #

Buat DLQ #

  • Buat queue baru: order-created-dlq
  • Biasanya:
    • Retention lebih lama (7–14 hari)
    • Tidak ada consumer otomatis

Pasang Redrive Policy #

Di main queue order-created:

  • Dead-letter queue: order-created-dlq
  • maxReceiveCount: misal 3 atau 5

Artinya:

Jika satu pesan diterima lebih dari N kali tanpa berhasil dihapus, kirim ke DLQ.


Apa yang Ada di DLQ? #

Pesan di DLQ tetap berisi payload asli, plus metadata SQS:

  • Message Body
  • Message Attributes
  • ApproximateReceiveCount
  • Timestamp

Ini sangat penting untuk:

  • Root cause analysis
  • Replay pesan

Strategi Menangani Pesan di DLQ #

DLQ bukan akhir, tapi bagian dari workflow.

Manual Inspection #

  • Engineer membaca pesan
  • Cari root cause
  • Fix bug

Automated Reprocessing #

  • Setelah bug diperbaiki
  • Pesan dipindahkan kembali ke main queue

Filtering & Discard #

  • Jika data benar-benar invalid
  • Simpan sebagai audit
  • Tidak perlu diproses ulang

Best Practice DLQ di SQS #

Jangan Jadikan DLQ Sebagai Tempat Sampah #

DLQ harus:

  • Dimonitor
  • Dibersihkan
  • Ditindaklanjuti

Pasang Alarm #

Gunakan CloudWatch Alarm:

  • Jika DLQ memiliki pesan > 0
  • Itu sinyal ada masalah serius

Tentukan maxReceiveCount dengan Bijak #

Umumnya:

  • 3–5 untuk error non-transient
  • Lebih besar jika dependency sering fluktuatif

Pisahkan Error Transient vs Permanent #

Di consumer:

  • Error transient → retry
  • Error permanent → log dan fail cepat

Simpan Context Error #

Tambahkan:

  • correlation id
  • request id
  • version

Agar debugging DLQ lebih mudah.


Kesalahan Umum dalam Implementasi DLQ #

  1. Tidak pernah melihat DLQ
  2. maxReceiveCount terlalu besar
  3. DLQ diproses otomatis tanpa filtering
  4. Menghapus pesan DLQ tanpa analisa

Kapan DLQ Wajib Digunakan? #

DLQ wajib jika:

  • Sistem async / event-driven
  • Tidak boleh kehilangan data
  • Processing kompleks
  • Dependency banyak

Jika Anda memakai:

  • SQS
  • Pub/Sub
  • Kafka

Maka konsep DLQ (atau ekuivalennya) bukan opsional.


Penutup #

Dead Letter Queue adalah salah satu fondasi penting dalam membangun sistem yang resilient, observable, dan maintainable.

DLQ bukan sekadar fitur teknis, tapi alat desain sistem untuk mengakui bahwa kegagalan itu normal — dan harus ditangani dengan elegan.

Jika sistem Anda sudah async tapi belum punya DLQ:

Itu bukan soal jika akan bermasalah, tapi kapan.

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact