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 #

AspekDirectFanoutTopic
MatchingExactTidak adaPattern
WildcardTidakTidakYa (*, #)
FleksibilitasRendahRendahTinggi
Cocok untukCommandBroadcast globalEvent 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 #

KonsepPenjelasan
Topic exchangeRouting berbasis pola
*Satu kata
#Nol atau lebih kata
Cocok untukEvent-driven architecture
RisikoOverlapping 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.

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact