Topic #
Jika direct exchange menawarkan kepastian, dan fanout menawarkan broadcast total, maka topic exchange menawarkan fleksibilitas.
Topic exchange adalah tipe exchange yang paling sering digunakan dalam arsitektur event-driven modern.
Ia memungkinkan routing berbasis pola (pattern matching), sehingga satu producer dapat melayani banyak kebutuhan subscriber tanpa perubahan kode.
Artikel ini membahas topic exchange secara mendalam dalam konteks desain sistem RabbitMQ production.
“Ketika sistem mulai tumbuh, routing berbasis exact match tidak lagi cukup — kita membutuhkan bahasa untuk menggambarkan pola peristiwa.”
Apa Itu Topic Exchange? #
Topic exchange merutekan message berdasarkan pola pencocokan antara:
- routing key (dari producer)
- binding key (yang dapat mengandung wildcard)
Wildcard yang tersedia:
*→ mencocokkan tepat satu kata#→ mencocokkan nol atau lebih kata
Routing key biasanya dipisahkan oleh tanda titik (.).
Contoh:
order.created order.payment.failed user.profile.updated
Cara Kerja Topic Exchange #
1. Diagram Pattern Matching #
Producer
routing_key = "order.payment.failed"
|
v
Topic Exchange
|
binding_key = "order.#" → match
binding_key = "order.*" → tidak match
binding_key = "#.failed" → match
|
v
Queue(s)
Topic exchange mengevaluasi routing key terhadap setiap binding key.
Jika cocok, message dikirim ke queue terkait.
Struktur Routing Key yang Ideal #
Topic exchange bekerja optimal jika routing key memiliki struktur yang konsisten.
Format umum yang direkomendasikan:
..
Contoh:
order.payment.completed order.shipment.delayed user.authentication.failed
Struktur ini memungkinkan fleksibilitas maksimal dalam binding.
Contoh Desain Event-Driven System #
Misalkan producer mem-publish:
order.created order.cancelled order.payment.failed
Queue A (Payment Service):
binding_key = “order.payment.*”
Queue B (Analytics):
binding_key = “order.#”
Queue C (Notification):
binding_key = “#.failed”
Satu event dapat didistribusikan secara selektif sesuai kebutuhan.
Perbandingan Topic dengan Direct dan Fanout #
| Aspek | Direct | Fanout | Topic |
|---|---|---|---|
| Matching | Exact | Tidak ada | Pattern |
| Wildcard | Tidak | Tidak | Ya (*, #) |
| Fleksibilitas | Rendah | Rendah | Tinggi |
| Cocok untuk | Command | Broadcast global | Event domain |
Topic exchange berada di tengah antara presisi dan fleksibilitas.
Kelebihan Topic Exchange #
Fleksibilitas Tinggi #
Subscriber dapat memilih subset event tanpa mengubah producer.
Evolusi Sistem Lebih Mudah #
Service baru dapat ditambahkan dengan binding tertentu tanpa mengganggu sistem.
Cocok untuk Bounded Context #
Setiap domain dapat memiliki exchange sendiri, dengan routing key terstruktur.
Risiko dan Kompleksitas #
Overlapping Binding #
Binding seperti:
order.# #.created
Dapat menyebabkan message masuk ke queue yang tidak diharapkan.
Desain harus eksplisit dan terdokumentasi.
Wildcard Terlalu Luas #
Binding # saja berarti semua event masuk ke queue tersebut.
Ini bisa menyebabkan beban tidak terkontrol.
Kesalahan Penamaan Routing Key #
Jika routing key tidak konsisten, pattern matching menjadi tidak efektif.
Topic Exchange dan Scalability #
Karena routing dilakukan berdasarkan evaluasi pattern:
- Overhead sedikit lebih tinggi dibanding direct
- Namun tetap sangat efisien untuk sebagian besar workload
Dalam sistem dengan event domain besar, topic exchange biasanya menjadi pilihan utama.
Best Practice Desain Topic Exchange #
Gunakan Struktur Domain yang Konsisten #
Contoh:
..
Hindari Wildcard Global Tanpa Alasan #
Binding seperti # harus digunakan dengan sangat hati-hati.
Dokumentasikan Kontrak Routing Key #
Routing key adalah bagian dari API antar service.
Perubahan harus backward compatible.
Ringkasan #
| Konsep | Penjelasan |
|---|---|
| Topic exchange | Routing berbasis pola |
* | Satu kata |
# | Nol atau lebih kata |
| Cocok untuk | Event-driven architecture |
| Risiko | Overlapping pattern |
Penutup #
Topic exchange adalah jantung dari banyak sistem event-driven berbasis RabbitMQ.
Ia memberikan:
- Fleksibilitas
- Evolusi tanpa coupling
- Kontrol granular terhadap distribusi event
Namun fleksibilitas selalu datang dengan tanggung jawab desain.
Routing key yang tidak terstruktur akan merusak manfaat topic exchange.
Dalam arsitektur messaging yang matang, topic exchange bukan sekadar fitur — ia adalah bahasa yang digunakan sistem untuk berbicara tentang peristiwa.