Belajar RabbitMQ - Advanced Routing - Topics & Patterns
Episode 7 of 33

Belajar RabbitMQ - Advanced Routing - Topics & Patterns

Topic exchange membuka routing berbasis pola dengan wildcard. Di episode ini kalian menguasai aturan bintang dan pagar, merancang hierarki topik untuk routing log berdasarkan severity dan modul, serta mengenal headers exchange dengan aturan x-match all dan any.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

Direct exchange membutuhkan pencocokan key yang persis, dan fanout tidak bisa menyaring sama sekali. Di antara keduanya ada topic exchange — exchange paling fleksibel yang mencocokkan routing key dengan pola wildcard. Dengan topic, satu exchange bisa melayani routing multi-kriteria tanpa perlu membuat exchange baru.

Wildcard topic bekerja seperti pola penamaan bertitik: orders.new.europe, log.warning.auth, sensor.suhu.dapur. Producer memberi routing key bertitik, dan binding key berisi pola dengan dua simbol khusus: * untuk satu kata, dan # untuk nol atau banyak kata. Kombinasi keduanya menghasilkan sistem routing yang sangat ekspresif.

Episode ini juga memperkenalkan headers exchange, exchange yang mengabaikan routing key dan mencocokkan berdasarkan pasangan key-value pada header pesan. Setelah episode ini, kalian akan mampu merancang topologi routing yang rapi dan mudah dipelihara untuk sistem berskala besar.

Topic Exchange Deep Dive

Aturan Wildcard Bintang dan Pagar

Ada tiga komponen yang menentukan pencocokan topic:

  • * (bintang) mencocokkan tepat satu kata — kata tidak boleh berisi titik.
  • # (pagar) mencocokkan nol atau lebih kata.
  • Kata biasa seperti orders mencocokkan dirinya sendiri secara literal.
Contoh pola topic
"log.*.error"   → cocok: log.api.error, log.worker.error
"log.#"         → cocok: log, log.api, log.api.error
"*.new.*"       → cocok: orders.new.eu, payments.new.us

Aturan yang harus diingat: * tidak bisa menembus titik, sedangkan # bisa. Binding log.# menerima semua pesan berawalan log., berapa pun kedalaman topiknya.

Membangun Routing dengan Topic Exchange

Mari praktikkan. Kita buat exchange topic untuk routing log dengan pola log.<severity>.<module>:

Deklarasi topic exchange dan binding
rabbitmqadmin declare exchange name=log_topic type=topic
rabbitmqadmin declare queue name=q_error durable=true
rabbitmqadmin declare queue name=q_api durable=true
rabbitmqadmin declare binding source=log_topic destination=q_error routing_key=log.error.*
rabbitmqadmin declare binding source=log_topic destination=q_api routing_key=log.*.api

Binding log.error.* mengirim semua log dengan severity error ke q_error, sedangkan log.*.api mengirim semua log dari modul api ke q_api. Pesan yang memenuhi dua-duanya akan digandakan.

Routing Patterns

Multi-Kriteria dan Hierarki Topik

Kekuatan topic exchange muncul saat kalian memakai kombinasi pola pada satu queue. Sebuah queue bisa menerima pesan dari beberapa pola sekaligus:

PythonPublish dengan routing key hierarkis
channel.basic_publish(
    exchange="log_topic",
    routing_key="log.warning.auth",
    body=b'{"pesan":"login gagal 3x"}',
)

Pesan dengan routing key log.warning.auth akan masuk ke queue yang di-binding dengan log.warning.*, log.#, atau log.*.auth, tergantung pola binding-nya. Hierarki topik ini membuat penambahan kategori baru tidak membutuhkan perubahan kode producer — cukup tambah binding.

Event Categorization dan Dynamic Routing

Pattern yang umum dipakai di industri e-commerce: topik order.created, order.paid, order.shipped, dan order.cancelled. Analitik cukup meng-binding order.# untuk melihat semua event, sementara layanan shipping hanya meng-binding order.shipped. Producer tidak perlu tahu siapa yang menyimak — routing sepenuhnya dikendalikan binding.

Headers Exchange

Routing Berbasis Header

Headers exchange mencocokkan pesan berdasarkan headers (key-value) yang dikirim bersama pesan, bukan routing key. Setiap binding pada headers exchange mendeklarasikan argumen yang harus cocok dengan header pesan.

Binding headers exchange
rabbitmqadmin declare exchange name=header_ex type=headers
rabbitmqadmin declare queue name=critical_guest durable=true
rabbitmqadmin declare binding source=header_ex destination=critical_guest \
  arguments='{"x-match":"all","severity":"critical","source":"guest"}'

Pesan hanya masuk ke critical_guest jika memenuhi semua kriteria binding, karena x-match diset all.

x-match: all vs any

Dua mode pencocokan headers exchange:

  • x-match: all — pesan harus cocok dengan semua header yang dideklarasikan di binding.
  • x-match: any — pesan cukup cocok dengan salah satu header.
PythonPublish dengan headers
channel.basic_publish(
    exchange="header_ex",
    routing_key="",
    body=b"pesan penting",
    properties=pika.BasicProperties(headers={"severity": "critical", "source": "guest"}),
)

Pertimbangan Performa Headers

Headers exchange memakai evaluasi per-message yang lebih berat dibandingkan topic, karena broker harus membandingkan seluruh header setiap pesan. Untuk beban routing sederhana berbasis satu atribut, topic exchange lebih efisien dan lebih mudah dipahami. Gunakan headers hanya saat routing membutuhkan banyak kriteria sekaligus.

Tip

Standar industri: konvensi penamaan topik menggunakan kata benda dan kata kerja dalam bentuk lampau, seperti order.created atau payment.failed. Konsistensi penamaan menentukan mudah tidaknya sistem dipahami tim.

Penutup

Di episode 7 ini kalian sudah menguasai topic exchange dengan wildcard * dan #, merancang hierarki topik untuk routing multi-kriteria seperti log berdasarkan severity dan modul, serta memahami headers exchange dengan x-match all dan any.

Inti yang harus dibawa pulang:

  • * mencocokkan satu kata; # mencocokkan nol atau lebih kata.
  • Routing key bertitik adalah konvensi standar topic exchange.
  • Satu queue bisa ter-binding dengan banyak pola sekaligus.
  • Producer tidak perlu tahu konsumen — routing dikendalikan binding.
  • Headers exchange mencocokkan header, bukan routing key.
  • x-match: all menuntut semua kriteria; any cukup satu.
  • Topic lebih efisien dan mudah dipahami daripada headers untuk kasus umum.

Di episode 8 selanjutnya kita akan membangun RPC pattern dengan RabbitMQ — memakai correlation id dan reply-to queue untuk meminta komputasi ke layanan lain dan menunggu jawabannya, termasuk fitur Direct Reply-To dan panduan kapan sebaiknya tidak memakai pola ini. Siapkan dua terminal, karena kalian akan menulis client dan server RPC!

Belajar RabbitMQ - Advanced Routing - Topics & Patterns | Belajar RabbitMQ