Exchange #
Jika queue adalah tempat pesan menunggu, maka exchange adalah komponen yang menentukan ke mana pesan akan dikirim.
Banyak kesalahan desain RabbitMQ berasal dari kesalahpahaman tentang exchange.
Producer tidak pernah mengirim pesan langsung ke queue.
Producer selalu mengirim ke exchange.
Exchange-lah yang memutuskan bagaimana pesan dirutekan.
Artikel ini membahas exchange secara mendalam dalam konteks desain sistem production.
“Dalam sistem messaging, mengirim pesan itu mudah. Yang sulit adalah memastikan pesan sampai ke tempat yang tepat, pada waktu yang tepat, dengan pola yang tepat.”
Apa Itu Exchange? #
Exchange adalah komponen RabbitMQ yang:
- Menerima message dari producer
- Mengevaluasi routing rule
- Mendistribusikan message ke satu atau lebih queue
Exchange tidak menyimpan message.
Ia hanya melakukan routing.
Setelah routing selesai, message berada di queue.
Alur Routing Message #
1. Diagram Producer → Exchange → Queue #
Producer
|
| publish(routing_key)
v
Exchange
|
| match rule
v
Queue(s)
Exchange menggunakan:
- Routing key
- Binding rule
- Exchange type
Untuk menentukan ke mana message dikirim.
Mengapa Exchange Penting? #
Tanpa exchange, producer harus tahu queue mana yang dituju.
Itu akan menciptakan tight coupling.
Dengan exchange:
- Producer hanya tahu exchange name
- Queue bisa ditambah atau diubah tanpa mengubah producer
Ini adalah bentuk decoupling struktural.
Tipe-Tipe Exchange #
RabbitMQ memiliki beberapa tipe exchange utama.
Direct Exchange #
Direct exchange merutekan message berdasarkan exact match antara routing key dan binding key.
Contoh:
- routing_key = “order.created”
- binding_key = “order.created”
Jika cocok → message masuk queue.
Cocok untuk:
- Routing spesifik
- Task distribution sederhana
Fanout Exchange #
Fanout exchange mengirim message ke semua queue yang terikat (binding) tanpa memperhatikan routing key.
Cocok untuk:
- Broadcast event
- Notifikasi ke banyak service
Semua subscriber menerima message.
Topic Exchange #
Topic exchange mendukung pattern matching dengan wildcard.
Contoh binding key:
- order.*
- order.#
Wildcard:
- → satu kata
→ nol atau lebih kata #
Cocok untuk:
- Event-driven architecture
- Routing fleksibel berdasarkan domain
Headers Exchange #
Routing berdasarkan header key-value, bukan routing key string.
Cocok untuk:
- Routing kompleks
- Multi-attribute filtering
Namun lebih jarang digunakan dibanding topic.
Default Exchange #
RabbitMQ memiliki default exchange dengan nama kosong ("").
Karakteristik:
- Direct exchange bawaan
- Binding otomatis ke queue dengan nama queue sebagai routing key
Memungkinkan publish langsung ke queue secara implisit.
Namun secara arsitektural, lebih baik mendefinisikan exchange eksplisit.
Binding: Penghubung Exchange dan Queue #
Binding adalah aturan yang menghubungkan exchange ke queue.
Binding terdiri dari:
- Binding key
- (Opsional) argument tambahan
Exchange membaca binding untuk menentukan routing.
Tanpa binding, message tidak akan sampai ke queue.
Routing Failure dan Mandatory Flag #
Jika exchange tidak menemukan queue yang cocok:
- Message bisa dibuang
- Atau dikembalikan ke producer (jika mandatory=true)
Desain sistem harus mempertimbangkan skenario ini.
Silent drop adalah salah satu bug paling berbahaya dalam sistem messaging.
Exchange dalam Desain Event-Driven #
Best practice umum:
- Gunakan satu exchange per bounded context
- Gunakan topic exchange untuk fleksibilitas
- Hindari membuat terlalu banyak exchange tanpa struktur
Contoh desain:
- exchange: order.events
- routing_key: order.created
- routing_key: order.cancelled
Service baru bisa subscribe tanpa mengubah producer.
Exchange Tidak Menyimpan State Pesan #
Exchange tidak:
- Menyimpan backlog
- Mengelola unacked message
- Menangani retry
Semua itu adalah tanggung jawab queue.
Memahami peran ini mencegah kesalahan arsitektural.
Ringkasan #
| Komponen | Peran |
|---|---|
| Exchange | Routing message |
| Routing key | Parameter pencocokan |
| Binding | Aturan penghubung |
| Direct | Exact match |
| Fanout | Broadcast |
| Topic | Pattern-based routing |
| Headers | Header-based routing |
Penutup #
Exchange adalah mesin routing dalam RabbitMQ.
Ia memungkinkan:
- Decoupling
- Fleksibilitas
- Evolusi sistem tanpa mengubah producer
Tanpa memahami exchange, kita hanya melihat RabbitMQ sebagai queue sederhana.
Padahal kekuatan sebenarnya terletak pada bagaimana pesan dirutekan.
Dalam arsitektur messaging yang matang, desain exchange sama pentingnya dengan desain database schema.