Belajar RabbitMQ - Dead Letter Exchanges (DLX)
Episode 11 of 33

Belajar RabbitMQ - Dead Letter Exchanges (DLX)

Pesan yang gagal diproses tidak boleh hilang begitu saja. Di episode ini kalian mengkonfigurasi dead letter exchange, memahami tiga alasan pesan masuk DLX, menerapkan pola retry dan parking lot, serta membaca header x-death untuk menganalisis siklus hidup pesan.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

Di episode 5 kalian belajar bahwa basic_nack dengan requeue=False bisa "membuang" pesan. Tapi membuang pesan begitu saja berbahaya: data bisnis bisa hilang tanpa jejak. Jawaban RabbitMQ untuk masalah ini adalah Dead Letter Exchange (DLX) — exchange tujuan khusus tempat pesan-pesan bermasalah dikumpulkan.

Dead lettering terjadi dalam tiga situasi: pesan ditolak oleh consumer (basic.reject/basic.nack tanpa requeue), pesan kedaluwarsa karena TTL, atau pesan dibuang karena queue mencapai max length. Ketiganya memicu pesan "mati" yang kemudian di-routing ke DLX.

DLX bukan sekadar tempat sampah. Dengan DLX, kalian bisa membangun pola retry yang halus, menerapkan parking lot pattern untuk inspeksi manual, dan memantau pesan yang terus gagal. Episode ini mengajarkan seluruh rangkaian tersebut, termasuk membaca header x-death yang merekam riwayat setiap kematian pesan.

Dead Letter Concepts

Konfigurasi DLX

DLX dikonfigurasi lewat argumen queue: x-dead-letter-exchange dan opsional x-dead-letter-routing-key. Saat pesan mati, RabbitMQ me-routing ulang ke exchange tersebut:

Deklarasi queue dengan DLX
rabbitmqadmin declare exchange name=orders.dlx type=direct
rabbitmqadmin declare queue name=orders.dead durable=true
rabbitmqadmin declare queue name=orders.in \
  arguments='{"x-dead-letter-exchange":"orders.dlx","x-dead-letter-routing-key":"dead"}'
rabbitmqadmin declare binding source=orders.dlx destination=orders.dead routing_key=dead

Jika x-dead-letter-routing-key tidak diset, RabbitMQ memakai routing key pesan asli. Tanpa binding yang cocok di DLX, pesan mati akan hilang — jadi pastikan selalu ada queue penerima.

Alasan Dead Lettering

Tiga pemicu pesan masuk DLX:

  • Rejection: consumer memanggil basic.reject atau basic.nack dengan requeue=False.
  • Expiration: TTL pesan habis sebelum dikirim ke consumer.
  • Max length: queue penuh dan x-overflow=drop-head mengeluarkan pesan tertua.

DLX Patterns

Pola Retry dengan TTL dan DLX

Pola retry paling populer memakai kombinasi TTL + DLX: pesan yang gagal di-nack dengan requeue=False masuk ke DLX, di-routing ke queue retry yang punya x-message-ttl, lalu setelah kedaluwarsa di-routing kembali ke queue utama. Dengan begitu, pesan otomatis dicoba ulang setelah jeda.

Queue retry menuju queue utama
rabbitmqadmin declare queue name=orders.retry \
  arguments='{"x-message-ttl":30000,"x-dead-letter-exchange":"orders.main","x-dead-letter-routing-key":"in"}'

Pesan gagal menunggu 30 detik di orders.retry, lalu kembali ke queue utama untuk diproses ulang. Batasi jumlah retry dengan menghitung header x-death di consumer.

Parking Lot Pattern

Parking lot adalah queue DLX final untuk pesan yang sudah berkali-kali gagal. Setelah melewati N kali retry, consumer memindahkan pesan ke queue parkir alih-alih memproses ulang:

PythonKirim ke parking lot setelah retry maksimal
max_retry = 3
 
def callback(ch, method, properties, body):
    death_count = 0
    deaths = properties.headers.get("x-death") if properties.headers else None
    if deaths:
        death_count = len(deaths)
    if death_count >= max_retry:
        ch.basic_publish(exchange="orders.parking", routing_key="park",
                         body=body, properties=properties)
        ch.basic_ack(delivery_tag=method.delivery_tag)
    else:
        ch.basic_nack(delivery_tag=method.delivery_tag, requeue=False)

Blok properties.headers.get("x-death") membaca riwayat kematian pesan; jika sudah melebihi batas, pesan dipindahkan ke queue parkir alih-alih di-retry tanpa batas.

Advanced DLX: Header x-death

Membaca Riwayat Pesan

Setiap pesan yang melewati dead lettering mendapat header x-death berisi array riwayat: berapa kali mati, alasan, queue asal, exchange, dan timestamp. Ini alat forensik yang sangat berharga:

Contoh header x-death
x-death: [
  {
    "count": 2,
    "reason": "rejected",
    "queue": "orders.in",
    "time": [1723...],
    "exchange": "",
    "routing-keys": ["orders.new"]
  }
]

Membaca x-death memungkinkan kalian melihat siklus hidup lengkap sebuah pesan dari queue asal sampai DLX final.

Chaining DLX dan Monitoring

DLX bisa dirantai: queue utama → DLX retry → queue retry → DLX kedua → queue parkir. Setiap lapisan menambahkan entri di x-death, sehingga riwayat lengkap terjaga. Untuk monitoring, pantau depth queue dead letter dan alarm saat depth melewati ambang batas — topik ini kita lanjutkan di episode 25.

Tip

Buat alert khusus untuk queue dead letter: depth yang terus naik menandakan ada pesan yang tidak pernah bisa diproses. Alerting untuk kasus ini dibahas di episode 25.

Penutup

Di episode 11 ini kalian sudah mengkonfigurasi dead letter exchange, memahami tiga pemicu dead lettering, membangun pola retry dengan TTL+DLX, menerapkan parking lot pattern, serta membaca header x-death untuk menganalisis riwayat pesan.

Inti yang harus dibawa pulang:

  • DLX ditunjuk lewat argumen x-dead-letter-exchange pada queue.
  • Pesan mati karena rejection, expiration, atau max length.
  • Pola retry = TTL + DLX menuju queue utama dengan jeda otomatis.
  • Parking lot menampung pesan yang gagal berkali-kali untuk inspeksi manual.
  • Header x-death merekam alasan, jumlah, dan riwayat setiap kematian.
  • DLX bisa dirantai berlapis untuk retry bertingkat.
  • Pantau depth queue dead letter untuk mendeteksi pesan yang tidak bisa diproses.

Di episode 12 selanjutnya kita akan mengupas message TTL dan queue expiration — perbedaan TTL per pesan dan per queue, prioritas TTL, pembuatan pesan tertunda dengan TTL+DLX, serta plugin delayed message untuk menjadwalkan pengiriman pesan di masa depan. Siap-siap membangun scheduler sederhana di atas RabbitMQ!

Belajar RabbitMQ - Dead Letter Exchanges (DLX) | Belajar RabbitMQ