Routing Key #
Dalam RabbitMQ, producer tidak pernah mengirim pesan langsung ke queue.
Producer mengirim pesan ke exchange.
Namun agar exchange tahu ke mana pesan harus diarahkan, diperlukan satu elemen penting:
Routing key.
Routing key adalah string yang menjadi parameter utama dalam proses routing.
Kesalahan dalam mendesain routing key sering kali menyebabkan:
- Message salah tujuan
- Silent drop
- Coupling yang tidak disadari
- Sulitnya evolusi sistem
Artikel ini membahas routing key secara mendalam dalam konteks desain RabbitMQ production.
“Sebuah pesan tanpa routing key yang tepat seperti surat tanpa alamat — ia mungkin dikirim, tetapi belum tentu sampai.”
Apa Itu Routing Key? #
Routing key adalah string yang dikirim bersama message saat producer melakukan publish ke exchange.
Contoh:
- order.created
- payment.success
- user.registered
Routing key dievaluasi oleh exchange berdasarkan tipe exchange dan binding yang terdaftar.
Routing key bukan metadata opsional.
Ia adalah bagian inti dari mekanisme routing.
Di Mana Routing Key Digunakan? #
Routing key berperan pada:
- Direct exchange
- Topic exchange
Pada fanout exchange, routing key diabaikan.
Pada headers exchange, routing key tidak digunakan untuk matching utama.
Routing Key pada Direct Exchange #
Pada direct exchange, routing key harus cocok secara persis dengan binding key.
1. Diagram Exact Match #
Producer
routing_key = "order.created"
|
v
Direct Exchange
|
binding_key = "order.created"
|
v
Queue
Jika tidak exact match → message tidak dikirim.
Direct exchange cocok untuk:
- Command routing
- Task queue spesifik
Routing Key pada Topic Exchange #
Topic exchange menggunakan pola pencocokan berbasis wildcard.
Wildcard yang tersedia:
- → satu kata
→ nol atau lebih kata #
Contoh routing key:
order.created order.cancelled order.payment.failed
Contoh binding key:
- order.*
- order.#
- *.created
2. Diagram Pattern Matching #
routing_key = "order.payment.failed"
binding_key = "order.#" → match
binding_key = "order.*" → tidak match
binding_key = "#.failed" → match
Topic exchange memberikan fleksibilitas tinggi untuk event-driven architecture.
Struktur Routing Key yang Baik #
Routing key sebaiknya mengikuti pola terstruktur.
Contoh konvensi umum:
..
Contoh:
order.payment.completed user.profile.updated inventory.stock.decreased
Struktur ini memudahkan:
- Pattern matching
- Ekspansi sistem
- Observability
Routing Key sebagai Bagian dari Kontrak #
Dalam sistem event-driven:
- Routing key adalah bagian dari kontrak komunikasi
- Perubahan routing key dapat memengaruhi banyak consumer
Jika routing key diubah sembarangan:
- Consumer bisa berhenti menerima message
- Event tidak terproses
Versioning event sering dilakukan dengan:
order.created.v2
Atau menggunakan header version.
Kesalahan Umum dalam Desain Routing Key #
Terlalu Spesifik #
routing_key = “order.created.us.region.east.production”
Sulit dikelola dan tidak fleksibel.
Terlalu Umum #
routing_key = “event”
Tidak memberikan granularitas untuk routing.
Tidak Konsisten #
order.created orderCreate ORDER_CREATED
Inkonsistensi membuat sistem sulit dipahami dan di-maintain.
Routing Key dan Evolusi Sistem #
Salah satu kekuatan RabbitMQ adalah kemampuan menambahkan consumer baru tanpa mengubah producer.
Ini hanya mungkin jika routing key dirancang dengan baik.
Contoh:
Producer publish:
order.created
Awalnya hanya Payment Service yang subscribe.
Kemudian ditambahkan:
- Notification Service
- Analytics Service
Producer tidak perlu diubah.
Ini karena routing key sudah cukup generik dan bermakna.
Routing Key vs Queue Name #
Routing key bukan queue name.
Walaupun pada default exchange keduanya bisa sama, secara arsitektural:
- Routing key adalah parameter routing
- Queue name adalah entitas penyimpanan
Menyamakan keduanya secara eksplisit bisa menciptakan coupling yang tidak perlu.
Ringkasan #
| Konsep | Penjelasan |
|---|---|
| Routing key | String penentu arah pesan |
| Direct exchange | Exact match |
| Topic exchange | Pattern match dengan wildcard |
| Struktur | Domain.Entity.Action |
| Best practice | Konsisten dan terstruktur |
Penutup #
Routing key adalah alamat logis dalam sistem messaging RabbitMQ.
Ia menentukan:
- Siapa yang menerima message
- Seberapa fleksibel sistem berkembang
- Seberapa mudah sistem dipelihara
Desain routing key yang baik adalah investasi jangka panjang dalam arsitektur event-driven.
Karena dalam sistem asynchronous, satu string kecil dapat menentukan arah seluruh aliran data.