Waktu adalah aspek penting dalam sistem pesan. Di episode ini kalian mengatur message TTL per pesan dan per queue, memahami prioritas TTL dan penanganan pesan kedaluwarsa, mengeksplorasi queue expiration, serta menjadwalkan pesan tertunda dengan pola TTL+DLX dan plugin delayed message.

Tidak semua pesan layak hidup selamanya. Sebuah notifikasi reset password yang tidak terkirim dalam 10 menit tidak lagi berguna; sebuah event kedaluwarsa yang menumpuk di queue hanya akan memperlambat sistem. Di sinilah Time-To-Live (TTL) berperan — batas umur yang membuat pesan "mati" dengan sendirinya.
TTL bisa diterapkan di dua level: per pesan lewat properti expiration, atau per queue lewat argumen x-message-ttl. Masing-masing punya semantik dan prioritas yang berbeda, dan pemahaman ini penting untuk merancang perilaku kedaluwarsa yang tepat.
Episode ini juga membahas queue expiration untuk queue sementara, lalu cara paling menarik: membangun delayed messaging — mengirim pesan yang baru boleh diproses beberapa menit atau jam kemudian — dengan kombinasi TTL+DLX maupun plugin rabbitmq_delayed_message_exchange.
TTL per pesan diatur lewat properti expiration (dalam milidetik):
properties = pika.BasicProperties(expiration="30000")
channel.basic_publish(exchange="notif", routing_key="email",
body=b"reset password", properties=properties)Sedangkan TTL per queue diatur sekali saat deklarasi:
rabbitmqadmin declare queue name=otp_queue \
arguments='{"x-message-ttl":60000}'Perintah rabbitmqadmin declare queue di atas membuat semua pesan di otp_queue kedaluwarsa setelah 60 detik.
Jika sebuah pesan punya expiration sendiri dan queue-nya juga punya x-message-ttl, maka nilai terkecil yang berlaku. Aturan ini penting: TTL per pesan bisa lebih pendek (menghidupkan pesan lebih singkat) tapi tidak pernah lebih panjang dari TTL queue.
Pesan yang kedaluwarsa dihapus dari queue dan, jika dikonfigurasi, diteruskan ke DLX (bukan di-requeue). Perhatikan bahwa TTL hanya dihitung selama pesan berada di queue — pesan yang sedang dipegang consumer tidak dihitung. Karena itu, pastikan TTL tidak lebih pendek dari waktu proses yang dibutuhkan consumer.
Warning
RabbitMQ memeriksa TTL hanya pada pesan yang berada di kepala queue. Jika sebuah pesan ber-TTL pendek terkubur di belakang antrean panjang, kedaluwarsanya bisa tertunda — ini disebut expired-first problem. Hindari mencampur pesan ber-TTL sangat berbeda dalam satu queue.
Argumen x-expires menghapus queue otomatis jika queue tidak digunakan selama durasi tertentu — tidak ada consumer, tidak ada publish, dan tidak ada get. Waktu dihitung dalam milidetik:
rabbitmqadmin declare queue name=temp_ingest \
arguments='{"x-expires":600000}'Fitur ini sangat berguna untuk queue sementara seperti callback queue RPC yang hanya dibutuhkan saat sesi berlangsung. Queue dihapus beserta seluruh pesan di dalamnya, jadi pastikan tidak ada data penting.
Kombinasi auto_delete, exclusive, dan x-expires cocok untuk: queue callback RPC, queue per-request pada operasi batch, dan topologi event yang hanya dibutuhkan dalam jangka waktu tertentu.
RabbitMQ tidak punya fitur delay native pada versi klasik, tapi bisa disimulasikan: publish pesan ke queue dengan x-message-ttl, lalu setelah TTL habis pesan di-routing ulang ke queue tujuan lewat DLX. Hasilnya: pesan baru diproses setelah jeda yang diinginkan.
rabbitmqadmin declare exchange name=jobs.dlx type=direct
rabbitmqadmin declare queue name=jobs.delay \
arguments='{"x-message-ttl":300000,"x-dead-letter-exchange":"jobs.dlx","x-dead-letter-routing-key":"go"}'
rabbitmqadmin declare queue name=jobs.main durable=true
rabbitmqadmin declare binding source=jobs.dlx destination=jobs.main routing_key=goPesan yang masuk jobs.delay akan "tidur" 5 menit, lalu diteruskan ke jobs.main.
Untuk delay yang lebih fleksibel (satu exchange untuk banyak durasi delay), gunakan plugin rabbitmq_delayed_message_exchange:
rabbitmq-plugins enable rabbitmq_delayed_message_exchangeLalu deklarasikan exchange bertipe x-delayed-message dan kirim pesan dengan header delay:
channel.exchange_declare(
exchange="delayed", exchange_type="x-delayed-message",
arguments={"x-delayed-type": "direct"},
)
properties = pika.BasicProperties(headers={"x-delay": 10000})
channel.basic_publish(exchange="delayed", routing_key="tasks",
body=b"proses nanti", properties=properties)Header x-delay dalam milidetik membuat pesan baru diteruskan ke binding setelah 10 detik. Plugin ini didukung banyak client SDK, tapi perlu diingat bahwa queue harus tetap hidup selama delay berlangsung.
Di episode 12 ini kalian sudah menguasai message TTL per pesan dan per queue, prioritas TTL terkecil yang berlaku, penanganan pesan kedaluwarsa, queue expiration dengan x-expires, serta dua pendekatan delayed messaging: pola TTL+DLX dan plugin delayed message exchange.
Inti yang harus dibawa pulang:
expiration; TTL per queue lewat x-message-ttl.x-expires menghapus queue yang tidak digunakan dalam durasi tertentu.rabbitmq_delayed_message_exchange menyediakan delay fleksibel per pesan.Di episode 13 selanjutnya kita akan mengatur virtual hosts dan multi-tenancy — memisahkan resource dalam satu instance RabbitMQ, membuat vhost per environment dan per tenant, mengatur akses per vhost, serta strategi naming, monitoring, dan backup untuk setiap vhost. Ini fondasi isolasi tenancy di RabbitMQ!