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.

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.
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:
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=deadJika 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.
Tiga pemicu pesan masuk DLX:
basic.reject atau basic.nack dengan requeue=False.x-overflow=drop-head mengeluarkan pesan tertua.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.
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 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:
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.
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:
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.
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.
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:
x-dead-letter-exchange pada queue.x-death merekam alasan, jumlah, dan riwayat setiap kematian.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!