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.

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.
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.
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=errorPerintah rabbitmqadmin declare binding di atas hanya akan meneruskan pesan ber-routing key error ke error_queue.
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 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 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 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:
publish(exchange, routing_key, message)
│
▼
exchange (tipe menentukan pencocokan)
│ cocok dengan binding key
▼
queue → consumerrouting_key == binding_key.routing_key dicocokkan pola dengan binding key.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 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.
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.
Pola publish/subscribe membuat pesan diterima oleh semua subscriber. Di RabbitMQ, pola ini diimplementasikan dengan fanout exchange:
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.
Setiap subscriber harus punya queue sendiri, dan biasanya queue temporary yang dihapus otomatis saat consumer berhenti:
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.
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:
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!