Kodeloka
  1. Kodeloka
  2. Kelas RabbitMQ
  3. Materi

Modul 3 · Modul 3 dari 15

Empat Tipe Exchange dan Cara Memilihnya

Menguasai direct, fanout, topic, dan headers — serta pola binding yang membuat topologi tetap sederhana saat sistem tumbuh.

Empat Tipe, Empat Pertanyaan

TipeAturan pencocokanPertanyaan yang dijawab
directrouting key sama persis"Kirim ke satu tujuan tertentu"
fanoutabaikan routing key, kirim ke semua"Semua orang perlu tahu"
topicpola dengan * dan #"Kirim ke yang berminat pada kategori ini"
headerscocokkan header, bukan routing key"Kriterianya lebih dari satu dimensi"

Direct — Paling Sederhana

direct exchangetext
exchange "tugas" (direct)

  routing_key="prioritas.tinggi" ──> queue tugas.mendesak
  routing_key="prioritas.normal" ──> queue tugas.biasa

Beberapa queue boleh memakai binding key yang sama:
  queue A binding "laporan" ┐
  queue B binding "laporan" ┴──> keduanya menerima salinan

Bila beberapa konsumer menempel pada satu queue, pesan dibagi bergiliran di antara mereka — inilah pola work queue. Bila beberapa queue punya binding yang sama, masing-masing menerima salinan.

🎯 Perbedaan yang menentukan arsitektur
text
Satu queue, 3 konsumer  → beban DIBAGI       (1 pesan diproses 1 kali)
Tiga queue, 1 konsumer  → pesan DISALIN      (1 pesan diproses 3 kali)

Ingin menambah kapasitas? Tambah konsumer pada queue yang sama. Ingin menambah fitur yang bereaksi pada peristiwa yang sama? Tambah queue dengan binding baru.

Fanout — Siaran

Routing key diabaikan sepenuhnya. Setiap queue yang terikat menerima salinan. Cocok untuk pembatalan cache, notifikasi konfigurasi berubah, atau peristiwa yang semua layanan perlu tahu.

Topic — Yang Paling Sering Dipakai di Produksi

pola topictext
Routing key dipisah titik:  "pesanan.jakarta.dibuat"

  *  cocok dengan TEPAT SATU kata
  #  cocok dengan NOL ATAU LEBIH kata

Pola                        Cocok dengan
─────────────────────────── ──────────────────────────────────────────
pesanan.*.dibuat            pesanan.jakarta.dibuat        ✓
                            pesanan.dibuat                ✗ (kurang 1 kata)
                            pesanan.jakarta.utara.dibuat  ✗ (lebih 1 kata)

pesanan.#                   pesanan.dibuat                ✓
                            pesanan.jakarta.utara.dibuat  ✓
                            pesanan                       ✓ (# boleh nol kata)

#.dibuat                    pesanan.dibuat                ✓
                            pembayaran.jakarta.dibuat     ✓

#                           SEMUA pesan                   ✓
⚠️ Rancang routing key dari umum ke khusus

Urutan segmen menentukan pola apa yang mungkin ditulis nanti. Susun dari kategori terluas ke terkecil.

text
✅ <domain>.<wilayah>.<peristiwa>
   pesanan.jakarta.dibuat
   → bisa: pesanan.#          (semua tentang pesanan)
   → bisa: pesanan.jakarta.#  (semua di Jakarta)
   → bisa: *.jakarta.*        (semua domain di Jakarta)

❌ dibuat.pesanan.jakarta
   → tidak ada pola wajar untuk "semua tentang pesanan"

Batas teknis: maksimal 255 byte untuk routing key. Batas praktis: lebih dari empat segmen biasanya menandakan Anda memaksakan terlalu banyak informasi ke dalam satu string — pindahkan ke header.

Headers — Jarang Dipakai, Kadang Tepat

headers exchangetext
binding arguments:
  x-match = all      → semua header harus cocok (DAN)
  x-match = any      → salah satu cukup (ATAU)

binding:  { "x-match": "all", "format": "pdf", "prioritas": "tinggi" }
pesan  :  headers { "format": "pdf", "prioritas": "tinggi", "penulis": "ani" }
          → cocok (header tambahan diabaikan)

Headers exchange lebih lambat daripada topic karena tidak bisa memakai indeks trie. Pakai hanya bila kriterianya benar-benar multi-dimensi dan tidak masuk akal digabung ke dalam satu routing key.

Exchange Bawaan

NamaTipeKegunaan
"" (kosong)directRouting key = nama queue. Praktis, tetapi tidak bisa diperluas
amq.directdirectUntuk percobaan cepat
amq.fanoutfanoutUntuk percobaan cepat
amq.topictopicUntuk percobaan cepat
amq.rabbitmq.tracetopicFirehose tracer untuk debugging

Untuk produksi, buat exchange bernama sendiri. Exchange amq.* tidak bisa dihapus dan mencampur beberapa sistem di dalamnya membuat topologi sulit dilacak.

Alternate Exchange — Jaring Pengaman

alternate exchangebash
rabbitmqadmin declare exchange name=pesanan.tak-terkirim type=fanout durable=true
rabbitmqadmin declare queue    name=pesanan.tak-terkirim.q durable=true
rabbitmqadmin declare binding  source=pesanan.tak-terkirim destination=pesanan.tak-terkirim.q

rabbitmqadmin declare exchange name=pesanan type=topic durable=true \
  arguments='{"alternate-exchange":"pesanan.tak-terkirim"}'

Sekarang pesan yang tidak cocok dengan binding mana pun tidak lagi lenyap — ia jatuh ke queue khusus. Pasang alert bila queue itu tidak kosong, dan Anda akan tahu dalam hitungan menit ketika ada routing key baru yang belum ada bindingnya.

Exchange-to-Exchange Binding

Exchange boleh terikat ke exchange lain. Ini memungkinkan lapisan routing yang rapi: satu exchange penerima utama meneruskan ke beberapa exchange domain, tanpa producer perlu tahu strukturnya.

berlapistext
peristiwa (topic)
   ├── binding "pesanan.#"    ──> pesanan (topic)    ──> queue-queue pesanan
   ├── binding "pembayaran.#" ──> pembayaran (topic) ──> queue-queue pembayaran
   └── binding "#"            ──> audit (fanout)     ──> queue audit semua