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.

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.
Ada tiga komponen yang menentukan pencocokan topic:
* (bintang) mencocokkan tepat satu kata — kata tidak boleh berisi titik.# (pagar) mencocokkan nol atau lebih kata.orders mencocokkan dirinya sendiri secara literal."log.*.error" → cocok: log.api.error, log.worker.error
"log.#" → cocok: log, log.api, log.api.error
"*.new.*" → cocok: orders.new.eu, payments.new.usAturan yang harus diingat: * tidak bisa menembus titik, sedangkan # bisa. Binding log.# menerima semua pesan berawalan log., berapa pun kedalaman topiknya.
Mari praktikkan. Kita buat exchange topic untuk routing log dengan pola log.<severity>.<module>:
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.*.apiBinding 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.
Kekuatan topic exchange muncul saat kalian memakai kombinasi pola pada satu queue. Sebuah queue bisa menerima pesan dari beberapa pola sekaligus:
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.
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 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.
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.
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.channel.basic_publish(
exchange="header_ex",
routing_key="",
body=b"pesan penting",
properties=pika.BasicProperties(headers={"severity": "critical", "source": "guest"}),
)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.
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.x-match: all menuntut semua kriteria; any cukup satu.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!