Routing & Binding #
Dalam lifecycle RabbitMQ, setelah message dipublish, tahap berikutnya adalah:
Routing dan Binding evaluation.
Di sinilah broker menjawab pertanyaan krusial:
- Ke queue mana pesan ini harus dikirim?
- Apakah pesan ini punya tujuan?
- Atau ia harus dibuang?
Tahap ini sepenuhnya terjadi di dalam broker, dan sangat menentukan reliability serta arsitektur sistem.
Artikel ini membahas routing & binding sebagai fase kedua dalam message lifecycle RabbitMQ.
“Sebuah pesan tidak pernah ‘datang begitu saja’ ke queue — ia sampai ke sana karena serangkaian aturan yang secara eksplisit memutuskan nasibnya.”
Posisi Routing dalam Message Lifecycle #
1. Diagram Lifecycle hingga Routing #
Producer
|
| publish
v
Exchange
|
| routing & binding evaluation
v
Queue(s)
Setelah broker menerima message dan memvalidasi exchange, ia akan:
- Mengambil semua binding yang terdaftar pada exchange
- Mengevaluasi routing key (atau header)
- Menentukan queue tujuan
Routing terjadi sebelum message masuk ke queue.
Peran Exchange dalam Routing #
Exchange bertindak sebagai router.
Namun exchange tidak menyimpan aturan secara internal tanpa konteks.
Aturan routing sebenarnya berasal dari:
Binding antara exchange dan queue.
Exchange hanya mengevaluasi binding tersebut.
Binding sebagai Aturan Routing #
Binding adalah relasi yang menghubungkan:
- Exchange
- Queue
Binding mendefinisikan kondisi kapan message dikirim ke queue.
Binding biasanya memiliki:
- Binding key (untuk direct/topic)
- Header rule (untuk headers exchange)
Tanpa binding, exchange tidak memiliki rute.
Evaluasi Routing Berdasarkan Tipe Exchange #
Routing sangat bergantung pada tipe exchange.
Direct Exchange Routing #
- Exact match antara routing key dan binding key
Contoh:
routing_key = “payment.success” binding_key = “payment.success”
Jika sama persis → kirim ke queue.
Jika tidak → tidak dirutekan.
Topic Exchange Routing #
- Pattern match menggunakan wildcard
Wildcard:
*→ satu kata#→ nol atau lebih kata
Contoh:
routing_key = “order.payment.failed” binding_key = “order.#” → match binding_key = “order.*” → tidak match
Topic exchange memungkinkan satu message masuk ke banyak queue.
Fanout Exchange Routing #
- Mengabaikan routing key
- Mengirim ke semua queue yang ter-binding
Tidak ada evaluasi kondisi.
Headers Exchange Routing #
- Mengevaluasi header key-value
- Menggunakan x-match = all / any
Routing berbasis metadata, bukan string.
Multiple Match dan Duplikasi #
Satu message dapat:
- Cocok dengan satu binding
- Cocok dengan beberapa binding
- Tidak cocok dengan binding mana pun
Jika cocok dengan beberapa binding:
- Message dikirim ke semua queue tersebut
Setiap queue menerima salinan message.
Unroutable Message #
Jika tidak ada binding yang cocok:
- Message dibuang (default)
- Atau dikembalikan ke producer jika mandatory=true
Unroutable message adalah salah satu risiko terbesar dalam desain yang tidak terkontrol.
Routing dalam Cluster dan Quorum Queue #
Routing selalu terjadi di node tempat exchange berada.
Jika queue adalah quorum queue:
- Setelah routing, message dikirim ke leader
- Direplikasi ke follower
- Commit setelah mayoritas setuju
Artinya routing dan replication adalah dua tahap berbeda dalam lifecycle.
Dampak Desain Routing terhadap Arsitektur #
Desain routing menentukan:
- Seberapa fleksibel sistem berkembang
- Seberapa mudah menambah subscriber baru
- Seberapa besar risiko silent drop
Routing yang baik memungkinkan:
- Producer tetap stabil
- Subscriber bisa berubah
- Sistem tetap loosely coupled
Kesalahan Umum #
Tidak Mendokumentasikan Routing Key #
Subscriber baru bisa salah binding.
Overlapping Topic Binding Tanpa Disadari #
Wildcard terlalu luas menyebabkan message masuk ke queue tak terduga.
Tidak Menggunakan Mandatory Flag #
Message hilang tanpa terlihat.
Best Practice Production #
Gunakan Naming Convention Konsisten #
Contoh:
..
Dokumentasikan Kontrak Routing #
Routing key adalah bagian dari API antar service.
Monitor Unroutable Message #
Pantau metric return rate.
Ringkasan #
| Tahap | Fungsi |
|---|---|
| Exchange | Router |
| Binding | Aturan routing |
| Routing key | Parameter publish |
| Matching | Tergantung tipe exchange |
| Unroutable | Dibuang atau dikembalikan |
Penutup #
Routing dan binding adalah jantung dari fleksibilitas RabbitMQ.
Pada tahap inilah ditentukan apakah pesan:
- Sampai ke tujuan
- Disalin ke banyak subscriber
- Atau hilang tanpa jejak
Dalam message lifecycle, routing bukan sekadar proses teknis — ia adalah keputusan arsitektural yang menentukan bagaimana sistem bereaksi terhadap setiap peristiwa.
Dan seperti semua keputusan arsitektur, ia harus dirancang dengan kesadaran penuh, bukan kebetulan konfigurasi.