Belajar RabbitMQ - Exchanges & Routing Patterns
Episode 6 of 33

Belajar RabbitMQ - Exchanges & Routing Patterns

Exchange adalah router yang menentukan ke mana pesan pergi. Di episode ini kalian mempelajari lima tipe exchange: direct, fanout, topic, headers, dan default, beserta routing key, binding key, exchange-to-exchange binding, alternate exchanges, dan implementasi pola publish/subscribe.

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

Pendahuluan

Di episode 4, kalian mem-publish ke queue lewat routing key tanpa memahami kenapa itu bekerja. Rahasianya: kalian memakai default exchange yang secara otomatis mengirim pesan ke queue dengan nama sama dengan routing key. Sekarang waktunya membuka kotak yang sebenarnya — exchange.

Exchange adalah router RabbitMQ. Producer tidak pernah mengirim pesan langsung ke queue; mereka selalu mem-publish ke exchange, dan exchange yang menentukan pesan itu masuk ke queue mana berdasarkan tipe dan binding-nya. Pilihan tipe exchange menentukan tingkat fleksibilitas routing yang bisa kalian capai.

Episode ini memperkenalkan kelima tipe exchange, cara kerja routing key dan binding key, fitur lanjutan seperti exchange-to-exchange binding dan alternate exchanges, lalu menutup dengan implementasi pola publish/subscribe menggunakan fanout exchange — pola paling mendasar untuk broadcasting pesan.

Exchange Types

Direct Exchange

Direct exchange mengirim pesan ke queue yang binding key-nya persis sama dengan routing key pesan. Ini mirip dengan pengiriman surat ke alamat spesifik. Contoh: routing key errors hanya masuk ke queue yang di-binding dengan key errors.

Deklarasi direct exchange dan binding
rabbitmqadmin declare exchange name=logs_direct type=direct
rabbitmqadmin declare queue name=error_queue durable=true
rabbitmqadmin declare binding source=logs_direct destination=error_queue routing_key=error

Perintah rabbitmqadmin declare binding di atas hanya akan meneruskan pesan ber-routing key error ke error_queue.

Fanout Exchange

Fanout exchange mengabaikan routing key sepenuhnya dan mengirim salinan pesan ke semua queue yang ter-binding padanya. Ini adalah dasar pola publish/subscribe. Cocok untuk broadcasting seperti notifikasi real-time ke semua pengguna.

Topic Exchange dan Headers Exchange

Topic exchange mencocokkan routing key dengan pola wildcard * dan # — akan kita bedah mendalam di episode 7. Headers exchange mengabaikan routing key dan mencocokkan berdasarkan headers pesan, dengan aturan x-match: all atau x-match: any.

Default Exchange

Default exchange adalah exchange langsung tanpa nama ("") yang otomatis ada di setiap vhost. Semua queue ter-binding ke default exchange dengan routing key sama dengan nama queue. Ini sebabnya channel.basic_publish(exchange="", routing_key="task_queue", ...) bekerja tanpa deklarasi exchange.

Routing Mechanisms

Routing Key dan Binding Key

Routing key adalah atribut pesan yang diberikan producer saat publish. Binding key adalah atribut binding yang dipasang saat menghubungkan exchange dan queue. Keduanya digunakan oleh exchange untuk menentukan routing. Aturan mainnya:

Peran routing key dan binding key
publish(exchange, routing_key, message)


  exchange (tipe menentukan pencocokan)
       │  cocok dengan binding key

      queue → consumer
  • Direct: routing_key == binding_key.
  • Fanout: semua queue dapat pesan, key diabaikan.
  • Topic: routing_key dicocokkan pola dengan binding key.
  • Headers: berdasarkan header, key diabaikan.

Exchange-to-Exchange Binding

RabbitMQ mengizinkan exchange di-binding ke exchange lain. Pesan yang masuk ke exchange A bisa diteruskan ke exchange B sesuai aturannya. Ini memungkinkan membangun topologi routing yang kompleks dan hirarkis tanpa mengubah producer.

Alternate Exchange

Alternate exchange adalah fallback: jika sebuah pesan tidak bisa di-routing oleh exchange utama (tidak ada queue yang cocok), pesan diteruskan ke alternate exchange sebagai pengganti dihilangkan begitu saja.

Pasang alternate exchange
rabbitmqadmin declare exchange name=unroutable type=fanout
rabbitmqadmin declare exchange name=main type=direct arguments='{"alternate-exchange":"unroutable"}'

Dengan konfigurasi di atas, pesan yang gagal di-routing oleh exchange main akan masuk ke fanout unroutable, tempat kalian bisa memantau pesan liar.

Publish/Subscribe Pattern

Broadcast dengan Fanout

Pola publish/subscribe membuat pesan diterima oleh semua subscriber. Di RabbitMQ, pola ini diimplementasikan dengan fanout exchange:

PythonPublisher fanout (pika)
import pika
 
connection = pika.BlockingConnection(pika.ConnectionParameters("localhost"))
channel = connection.channel()
channel.exchange_declare(exchange="notifikasi", exchange_type="fanout")
 
channel.basic_publish(exchange="notifikasi", routing_key="", body=b"berita terbaru")
print("pesan di-broadcast")
connection.close()

Perhatikan routing_key="" — fanout mengabaikan routing key. Semua queue yang terikat ke exchange notifikasi akan menerima pesan ini.

Temporary Queues untuk Consumer

Setiap subscriber harus punya queue sendiri, dan biasanya queue temporary yang dihapus otomatis saat consumer berhenti:

PythonConsumer dengan temporary queue
result = channel.queue_declare(queue="", exclusive=True)
queue_name = result.method.queue
channel.queue_bind(exchange="notifikasi", queue=queue_name)

Perintah channel.queue_declare(queue="", exclusive=True) membuat queue unik dengan nama random, dan exclusive=True memastikan queue terhapus saat connection ditutup. Pola inilah yang dipakai untuk broadcast ke banyak consumer dengan benar.

Tip

Selalu tanyakan dua hal sebelum memilih exchange: berapa banyak consumer yang harus menerima pesan yang sama? Jika semua, pakai fanout. Jika hanya yang cocok dengan kriteria, pakai direct atau topic.

Penutup

Di episode 6 ini kalian sudah memahami peran exchange sebagai router, membandingkan kelima tipe exchange, menguasai routing key dan binding key, serta membangun pola publish/subscribe dengan fanout exchange dan temporary queue.

Inti yang harus dibawa pulang:

  • Producer selalu mem-publish ke exchange, bukan langsung ke queue.
  • Direct mencocokkan key persis; fanout membroadcast ke semua.
  • Topic mencocokkan pola wildcard; headers mencocokkan header pesan.
  • Default exchange menyaru queue sebagai routing key.
  • Alternate exchange menangkap pesan yang gagal di-routing.
  • Publish/subscribe = fanout + satu queue eksklusif per consumer.
  • Exchange-to-exchange binding memungkinkan topologi routing kompleks.

Di episode 7 selanjutnya kita akan mendalami advanced routing dengan topic exchange — wildcard bintang dan pagar, desain hierarki topik, serta headers exchange dengan x-match. Ini akan membuat kalian mampu merancang sistem routing multi-kriteria seperti routing log berdasarkan severity dan modul!